awkコマンド
システム管理者 Unixパワーユーザのためのコマンドリファレンス

[ Linux / Unix リファレンスガイド ] ⇒ [ コマンドリファレンス ] ⇒ [ awkコマンド ]



awk

もともとはUnixのコマンドだったが、文字列加工に適したプログラミング言語へと進化をとげ、現在ではawk単体でプログラムを書いてアプリケーションソフトを開発することができる。列の抽出や並び替えなどで魅力を発揮する。詳しい使い方はAWKワンライナーで検索すると良い。また、文字の切り出しや加工は cut コマンドも簡単に代用できるので、併せて使用を検討されたい。

オプション
F 区切り文字を指定する
- -

使用例
条件に合致するファイルの抽出やほしい項目だけ表示するなどで多用する

下記のテキストファイルについて
$ cat chr.txt
111 222 333 444 555
111 222 333 444 555
111 222 333 444 555

◆2列目のみ表示する
$ cat chr.txt | awk '{print $2}'
222
222
222

◆4列目、3列目、2列目を抽出し並び替える
$ cat chr.txt | awk '{print $3,$4,$2}'
333 444 222
333 444 222
333 444 222

下記のテキストファイルについて
$ cat chr2.txt
111 111 111
222 222 222
333 333 333
444 444 444
555 555 555

◆2行目を抜き出す
$ cat chr2.txt | awk 'NR==2 { print }'
222 222 222

下記ディレクトリで
$ ls -l
-rw-r--r-- 1 oskp oskp 80 Aug 10 21:13 chr.txt
-rw-r--r-- 1 oskp oskp 60 Aug 10 21:24 chr2.txt
-rw-r--r-- 1 oskp oskp 10 Aug 10 21:46 chr3.txt

◆ls -lの結果より5列目(ファイルサイズ)が50(バイト)以上の行全体($0)を抜き出す
$ ls -l | awk '$5>=50 {print $0}'
-rw-r--r-- 1 oskp oskp 80 Aug 10 21:13 chr.txt
-rw-r--r-- 1 oskp oskp 60 Aug 10 21:24 chr2.txt

◆ls -lの結果より5列目(ファイルサイズ)が50(バイト)以上の行の9列目(ファイル名)を抜き出す
$ ls -l | awk '$5>=50 {print $9}'
chr.txt
chr2.txt

※テキストファイルの調査やコマンドプロンプトの使い勝手が格段に向上する。

◆区切り文字の変更(Fオプション)
下記の半角スペース区切りのデータ

$ cat testdata
aa bb test@mail.local 001 002
cc dd test2@test.local 003 004

からメールアドレスのドメイン名(@より後の部分)のみを抽出したい

$ cat testdata | awk -F@ '{print $2}'
mail.local 001 002
test.local 003 004

上記から、再度 awk で処理してやれば良い
$ cat testdata | awk -F@ '{print $2}' | awk '{print $1}'
mail.local
test.local

以上、DBからエクスポートしたデータやCSVの処理、ログの抽出等で大変便利。しかし、すでに perl をマスターしている人はあえてawkを覚えなおす必要はない。


関連項目
cut awkと似たような処理をすることが可能。固定長データなども簡単に処理できる。
- -