Guides, HowTos and Tips for Technology Geeks - The Geek Stuff

LinuxやFreeBSDなどのUnix系OSを使う場合に必須になるコマンドのひとつにgrep(1)がある。grep(1)は指定した文字列をファイルや標準入力から抜き出したり、またその逆の処理を行うなどの目的で利用されるコマンド。特定のキーワードを指定してファイルを特定するために利用されるほか、コマンド出力を加工したり、データを加工したりといった用途で使われている。

grep(1)はキーワードの指定に正規表現を指定できる。正規表現はgrep(1)の活用範囲をきわめて広くする重要な機能であり、grep(1)の基本的な使い方をマスターした後にぜひ習得しておきたい機能といえる。The Geek StuffのAdvanced Regular Expressions in Grep Command with 10 Examples - Part IIの記事に覚えておきたい正規表現のサンプルが掲載されている。^、$、.、*、+、?などを覚えた後には、同記事に掲載されている正規表現を覚えておきたい。

以降にAdvanced Regular Expressions in Grep Command with 10 Examples - Part IIに掲載されているサンプルをベースに日本語の文章に対して実行した結果と指定内容の説明を掲載する。利用するテキストファイルの内容は次のとおり。messageという名前のファイルに保存したと想定してサンプルを作成してある。

        2011/01/17
ブラウザは特定のHTMLやCSS、JavaScriptのコードを
読み込むとクラッシュしたりフリーズすることが
知られている。


しかもそれは複雑怪奇なコードではなく、
とても短いコードでも起こることがわかっている。
特にIEをクラッシュさせたりフリーズさせるための
コードの多くがスニペットとして公開されている。

grep(1)では正規表現の記述に基本と拡張という2つの種類がある。オプションとして-Eを指定すると拡張になり、指定しなければ基本となる。ここでは-Eを指定する拡張正規表現の記述方法でサンプルを統一しておく。

OR演算

# grep -E '特定|公開' message 
ブラウザは特定のHTMLやCSS、JavaScriptのコードを
コードの多くがスニペットとして公開されている。
#

キーワードを|で区切ることでOR演算とすることができる。複数のキーワードで検索したい場合などに利用できる。

文字クラス

# grep '[[:digit:]]' message 
    2011/01/17
# grep '[[:alnum:]]' message
    2011/01/17
ブラウザは特定のHTMLやCSS、JavaScriptのコードを
特にIEをクラッシュさせたりフリーズさせるための
# grep '[[:alpha:]]' message
ブラウザは特定のHTMLやCSS、JavaScriptのコードを
特にIEをクラッシュさせたりフリーズさせるための
# grep '[[:blank:]]' message
    2011/01/17
#

数字、数字とアルファベット、アルファベット、空白タブといった特定の種類については文字クラスと呼ばれる表現で記述することができる。

m回以上n回以下繰り返し

# grep -E '[[:digit:]]{3,5}' message
    2011/01/17
# grep -E '[[:digit:]]{5,6}' message
#

{m,n}を指定するひとつ前の表現をm回以上およびn回以下繰り返すという指定。

m回繰り返し

# grep -E '[[:digit:]]{4}' message
    2011/01/17
# grep -E '[[:digit:]]{5}' message
#

{m}を指定するひとつ前の表現をm回繰り返すという指定。

m回以上繰り返し

# grep -E '[[:digit:]]{4,}' message
    2011/01/17
# grep -E '[[:digit:]]{5,}' message
#

{m,}を指定するひとつ前の表現をm回以上繰り返すという指定。

単語区切り

# grep -E '\bIE\b' message 
特にIEをクラッシュさせたりフリーズさせるための
# grep -E '\bI\b' message 
#

単語の区切りを指定して検索するというもの。文字列の一部としての一致ではなく単語そのものとして検索一致させたい場合に便利。

後方参照

# grep -E '([[:digit:]])([[:digit:]])\2' message
    2011/01/17
# grep -E '([[:digit:]])([[:digit:]])\1' message
#

括弧で括った内容に一致したものを後ろで指定できるというもの。同じ数値の繰り返しであるとか、同じ文字列の繰り返しなどを表現できる。

grep(1)はキーワードを正規表現で指定する以外にも、オプションを指定してさまざまな処理ができるようになっている。柔軟で強力な機能を提供している代表的なコマンドであり、素早くマスターしておきたいものといえる。