【 awk 】コマンド(基本編その2)――テキストの加工とパターン処理・パターンの指定方法Linux基本コマンドTips(116)

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

» 2017年06月08日 05時00分 公開
[西村めぐみ@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

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

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は「パターン {アクション}」で処理を指定します。パターンに合致したらアクションを実行するという意味です。例えば「ls -l | awk '$5 >= 1000000 { print }'」であれば、「ls -lの出力のうち、5番目のフィールド(ファイルサイズが表示されるフィールド)が100000以上であった行を出力する」という意味になります(画面1連載第115回)。

 数値の比較には、「<、>、<=、>=、==、!=」を使用できます。

画面1 画面1 サイズが約1MB以上のファイルを選び出したところ


正規表現を使うには

 先ほどの「パターン」の部分は応用が利きます。例えば「$5 >= 1000000」のような比較の他に、「/正規表現/」とすると、文字列がパターンに当てはまるかどうか、調べることができます。

 awkでは、egrepコマンド(「grep -E」相当、連載第10回)と同じ拡張正規表現を原則として使用できます。

 例えば、ls -lの出力を使って「l」から始まる行(シンボリックリンク)だけを選ぶとしましょう。出力内容は「ファイル名(リンク先)」とします。この場合は画面2のように指定します。「print」部分の書き方については第118回で扱います。

コマンド実行例

ls -l | awk '/^l/ { print $9 " (" $11 ")" }' (画面2

(lsコマンドの出力のうち、シンボリックリンクとなっている行を表示))


画面2 画面2 パターンとして正規表現を指定した例

 実行例では「ls -l /」でルートディレクトリを表示し、awkのアクション部分で「{}」記号前後の空白を省略して入力しています。

 awkで使用できる正規表現は以下の通りです。この他、gawkには「\s」で空白文字を表し、「\S」で空白文字以外を表すメタ文字(メタキャラクタ)があります。

基本正規表現

記号 意味 使用例
^ 行頭 ^abc:abcから始まる行
$ 行末 abc$:abcで終わる行
\< 語頭 \<abc:abcで始まる単語
\> 語尾 abc\>:abcで終わる単語
. 改行以外の任意の文字 ――
\w アルファベットと数字 ――
\W アルファベットと数字以外 ――
[...] 囲まれている文字のどれか [abc]:abcのどれか
[^...] 囲まれている文字でない文字 [^abc]:abc以外
[n-n] 指定範囲のどれかの文字 [a-c]:abcのどれか

拡張正規表現

記号 意味 使用例
* 直前文字の0回以上の繰り返し ――
+ 直前文字の1回以上の繰り返し ――
{n} 直前文字のn回の繰り返し [0-9]{3}:3桁の数字
{n,} 直前文字のn回以上の繰り返し [0-9]{3,}:3桁以上の数字
{,m} 直前文字のm回以下の繰り返し [0-9]{,5}:5桁以下の数字
{n,m} 直前文字のn回からm回の繰り返し [0-9]{3,5}:3桁から5桁の数字
| または txt|doc:txtまたはdoc
() ()内をひとまとまりとする (abc){2}:abcabc

※検索文字列の中に特殊文字と同じ文字を使いたい場合は、「\」を付けます。例えば、「\w」という文字を探したい場合は「\\w」とします。




パターンを組み合わせるには

 「&&」や「||」を使うと、複数のパターンを組み合わせることができます。組み合わせる際に「()」を使用することも可能です。

 例えば、「ls -l」の結果を使って、「行番号が1より大きく」かつ「4番目のフィールド(所有グループ)がrootではないもの」を出力するなら、次のように実行します(画面3*)。NRは行番号を表している変数(awkの組み込み変数)です。

※正規表現のパターンに一致しているかどうかを調べるときには、コマンド実行例や画面3(いずれも「$4」の直後)のように「~」記号(マッチ演算子)を使います。一致していないことを表すには「!~」とします。


コマンド実行例

ls -l | awk 'NR>1 && ! ( $4 ~ /root/ ){ print }'

(lsコマンドの出力のうち、先頭行を除き、4番目のフィールドがrootでないものを出力)


画面3 画面3 複数のパターンを組み合わせた例

 画面3では「/usr/bin」のファイルのうち、所有グループがrootではないものを出力しています。awkのアクションがprintのみなので、アクション部分を省略しました。

 パターンを組み合わせる際に使用できる記号は以下の通りです。

パターン指定用の記号

記号 意味
パターン1 && パターン2 パターン1とパターン2の両方に合致
パターン1 || パターン2 パターン1またはパターン2に合致
! パターン パターンに合致しない
パターン1 ? パターン2 : パターン3 パターン1かつパターン2、またはパターン3(パターン1がTRUEだった場合はパターン2を、FALSEの時はパターン3を調べる)
パターン1, パターン2 パターン1とパターン2の間にある行に合致

※複数のパターンを組み合わせる際に「 (パターン) 」のように「()」で優先順位を付けることも可能。




筆者紹介

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

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


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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