はじめに
awkコマンドを使った「文字列の加工」や「数値の集計方法」について記載します。
コマンド例
コマンドに日付/時刻を付与
vmstatコマンドに日付/時刻を付与してみます。
通常のvmstatコマンドだと以下のように出力されます。
$vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 124992 60628 16 374504 0 0 2 4 2 4 0 0 98 0 2
0 0 124992 60628 16 374504 0 0 0 0 121 212 0 0 100 0 0
0 0 124992 60588 16 374504 0 0 0 0 120 221 0 0 98 0 1
$
以下のようにパイプでawkコマンドを繋げると、行頭に日付/時刻が付与されます。
$vmstat 1 3 | awk '{ print strftime("%Y/%m/%d %H:%M"), $0 }'
2021/07/22 00:40 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
2021/07/22 00:40 r b swpd free buff cache si so bi bo in cs us sy id wa st
2021/07/22 00:40 1 0 124992 60008 16 374724 0 0 2 4 2 4 0 0 98 0 2
2021/07/22 00:40 0 0 124992 59944 16 374724 0 0 0 0 129 227 0 0 99 0 0
2021/07/22 00:40 0 0 124992 59944 16 374724 0 0 0 80 145 246 0 0 100 0 0
$
数値の集計
例えば以下のファイルがあったとします。
$ cat test.log
aaa 10
aaa 20
bbb 30
bbb 40
ccc 50
ccc 60
$
最大値を出力
$ cat test.log | awk -F' ' '{if(m<$2) m=$2} END{print m}'
60
$
最小値を出力
$ cat test.log | awk -F' ' 'BEGIN{m=100000}{if(m>$2) m=$2} END{print m}'
10
$
合計値を出力
$ cat test.log | awk -F' ' '{m+=$2} END{print m;}'
210
$
項目ごとの合計値を出力
$ cat test.log | awk -F' ' '{ sum[$1]+=$2; }END{for(key in sum)print key","sum[key];}'
aaa,30
bbb,70
ccc,110
$
平均値を出力
$ cat test.log | awk -F' ' '{m+=$2} END{print m/NR;}'
35
$
文字列の抜き出し
文字列「abcde」より、2文字目から3文字抜き出す場合は以下のようにします。
$ echo 'abcde' | awk '{print substr($0, 2, 3)}'
bcd
$