Linuxコマンド:フィルタテクニック(awk)

空白で区切られたテキストデータの各行から、特定のフィールドを取り出すことができるのが「awk」コマンドです。指定したフィールドを取り出すには「cut」コマンドでも可能ですが、フィールド間の空白が一定でない場合は「awk」コマンドを使用します。

ここでは、awkコマンドを使った基本的なフィルタ方法について紹介します。

動作環境

この記事は、以下の環境で実行した結果を基にしています。他のディストリビューションやバージョンでは、動作結果が異なる場合があることをご了承ください。

cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

書式

awk [オプション] [コマンド] [ファイル……]

基本的な記述方法

awk '(パターン) {アクション}' ファイル名

テキストデータ(テキストファイル、もしくは標準入力に渡されたテキストデータ)を1行ずつ読み、パターンに一致する行に対してアクションを実行します。

使用例

指定したパターンに一致する行を取り出す

「ls -l」の出力で、5フィールド目(ファイルサイズ)が、1000000(約1MB)以上の行を取り出すには

ls -l | awk '($5 >= 1000000) { print }'

sample.txtの1行目を取り出すには

awk '(NR == 1){ print }' sample.txt

「ls -l」の出力で、行頭が「l」から始まる行(シンボリックリンク)を取り出すには

ls -l | awk '(/^l/) { print }'
Memo

「$x」は、x番目のフィールドを意味しています。

「NR」は、行番号を意味しています。

「/正規表現/」とすることで、パターンを正規表現で記述できます。

指定したフィールドを取り出す

sample.txtの各行で、2フィールド目を取り出すには

awk '{ print $2 }' sample.txt

sample.txtの1行目で、2フィールド目を取り出すには

awk '(NR == 1){ print $2 }' sample.txt

sample.txtの各行で、フィールドの順番を入れ替えて取り出すには

awk '{ print $3,$1,$2 }' sample.txt

複数のパターンを指定する

sample.txtの1行目および9行目で、1フィールド目を取り出すには

awk '(NR == 1 || NR == 9){ print $1 }' sample.txt

sample.txtの6行目から8行目で、1フィールド目を取り出すには

awk '(NR > 5 && NR <= 8){ print $1 }' sample.txt

Memo

「||」は、OR条件です。

「&&」は、AND条件です。

まとめ

処理データが多いときは、headコマンドなどと組み合わせることで、あらかじめ処理データから不要な部分を取り除いた上でawkコマンドに引き渡し、より効率的な処理が可能です。

スポンサーリンク