awk(オーク)コマンドはプログラム言語のひとつで、ファイルやコマンドの出力結果から文字列を取り出したり、検索したりすることができます。
awkコマンドはif文やfor文などの制御文や数値演算などもできますが、本が1冊書けるくらい多くの機能があるため、ここでは代表的な使い方を説明します。
ファイルから指定カラムを取り出す
特定の区切り文字があるテキストファイルから指定したカラムを取得するには、以下のようにします。
区切り文字は、,(カンマ)や:(コロン)、;(セミコロン)などです。
なお、区切り文字が空白の場合は、-Fオプションは不要です。
printの後ろの番号は、取得したいカラムの先頭からの順番です。
先頭カラムを取得する場合は、$1と書きます。
awk -F"区切り文字" '{ print $番号,$番号… }' ファイル名
以下の例は、/etc/passwdの1カラム目と3カラム目を取り出しています。
メモ
/etc/passwdファイルは、:(コロン)で区切られています。
実行例
$ awk -F":" '{ print $1,$3 }' /etc/passwd
root 0
bin 1
deamon 2
(以下略)
コマンドの出力結果から指定カラムを取り出す
他のコマンドの出力結果から指定したカラムを取得するには、以下のようにします。
別コマンド | awk -F"区切り文字" '{ print $番号,$番号… }'
以下の例は、psコマンドを使ってプロセス一覧を表示して、その中から1カラム目、2カラム目、8カラム目を取り出しています。
また、psコマンドの出力は空白が区切り文字になっているので、-Fオプションは不要です。
実行例
$ ps -f | awk '{ print $1,$2,$8 }'
ec2-user 11192 -bash
ec2-user 11375 ps
ec2-user 11376 awk
awkの中でif文を使う
awkコマンドの中で、if文を使うことができます。
awk -F"区切り文字" '{ if ($番号 == "値") print $番号,$番号... }' ファイル名
以下の例は、/etc/passwdの4カラム目(グループID)が0の行を取り出します。
「print $0」と書くことで、1行全てを表示します。
実行例
$ awk -F":" '{ if ($4 == "0") print $0 }' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
文字列を検索する
awkコマンドは文字列を検索することができます。
awk '/文字列/ { print $番号,$番号... }' ファイル名
以下の例は、/etc/passwdファイルからmailを含む行を出力しています。
実行例
$ awk '/mail/ { print $0 }' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
|(パイプ)を使って複数文字列の検索もできます。
以下の例は、/etc/passwdファイルからmailとoperatorを含む行を出力しています。
実行例
$ awk '/mail|operator/ { print $0 }' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
検索文字列が含まれる行数をカウントする
awkコマンドは変数を使って指定した文字列が含まれる行数をカウントすることができます。
BEGINは前処理、ENDは後処理です。
awk 'BEGIN { 変数定義 } /文字列/ { 行数カウント } END { print 変数 }' ファイル名
以下の例は、/etc/passwdファイルからbinが含まれる行をカウントして行数を出力します。
実行例
$ awk 'BEGIN { arg = 0 } /bin/ { arg++ } END { print arg }' /etc/passwd
24