空白で区切られたテキストデータの各行から、特定のフィールドを取り出すことができるのが「awk」コマンドです。指定したフィールドを取り出すには「cut」コマンドでも可能ですが、フィールド間の空白が一定でない場合は「awk」コマンドを使用します。
ここでは、awkコマンドを使った基本的なフィルタ方法について紹介します。
目次
動作環境>
この記事は、以下の環境で実行した結果を基にしています。他のディストリビューションやバージョンでは、動作結果が異なる場合があることをご了承ください。
# cat /etc/redhat-release
CentOS Linux release 7.4.1708
書式
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 }'
「$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
「||」は、OR条件です。
「&&」は、AND条件です。
あとがき
処理データが多いときは、headコマンドなどと組み合わせることで、あらかじめ処理データから不要な部分を取り除いた上でawkコマンドに引き渡し、より効率的な処理が可能です。