View on GitHub

Today I Learned

Software Engineering Blog

awk

awk '/正規表現/'grep '正規表現'と同じ意味になる

$ seq 5 | awk '/[24]/'
2
4

読み込んだ値は$1に入る

$ seq 5 | awk '$1%2==0'
2
4

awk '条件{処理}条件{処理}'のように2つ以上の条件と処理を書くことができる。

以下の2つ目のルールは$1%2==1と書いてもいいが、C言語と同様、非ゼロは真なので省略。

$ seq 5 | awk '$1%2==0{print $1, "Even"}$1%2{print $1,"Odd"}'
1 Odd
2 Even
3 Odd
4 Even
5 Odd

BEGINはawkが1行目の処理を始める前、ENDはawkが最終行の処理を終えた後、の状況にマッチする。

awk 'BEGIN{事前処理}条件{処理}条件{処理}END{事後処理}'

$ seq 5 | awk 'BEGIN{a=0}$1%2==0{print $1, "Even"}$1%2{print $1,"Odd"}{a+=$1}END{print "Sum", a}'
1 Odd
2 Even
3 Odd
4 Even
5 Odd
Sum 15

NF(Number of Fields)で列数を取得できる

$ cat access.log | awk -F: '{print $(NF-2)}' | awk '$1<12{print "Morning"}$1>=12{print "Evening"}' | sort | uniq -c
   3 Evening
   2 Morning

awk '/開始パターン/,/終了パターン/'で、開始パターンでマッチする行から終了パターンにマッチする行までを抽出できる。

$ cat log_range.log | awk '/24\/Dec\/2016 21:..:../,/25\/Dec\/2016 03:..:../'
192.168.77.248 - - [24/Dec/2016 21:12:20] "GET / HTTP/1.0" 200 4294
192.168.152.143 - - [24/Dec/2016 22:06:19] "GET / HTTP/1.0" 200 7255
192.168.6.132 - - [24/Dec/2016 23:00:42] "GET / HTTP/1.0" 200 4298
192.168.222.3 - - [25/Dec/2016 00:03:23] "GET / HTTP/1.0" 200 8547
192.168.101.95 - - [25/Dec/2016 01:01:40] "GET / HTTP/1.0" 200 8488
192.168.141.18 - - [25/Dec/2016 02:15:52] "GET / HTTP/1.0" 200 4533
192.168.110.169 - - [25/Dec/2016 03:06:54] "GET / HTTP/1.0" 200 3461