条件に合致するファイルの抽出やほしい項目だけ表示するなどで多用する
下記のテキストファイルについて
$ 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を覚えなおす必要はない。
|