コマンド出力から特定のカラムを抽出したい
以下のような連続するスペースで整形されたデータから2列目だけを取得したい。
alice 25 Tokyo
bob 3 Osaka
charlie 31 Nagoya
cutコマンドはスペース区切りを指定しても、連続するスペースを1つの区切りとして扱えない。
スペース1つごとにフィールドが区切られるため、2列目を指定しても空文字列が返る。
$ cut -d" " -f2 users.txt
awkコマンドで特定のカラムを抽出する
awkはデフォルトで連続するスペースやタブをまとめて1つの区切りとして扱う。
2列目を抽出するには{print $2}を指定する。
$ awk '{print $2}' users.txt
25
3
31
$1が1列目、$2が2列目を表す。$0は行全体を表す。
複数のカラムを抽出するには、カンマ区切りで並べる。
$ awk '{print $1, $3}' users.txt
alice Tokyo
bob Osaka
charlie Nagoya
最後のカラムを抽出する
NFは行内のフィールド数を表す組み込み変数である。
$NFで最後のカラム、$(NF-1)で後ろから2番目のカラムを抽出できる。
$ awk '{print $NF}' users.txt
Tokyo
Osaka
Nagoya
$ awk '{print $(NF-1)}' users.txt
25
3
31
cutコマンドで後ろから数えたフィールドを取得するにはrevコマンドとの組み合わせが必要だった。
詳細はcutコマンドで後ろからn番目を取得する
を参照。
awkであれば$NFだけで完結する。
区切り文字を指定する
CSVのようにスペース以外で区切られたデータには、-Fオプションで区切り文字を指定する。
alice,25,Tokyo
bob,3,Osaka
charlie,31,Nagoya
$ awk -F',' '{print $2}' users.csv
25
3
31
具体例
dfやpsのように連続するスペースで整形されたコマンド出力との組み合わせで特に役立つ。
例えばディスク使用率とマウント先だけを表示するには、df -hの出力をパイプでawkに渡す。
$ df -h | awk '{print $5, $6}'
Use% Mounted
40% /
0% /dev
0% /dev/shm
参考
\第一線のプログラマーの行動原理を学べる!/
