LIVE SIMPLY

データ活用組織のマネジメントを行いつつコーチング、本など学んだことを書くblog

【勉強メモ】awk

AWK とは Aho, Weinberger, Kernihan の 3 名が作成したテキスト処理に特化した言語
以前は grep, sed と並んで UNIX の「三種の神器」とまで呼ばれていたころもあるみたいです。

これまで、ぐぐったり人に聞いたりしながらやっていたawk
調べたことをメモしておこう。
ちなみにawkgawk の違い。
オリジナルの AWKGNU 独自の拡張を行ったものらしい。いくつか機能が拡張されており、現在は GNU 版である gawk が主流とのことなので、gawkがインストールされているならgawkを使っとけば間違いなさそう。

参考:
gawk とは/What's gawk?
AWK

元は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