[bash]awkを使ってログや出力結果を弄ろう

bash

20年くらい前はawk使うと重くなるからなるべく使わないようにしてたのですが、最近はサーバの性能いいからさほど気にしなくて良くなったな〜。
ファイルや出力結果を行単位で解析、変換するのに便利です。
ガッツリやったらそれだけで1冊の本になるそうなので、よく使ってるのだけ紹介します。

1. 数値変換 ($x+0)

$x+0 は文字列として認識される可能性があるフィールドを数値に変換してくれます。
よく使ってるのは df の結果から使用率がx%以上のファイルシステムを取り出すとかに使ってます。

■コマンド例
# df -h | awk '$5+0 > <しきい値> {print $0}'

■例(使用率が80%以上のものだけ出力する)
# df -h | awk '$5+0 > 80 {print $0}'
/dev/mapper/vg000-lv005 10G 8.1GB 1.9GB 81% /work
  • $5+0 によって、第5フィールドが数値として扱われます。
  • 数値といて扱われた第5フィールドがしきい値(80%)より大きい「/work」が出力されます。

2. フィールド操作

2.1 フィールドの指定

$xを指定して、必要なフィールドだけ出力します。
$0は行全体となり、末尾のフィールドは$NFを指定し、決まったフィールドは$x($1,$2,$3 …)と数字で指定します。
複数指定する場合は「,」で区切ります。また、フィールドは順番を前後させても良いし、複数指定もできます。

■コマンド例
# df -h | awk '$5+0 > <しきい値> {print $NF,$5}'

■例
# df -h | awk '$5+0 > 80 {print $NF,$5}'
/work 81%
  • 数値変換と同様に80%以上のものを取得しますが、出力結果をマウントポイント(末尾のフィールド:$NF)と使用率(第5フィールド:$5)の順で出力します。

2.2 フィールド間の文字列指定

フィールド間はスペースで区切られますが、別の文字列を指定することもできます。
この場合は区切り文字「,」は不要です。

■コマンド例
# df -h | awk '$5+0 > <しきい値> {print $NF " : " $5}'

■例
# df -h | awk '$5+0 > 80 {print $NF " : " $5}'
/work : 81%
  • 数値変換と同様に80%以上のものを取得し、出力結果をマウントポイントと使用率を「 : 」で区切って出力します。

2.3 フィールドセパレータ(区切り文字)の指定

デフォルトの区切り文字(セパレータ)は空白文字となります。
・スペース
・タブ
・連続したスペース
このセパレータはFオプションかFS変数を指定することで変更できます。

Fオプションで指定

CSVファイルは「,(カンマ)」で区切られていることが多いので、これを例にします。

以下の例では「 -F “,” 」 でセパレータを変更して、第2フィールドと第3フィールドを「”:”」で区切って出力します。

■sample.csv
#No,Name,ID
1,Ushio,ush
2,Tora,tr

■コマンド例
# awk -F "," '{ print $2 ":" $3 }' sample.csv

■出力例
Ushio:ush
Tora:tr
FS変数で指定

awkスクリプトのBEGINブロックでFSを指定します。
Fオプションと同様の動きですが、参考です。

■sample.csv
#No,Name,ID
1,Ushio,ush
2,Tora,tr

■コマンド例
# awk '{BEGIN FS=","} { print $2 ":" $3 }' sample.csv

■出力例
Ushio:ush
Tora:tr
OFS変数で出力のセパレータ指定

FSと同様に、awkスクリプトのBEGINブロックでOFSを指定します。
デフォルトはスペースとなるものを別の文字列に変更できます。

■sample.csv
#No,Name,ID
1,Ushio,ush
2,Tora,tr

■コマンド例
# awk '{BEGIN FS=","; OFS=":"} { print $2 , $3 }' sample.csv

■出力例
Ushio:ush
Tora:tr

3.BEGINとENDブロック

上で少し使ってますが、BEGINENDで処理の前後に特定の処理を実行できます。

■sample.txt
moshiri-note bash-letsuseawk

■コマンド例
# awk '{BEGIN print "Start"} { print $1 } {END print "End"}' sample.csv

■出力例(ヘッダーとフッターを追加)
Start
moshiri-note
End

コメント

タイトルとURLをコピーしました