二度と忘れないawkコマンドの基本

結論としては、これだけ。

awkはテキストの各行に対して pattern { action } を実行する。

これだけ覚えれば間違えずに使える。

awk コマンドはテキスト整形に便利だが、使い方をよく忘れるのでいつもググっている。

使い勝手が悪いわけではないけど、多機能ゆえに使いこなすのが難しい気がする。

awkコマンドの簡単な使用例

こんな csv ファイルがあるとして、

$ cat user.csv
id,name,age
1,佐藤,19
2,伊藤,20
3,加藤,21

idの列だけを表示したいとする。そのための awk コマンドは、以下のようになる。

$ cat user.csv | awk -F ',' '{print $1}'
id
1
2
3

はい。オプション -F ',' でセパレータを指定しているのは良いとして、 '{print $1}' がなんか気持ち悪い。中括弧、誰やねんお前どこから来たんや。

awk は実はただのコマンドラインツールではなくチューリング完全スクリプト言語なので、文法が存在する。

シングルクォートで囲まれた {print $1} の部分は、awkスクリプトを書いているというわけ。だから中括弧 {} とかが出てくる。

文法は後回しにして、上記のコマンドの $1 を書き換えると、だいたい予想通りの動きをする。

$ cat user.csv | awk -F ',' '{print $0}'
id,name,age
1,佐藤,19
2,伊藤,20
3,加藤,21
$ cat user.csv | awk -F ',' '{print $2}'
name
佐藤
伊藤
加藤

awkコマンドの引数に中括弧が必要な理由

覚えるべき文法は一つ。

awkはテキストの各行に対して pattern { action } を実行する。

pattern にマッチする行に action を実行するということだ。実用上はこれだけ覚えておけば十分だと思う。

先程の {print $1} の意味もこれでわかる。 pattern が省略されているため、すべての行にprint $1 を実行する。つまり、セパレートされた一つ目の文字列を標準出力に出すということだ。

pattern には正規表現や条件式が使える。

いろいろな例

  • 2行目以降を出力する

変数 NR は現在の行番号。

cat user.csv | awk -F ',' 'NR > 1 {print $0}'
1,佐藤,19
2,伊藤,20
3,加藤,21
  • 年齢(3番目のフィールド)が20以上の行のidを出力する
$ cat user.csv | awk -F ',' '$3 >= 20 {print $1}'
id
2
3
  • 名前に文字 を含む行を出力する

正規表現/藤/正規表現の比較演算子~

$ cat user.csv | awk -F ',' '$2 ~ /藤/ {print $0}'
1,佐藤,19
2,伊藤,20
3,加藤,21