コマンド出力から特定のカラムを抽出したい

以下のような連続するスペースで整形されたデータから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

具体例

dfpsのように連続するスペースで整形されたコマンド出力との組み合わせで特に役立つ。 例えばディスク使用率とマウント先だけを表示するには、df -hの出力をパイプでawkに渡す。

$ df -h | awk '{print $5, $6}'
Use% Mounted
40% /
0% /dev
0% /dev/shm

参考