前回の正規表現パート 1 の記事では、基本的な正規表現を実際の例とともに確認しました。
しかし、正規表現を使えばもっと多くのことができます。多くの場合、数行のコードを記述する代わりに、1 つの正規表現で複雑なタスクを実行できます。
文字列に正規表現を適用すると、正規表現エンジンは文字列の最初の文字から開始されます。最初の文字で正規表現のすべての可能な順列を試します。すべての可能性を試して失敗した場合にのみ、正規表現エンジンはテキストの 2 番目の文字を続行します。
正規表現は、正規表現のすべての可能な順列をまったく同じ順序で試します。その結果、正規表現指向のエンジンは左端の一致を返します。
この記事では、いくつかの高度な正規表現を例を挙げて確認しましょう。
例 1. OR 演算 (|)
grep のパイプ文字 (|) は、2 つの完全な部分式のいずれかが位置に出現することを指定するために使用されます。 「subexpression1|subexpression2」は、subexpression1 または subexpression2 のいずれかに一致します。
次の例では、grep コマンドで OR を使用して、ファイル内の 3 つのさまざまな種類のコメント行を削除します。
まず、「comments」というサンプル ファイルを作成します。
$ cat comments This file shows the comment character in various programming/scripting languages ### Perl / shell scripting If the Line starts with single hash symbol, then its a comment in Perl and shell scripting. ' VB Scripting comment The line should start with a single quote to comment in VB scripting. // C programming single line comment. Double slashes in the beginning of the line for single line comment in C.
「コメント」と呼ばれるファイルには、perl、VB スクリプト、および C プログラミングのコメント行が含まれています。次の grep コマンドは、# または一重引用符 (') または二重スラッシュ (//) で始まらない行を検索します。
$ grep -v "^#\|^'\|^\/\/" comments This file shows the comment character in various programming/scripting languages If the Line starts with single hash symbol, then its a comment in Perl and shell scripting. The line should start with a single quote to comment in VB scripting. Double slashes in the beginning of the line for single line comment in C.
例 2. 文字クラス式
以前の正規表現の記事の例 9 で見たように、文字のリストを角括弧で囲んで指定すると、複数の文字のうちの 1 つだけに一致します。 grep コマンドは、特定の一般的な範囲を示すいくつかの特殊文字クラスをサポートしています。それらのいくつかはここにリストされています。さまざまな文字クラスの表現については、grep の man ページを参照してください。
[:digit:] Only the digits 0 to 9 [:alnum:] Any alphanumeric character 0 to 9 OR A to Z or a to z. [:alpha:] Any alpha character A to Z or a to z. [:blank:] Space and TAB characters only.
これらは常に角括弧内で [[:digit:]] の形式で使用されます。適切な文字クラス式を使用して、ntpd デーモン プロセスのすべてのプロセス ID を grep します。
$ grep -e "ntpd\[[[:digit:]]\+\]" /var/log/messages.4 Oct 28 11:42:20 gstuff1 ntpd[2241]: synchronized to LOCAL(0), stratum 10 Oct 28 11:42:20 gstuff1 ntpd[2241]: synchronized to 15.11.13.123, stratum 3 Oct 28 12:33:31 gstuff1 ntpd[2241]: synchronized to LOCAL(0), stratum 10 Oct 28 12:50:46 gstuff1 ntpd[2241]: synchronized to 15.11.13.123, stratum 3 Oct 29 07:55:29 gstuff1 ntpd[2241]: time reset -0.180737 s
例 3. M 対 N 回 ({m,n})
正規表現の後に {m,n} が続く場合、前の項目が m 回以上、n 回以下一致することを示します。 m と n の値は負ではなく、255 未満でなければなりません。
次の例では、行が 0 から 99999 の範囲にある場合にその行を出力します。
$ cat number 12 12345 123456 19816282 $ grep "^[0-9]\{1,5\}$" number 12 12345
「number」というファイルには数字のリストがあり、上記の grep コマンドは 1 (最小は 0) から 5 桁 (最大は 99999) の数字のみに一致します。
注意 :基本的な grep コマンドの例については、15 の実用的な grep コマンドの例を参照してください。
例 4. 正確な M オカレンス ({m})
{m} が後に続く正規表現は、前の式の m 回の出現に正確に一致します。次の grep コマンドは、5 桁の数字のみを表示します。
$ grep "^[0-9]\{5\}$" number 12345
例 5. M 回以上の出現 ({m,})
{m,} が後に続く正規表現は、前の式の m 回以上の出現に一致します。次の grep コマンドは、5 桁以上の数字を表示します。
$ grep "[0-9]\{5,\}" number 12345 123456 19816282
注意 :bzgrep コマンドを使用して、bzip2 圧縮ファイルの文字列またはパターン (正規表現) を検索できることをご存知でしたか。
例 6. 単語境界 (\b)
\b は単語境界に一致します。
# grep -i "\bthe\b" comments This file shows the comment character in various programming/scripting languages If the Line starts with single hash symbol, The line should start with a single quote to comment in VB scripting. Double slashes in the beginning of the line for single line comment in C.
例 7. 後方参照 (\n)
さらに使用するために式をグループ化することは、後方参照を介して grep で利用できます。たとえば、\([0-9]\)\1 は、11、22、33 などのように両方の数字が同じ数字である 2 桁の数字に一致します。
# grep -e '^\(abc\)\1$' abc abcabc abcabc
上記の grep コマンドでは、STDIN の入力を受け入れます。入力「abc」を読み取ると、一致しませんでした。行「abcabc」は指定された式と一致するため、出力されます。拡張正規表現を使用する場合は、常に egrep コマンドを使用することをお勧めします。 -e オプションを指定した grep も egrep のように機能しますが、括弧などの特殊文字をエスケープする必要があります。
注意 :zgrep コマンドを使用して、圧縮された gz ファイル内を検索することもできます。
例 8. パターン「オブジェクト指向」に一致
これまで、grep コマンドでさまざまなヒントを見てきましたが、これらのヒントを使用して、さまざまな形式で「オブジェクト指向」を一致させてみましょう。
$ grep "OO\|\([oO]bject\( \|\-\)[oO]riented\)"
上記の grep コマンドは、「OO」、「オブジェクト指向」、「オブジェクト指向」などに一致します。
例 9. 「vowel singlecharacter samevowel」という行を出力
次の grep コマンドは、母音 (a、e、i、o、または u) の後に単一の文字が続き、その後に同じ母音が続くすべての行を出力します。したがって、eve または adam は検出されますが、vera は検出されません。
$ cat input evening adam vera $ grep "\([aeiou]\).\1" input evening adam
例 10. 有効な IP アドレス
次の grep コマンドは、有効な IP アドレスのみに一致します。
$ cat input 15.12.141.121 255.255.255 255.255.255.255 256.125.124.124 $ egrep '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' input 15.12.141.121 255.255.255.255
上記の正規表現には、さまざまな条件があります。これらの条件付き一致は 3 回発生し、もう 1 つのクラスが個別に言及される必要があります。
<オール>この記事のパート 1 では、Grep コマンドの正規表現と 10 の例 – パート I をお読みください。