【Linux】awkコマンド入門、使い方

Linuxコマンド シェル

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だけ覚えておけばひとまず問題ない
タイトルとURLをコピーしました