COMPUTER LINUX

【Linux】awkを使ったテキスト処理

 

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

 

-COMPUTER, LINUX
-