エンジニアを目指す初学者に向けて、わかりやすく解説したブログです。
サイトをリニューアルしました

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

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