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