As rookie

ルーキーインフラエンジニアがインフラのこと以外も結構書いてしまうブログ

POSIX1日1コマンド[part5]: awk

mokicks.hatenablog.com

詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。

awk

awk

とりあえず使ってみる

$ ls -la
total 0
drwxrwxr-x. 2 vagrant vagrant 45 Feb 26 01:55 .
drwxrwxr-x. 5 vagrant vagrant 51 Feb 26 01:53 ..
-rw-rw-r--. 1 vagrant vagrant  0 Feb 26 01:54 a.txt
-rw-rw-r--. 1 vagrant vagrant  0 Feb 26 01:54 b.txt
-rw-rw-r--. 1 vagrant vagrant  0 Feb 26 01:54 c.txt

$ls -la | awk '{ print "owner is " $3 ", filename is "$9 }'

owner is , filename is 
owner is vagrant, filename is .
owner is vagrant, filename is ..
owner is vagrant, filename is a.txt
owner is vagrant, filename is b.txt
owner is vagrant, filename is c.txt

ざっくり使い方

awk [-F sepstring] [-v assignment]... program [argument...]

awk [-F sepstring] -f progfile [-f progfile]... [-v assignment]...
       [argument...]

ざっくりDESCRIPTION

パターンをスキャンし処理するプログラム言語の一つ。テキストデータの処理に特化している。一連のパターンと対応するアクション。パターンと一致する入力が読み取られると、そのパターンに関連付けられたアクションが実行される。

入力は一連のレコードとして認識される。デフォルトでは、レコードは行で、改行で終了します。ですがこれは、RS という組み込み変数を使うと変更することができます。

入力の各レコードは、順番にプログラムの各行と照合される。一致した各行は、関連するアクションを実行しなければならない。
awkは各入力のレコードを一連のフィールドとして解釈する。デフォルトでのフィールどの文字列は、「空白」、「改行」以外の文字です。このデフォルトの「空白」、「改行」という区切り文字は、FS という組み込み変数、もしくは -F オプションで変更できる。

レコードのフィールドは、最初の文字から $1 $2 ... で使えます。
また、$0 はレコード全体を示します。他のフィールドを設定すると $0 の再評価が行われる。$ 0に代入すると、他のすべてのフィールドとNF組み込み変数の値がリセットされる。

ざっくりOPTION

  • -F
    • フィールド区切り文字を定義します。ただし、-F <区切り文字>と-v FS = <区切り文字>の両方が使用されている場合、-F <区切り文字>からのFS割り当てがコマンド行順で処理されるか、最後の-v FS = <区切り文字>の後で処理されるかは不特定です。
  • -f progfile
    • awkプログラムを含むファイルプログラムファイルのパス名を指定します。 ' - 'が指定された場合は、標準入力を示すものとする。このオプションの複数のインスタンスが指定された場合、指定された順序でプログラムファイルとして指定されたファイルの連結は、awkプログラムになります。 awkプログラムは、代わりにコマンドラインで1つの引数として指定することもできます。
  • -v assignment
    • 代入引数が代入オペランドと同じ形式であることを保証しなければならない。指定された変数の割り当ては、BEGINパターン(もしあれば)に関連するアクションを含む、awkプログラムを実行する前に行わなければならない。このオプションの複数の出現を指定することができます。

ざっくりOPERANDS

awk programfile

ざっくりまとめ

awkは行区切りで表示されるデータの一部の値を取得したいときや使いたいときに非常に便利なコマンドですね。-F だけでも覚えておけば、日々の業務を楽にできる可能性があります。

$cat sample.csv
1,dog,200
2,cat,300
3,bird,50
4,cow,400
5,rabbit,200

$cat sample.csv | awk -F ',' '{ print $2 }'
dog
cat
bird
cow
rabbit

2番目のフィールの動物の名前を取得した。

上記例の通り、CSVなど特定の区切り文字が利用されているデータにはもってこいじゃないでしょうか。

そしてawkは奥が深いのでさらに深く知りたい人は、

sed & awkプログラミング 改訂版 (A nutshell handbook)

sed & awkプログラミング 改訂版 (A nutshell handbook)

これを買いましょう。