awk を使ってみよう!

テキスト編集ならお任せ〜目指せawkマスター。


awkとは

□パターン検索処理言語。
□テキストデータ編集に絶大な威力を発揮。
□使えるとかなりカッコいい!(自評)
□しかもとても便利!(公表)
□機能は多岐にわたり、awkコマンド説明だけの本があるほど奥が深い。

まずは、簡単&使える機能を覚えていき、マスターを目指せばいいと思う。
ちなみに俺的awkレベルは7程度。スライムぐらいはへっちゃら〜(意味不明)。


コマンド形式

awk <パターン> { <コマンド> }
与えられたテキストデータのうち、パターンに該当する情報(行)に対してのみ、コマンドを実行する。


パターン記述方法

正規表現指定/regexp/regexp(regular expression,正規表現)にマッチする
フィールド値指定$1==100第1フィールドの値が100
フィールド値正規表現指定$2 ~ /regexp/第2フィールドの値がregexp(regular expression,正規表現)にマッチする
フィールド長指定length($2) == 200第3フィールドの長さが200である
※パターンを記述しないと、全ての行を対象とすることになる。


コマンド記述方法

print文:
printf("%s\n",$x)   第xフィールドの値を出力

if、forなどの制御構造記述もできる(割愛)。


主なシステム変数

変数名内容
$0レコード全体の内容
$n第nフィールドの内容
$NF最後のフィールドの内容
NR現在まで読み込んだレコード(行)数
NF現在処理しているレコード(行)のフィールド数
FSフィールドの区切り文字
OFS出力フィールドの区切り文字
FNR現在処理しているレコード番号(行数)
FILENAME処理しているファイル名


スクリプトサンプル

イロイロ試して使ってみるといいんだと思う。

サンプル1:swapinfoの結果の各項目をそれぞれ変数に格納。
/usr/sbin/swapinfo > swapinfo_temp.log
swapinfo[0]=`cat swapinfo_temp.log | awk 'NR==1 {printf("%s\n",$2)}'`
swapinfo[1]=`cat swapinfo_temp.log | awk 'NR==3 {printf("%s\n",$3)}'`
swapinfo[2]=`cat swapinfo_temp.log | awk 'NR==5 {printf("%s\n",$4)}'`


サンプル2:ps -elの結果から、各ユーザごとのメモリ利用量(SZ)合計を取得。
ps -el > ${WORK}/ps_temp.log
cat ps.log | awk '{printf("%s\n",$3)}' | sort | uniq | grep -v UID > ps_uid.lst
for i in `cat ps_uid.lst`
do
  USERNAME=`cat /etc/passwd | awk -F: '($3=='${i}') {printf("%s\n",$1)}'`
  cat ${WORK}/ps_temp.log | awk '($3=='${i}') {printf("%s\n",$10)}' > ps_${i}_temp.log

  TOTAL=0
  for j in `cat ps_${i}_temp.log`
  do
    TOTAL=`expr ${TOTAL} + ${j}`
  done

  echo ${USERNAME},${TOTAL}
done