AWK探訪
インフラ周りの作業が多くなるにつれて、シェルスクリプトを書く機会が増えてるので非業務時間にちょと触るかーというのでUSP MAGAZINEなるものを買ってみた。AWKとか普段は本当に簡単なことにしか使ってないし良い機会である。この投稿の内容は基本的にAWK処方箋を実際に動かしただけのものです。新しい発見を期待して読まないでください。
準備
$ brew install gawk
AWKの真偽値
- 偽: 数字の0、空文字列
- 真: 上記以外
$ echo foo | gawk '0' # 0は偽なので出力なし echo foo | gawk '""' # 空文字列は偽なので出力なし $ echo foo | gawk '1' # 1は真なのでパイプされたfooがそのまま出力される foo $ echo foo | gawk '"0"' # "0"は文字列なので真。なのでfooが出力される foo
比較
$ echo foo | gawk '0 == 0' # 0は偽だけど、0 == 0は真なのでfooが出力される foo $ echo foo | gawk '/foo/' # 正規表現fooに一致するのでfooが出力される foo
代入
ここまでは分かってたんだけど、代入演算子は普段使っていないので発見だった。
正確には代入の戻り値が何か、だけど。
echo one two three | gawk '$2 = "bar"' one bar three echo one two three | gawk '$2 = ""' # 空文字列が戻り値になるので偽 (何も表示されず...)
後者の理由が、代入の戻り値は左辺値であるのは知らなかった。なので、もし表示させたい場合は次のように書けばよい。
echo one two three | gawk '!($2 = "")' # 戻り値の偽を反転させて真にする one three echo one two three | gawk '$2 = ""; 1' # 強引かな... one three
書くの疲れたのであと1つだけ面白いなと思ったことを。
タブ or スペースだけの行を削除する。
$ echo -e "\n a b c \n \n d" | gawk 'NF' # NF(number of fields)が0の所は偽になるので出力されない a b c d
最後のTIPSは覚えておこう