連載
» 2017年06月02日 05時00分 UPDATE

Linux基本コマンドTips(115):【 awk 】コマンド(基本編)――テキストの加工とパターン処理を行う

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、テキストのパターン処理を行う「awk(gawk)」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

連載目次

 本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、テキストのパターン処理を行う「awk(gawk)」コマンドです。

awk(オーク)コマンドとは?

 「awk」は空白などで区切られたテキストを処理するコマンドです。演算機能もあり、プログラミング言語としても使用されています。

 Linux環境で使用されているのは、GNUプロジェクトによる「gawk」コマンドが多く、例えばCentOS 7の場合、awkは/usr/bin/gawkへのシンボリックリンクとなっています。

 Ubuntu 15では、Michael D. Brennan氏による「mawk」が収録されています(awkは/etc/alternatives/awkへの、/etc/alternatives/awkは/usr/bin/mawkへのシンボリックリンク)。

 どちらも、もともとのawkに加えてPOSIX 1003.2への準拠や組み込み変数、正規表現指定のバリエーションなどが拡張されています。



awkコマンドの書式

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

※[ ]は省略可能な引数を示しています





awkの主なオプション

短いオプション 意味
-f ファイル名 awkスクリプトが書かれたファイルを指定する
-F 区切り文字 区切り文字を指定する(デフォルトは空白文字)
-v 変数名=値 変数を定義する

※gawk(GNU版awk)の場合、長いオプションも使用可能。-fは--file program-file、-Fは--field-separator、-vは--assign。gawkにはこの他にも多数のオプションがある。



awkで使用できる主な組み込み変数

変数名 意味
ARGC 引数の個数
ARGV 引数(配列)
ENVIRON 環境変数を収めた連想配列。例えば環境変数LANGならばENVIRON["LANG"]と参照できる
FILENAME 現在処理しているファイルの名前
FNR 現在処理しているファイルのレコード番号(処理しているファイルが1つの場合はNRと同じ値になる)
FS フィールドの区切り文字(-Fオプションで変更可能、デフォルトはスペース)
NR 現在処理しているレコード番号(行番号)
OFS 出力時のフィールドの区切り(デフォルトは空白)
ORS 出力時のレコードの区切り(デフォルトは改行)
RS レコードの区切り(デフォルトは改行)


基本的な使い方

 「awk 'パターン {アクション}' ファイル名」で、テキストファイルを1行ずつ読み、パターンに合致した行に対して、アクションで指定された内容を実行します。

 テキストの各行を空白文字で区切って“フィールド”として処理できます。例えば、「ls -l」の出力で、ファイルサイズ(空白区切りで5番目のフィールド)が1000000(約1MB)以上の場合、その行を出力(print)するのであれば、「'$5 >= 1000000 { print }'」のように書きます(画面1)。

画面1 画面1 lsコマンドの出力のうち、ファイルサイズ(赤枠)に注目し、条件に合致する行だけを表示したところ

 このように、「$番号」でフィールドを指定することから、コマンドラインでawkの処理を書く場合、引用符として「"」ではなく「'」を使用してください

※引用符の扱いについては、echoコマンド「引用符を使いこなす」を参照してください。



 処理したい内容が多い場合は、awkで行う処理を書いたファイルを別に作成しておき、「-f ファイル名」で指定して実行します。これは“AWKスクリプト”と呼ばれ、シェルスクリプトや、Perlコマンド用のスクリプト同様、コマンドとして使用することも可能です。-fオプションについては第116回以降で取り上げます。

コマンド実行例

ls -l | awk '$5 >= 1000000 { print }'画面1

(ファイルサイズが約1MB以上の行を出力する)


 なお、コマンド実行例では読みやすくするために記号の前後に空白を入れていますが、この空白は省略可能です。



全ての行を対象とするには

 パターンを指定せずに、「{アクション}」だけ指定した場合、全ての行が対象となります

※アクションが省略された場合は「行全体を出力」という意味になります。パターンとアクションの両方を省略することはできません。



 例えば、「ls -l」の結果で、9〜11番目のフィールドだけを出力したい場合は「{ print $9,$10,$11 }」のように指定します(画面2)。

 「ls -l」は空白区切りで数えるとファイル名が9番目に、シンボリックリンクの場合はその後に「->」(10番目)とリンク先のパス(11番目)が出力されるので、「ls -l | '{ print $9,$10,$11 }'」でファイル名とリンク先が表示されることになります。

コマンド実行例

ls -l | awk '{ print $9,$10,$11 }'画面2

(lsコマンドの出力のうち、9〜11番目のフィールドを表示する)


画面2 画面2 lsコマンドでルートディレクトリ直下を選び、9〜11番目のフィールドを表示したところ

 なお、「ls -l」では1行目に合計の行が出力されるので、このアクションだけを指定して実行した場合は、画面2のように、1行目が空白となります。

 1行目(合計の行)を削除したい場合は、“行番号が1より大きい”というパターンを指定するか、先にsedコマンドで削除しておくと良いでしょう(画面3)。

画面3 画面3 sedコマンドを利用してawkコマンドに与えるデータを加工した結果

 行番号は、awkであらかじめ定義されている組み込み変数である「NR」で参照できます。組み込み変数については第116回以降で取り上げます。

コマンド実行例

ls -l | awk 'NR>1 { print $9,$10,$11 }'

(NR(行番号)が1より大きいという条件を加える)

ls -l | sed 1d | awk '{ print $9,$10,$11 }'

(sedコマンドで1行目を削除する(連載第54回))(画面3




筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。