【勉強メモ】awk
AWK とは Aho, Weinberger, Kernihan の 3 名が作成したテキスト処理に特化した言語
以前は grep, sed と並んで UNIX の「三種の神器」とまで呼ばれていたころもあるみたいです。
これまで、ぐぐったり人に聞いたりしながらやっていたawk。
調べたことをメモしておこう。
ちなみにawk と gawk の違い。
オリジナルの AWK に GNU 独自の拡張を行ったものらしい。いくつか機能が拡張されており、現在は GNU 版である gawk が主流とのことなので、gawkがインストールされているならgawkを使っとけば間違いなさそう。
元はnetstatのデータ。
$ head -5 netstat.txt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 2437/hpiod
tcp 0 0 0.0.0.0:649 0.0.0.0:* LISTEN 2163/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2126/portmap
これをawkで処理してみる。
■複数カラムを取り出し、空白を入れる
$1と$2をカンマ , で区切っておくと、適当に空白を入れてくれる。
$ awk '{print $1,$2;}' netstat.txt | head -5
Active Internet
Proto Recv-Q
tcp 0
tcp 0
tcp 0
分割された行のデータをそれぞれをフィールドと言 います。またこのフィールドのひと固まりである各行をレコードと呼ぶ。
■行番号を追加して表示する → NR(組み込み変数)を利用
$ awk '{print NR,$1,$2;}' netstat.txt| head -5
1 Active Internet
2 Proto Recv-Q
3 tcp 0
4 tcp 0
5 tcp 0
ちなみに
$0はレコード全体、つまり元のデータ行そのものとなるから、
次のようにすることで行番号を振ることも可能(cat -n netstat.txtと同じ)。
$ awk '{print NR,$0;}' netstat.txt | head -5
1 Active Internet connections (servers and established)
2 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
3 tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 2437/hpiod
4 tcp 0 0 0.0.0.0:649 0.0.0.0:* LISTEN 2163/rpc.statd
5 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2126/portmap
■3行目のみを取り出す
※ちょっと書き方に注意
$ awk 'NR==3 {print NR $0;}' netstat.txt | head -5
3tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 2437/hpiod
■データの並べ替え
$ awk '{print $1,$2,$3;}' netstat.txt | head -5
Active Internet connections
Proto Recv-Q Send-Q
tcp 0 0
tcp 0 0
tcp 0 0
↓
$ awk '{print $3,$2,$1;}' netstat.txt | head -5
connections Internet Active
Send-Q Recv-Q Proto
0 0 tcp
0 0 tcp
0 0 tcp
■