awkコマンドいろいろ

IT技術

はじめに

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
$
タイトルとURLをコピーしました