二度と忘れない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