awkコマンドは簡単に言うと、表形式のデータに対して様々な加工や編集を行う作業を得意としている。
スペース、タブ、カンマなどの区切り文字によって整理されたデータを扱うことができ、
対象データから要素の抽出、整形、簡単な演算などを行うことができる。
実際の業務では、下記のような場面で使うことが多い。
- csv、tsvデータから要素の抽出
- ログファイルから特定の項目
- 他のコマンドと組み合わせて、ログファイルからログの集計を行う
grep
コマンドが横(行)の抽出に優れているのに対し、awk
コマンドは縦(列)の抽出に優れている。
書式
私がよく使う書式は以下の通りだ。
grepもawkも一旦catでファイルの中身を出力し、パイプで繋げるのが好み。
(個人的に理解しやすい)
$ cat 対象ファイル名 | awk '条件や出力などの処理'
特定の列を出力する
特定の列を出力するにはprint
を使う。
$ cat fruits.txt
apple 100
banana 200
orange 300
上記のような半角スペース区切りのファイルがあり、
このファイルに対して果物の名前(1フィールド目)のみを出力したい場合
以下のような記述になる。
$ cat fruits.txt | awk '{print $1}'
apple
banana
orange
$0
:全て$1
:1フィールド目$2
:2フィールド目
複数のフィールド出力や、任意の文字列を付与することも可能。
$ cat fruits.txt | awk '{print "hoge", $1, $2}'
hoge apple 100
hoge banana 200
hoge orange 300
少し書き方が独特で戸惑うかもしれないが、
awkで処理する内容はシングルクォーテーション「'
」で囲み、
出力するときは「{}
」で囲んだ上でprint
する、と覚えておけば良い。
区切り文字を指定する
awkコマンドで利用されるデフォルト区切り文字は
- タブ
- 半角スペース
である。
$ cat fruits.csv
name,price
apple,100
banana,200
orange,300
上のようなcsvファイルがあった場合、-F
オプションで区切り文字を指定することができる。
$ cat fruits.csv | awk -F ',' '{print $1}'
name
apple
banana
orange
区切り文字にはコロン「:
」なども指定できる上に、
任意の文字列でも指定することができる。(なんでもあり)
抽出条件を指定する
awkコマンド単体でも抽出条件を指定することができる。
大抵の場合はawk前にgrepで抽出すれば良いが、特定のフィールドに対して
ピンポイントで条件を指定したい場合、awkを使った方がスッキリする。
# 価格(2フィールド目)が100のフルーツの名前(1フィールド目)を出力する
$ cat fruits.txt | awk '$2 == 100 {print $1}'
apple
まとめ
- 成果ファイル、ログファイルなどの表形式データに強い
- 行のフィルターは
grep
、列のフィルターはawk
を使うと良い - オプションは区切り文字を指定する
-F
だけ覚えておけばひとまず問題ない