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だけ覚えておけばひとまず問題ない