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