本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、テキストのパターン処理を行う「awk(gawk)」コマンドです。
本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、テキストのパターン処理を行う「awk(gawk)」コマンドです。第115回に続き、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 [オプション] [コマンド] [ファイル……]
※[ ]は省略可能な引数を示しています
短いオプション | 意味 |
---|---|
-f ファイル名 | awkスクリプトが書かれたファイルを指定する |
-F 区切り文字 | 区切り文字を指定する(デフォルトは空白文字) |
-v 変数名=値 | 変数を定義する |
※gawk(GNU版awk)の場合、長いオプションも使用可能。-fは--file program-file、-Fは--field-separator、-vは--assign。gawkにはこの他にも多数のオプションがある。
変数名 | 意味 |
---|---|
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回)。
数値の比較には、「<、>、<=、>=、==、!=」を使用できます。
先ほどの「パターン」の部分は応用が利きます。例えば「$5 >= 1000000」のような比較の他に、「/正規表現/」とすると、文字列がパターンに当てはまるかどうか、調べることができます。
awkでは、egrepコマンド(「grep -E」相当、連載第10回)と同じ拡張正規表現を原則として使用できます。
例えば、ls -lの出力を使って「l」から始まる行(シンボリックリンク)だけを選ぶとしましょう。出力内容は「ファイル名(リンク先)」とします。この場合は画面2のように指定します。「print」部分の書き方については第118回で扱います。
ls -l | awk '/^l/ { print $9 " (" $11 ")" }' (画面2)
(lsコマンドの出力のうち、シンボリックリンクとなっている行を表示))
実行例では「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では「/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.