GNU/Linux >> Linux の 問題 >  >> Linux

Grepの正規表現(Regex)

grep は、テキスト処理のためのLinuxで最も便利で強力なコマンドの1つです。 grep 1つ以上の入力ファイルで正規表現に一致する行を検索し、一致する各行を標準出力に書き込みます。

この記事では、GNUバージョンの grepで正規表現を使用する方法の基本について説明します。 、これはほとんどのLinuxオペレーティングシステムでデフォルトで使用できます。

Grep正規表現#

正規表現または正規表現は、文字列のセットに一致するパターンです。パターンは、演算子、構成リテラル文字、および特別な意味を持つメタ文字で構成されます。 GNU grep Basic、Extended、Perl互換の3つの正規表現構文をサポートします。

最も単純な形式では、正規表現タイプが指定されていない場合、 grep 検索パターンを基本的な正規表現として解釈します。パターンを拡張正規表現として解釈するには、 -Eを使用します (または-extended-regexp )オプション。

GNUのgrepの実装 基本的な正規表現構文と拡張正規表現構文の間に機能的な違いはありません。唯一の違いは、基本的な正規表現ではメタ文字 + { | 、および リテラル文字として解釈されます。基本的な正規表現を使用するときにメタ文字の特別な意味を維持するには、文字をバックスラッシュ( \ )でエスケープする必要があります。 )。これらおよびその他のメタキャラクターの意味については、後で説明します。

通常、シェルによるメタ文字の解釈と拡張を避けるために、正規表現は常に一重引用符で囲む必要があります。

文字通りの一致#

grepの最も基本的な使用法 コマンドは、ファイル内のリテラル文字または一連の文字を検索することです。たとえば、 / etc / passwdに文字列「bash」を含むすべての行を表示するには ファイルの場合、次のコマンドを実行します:

grep bash /etc/passwd

出力は次のようになります。

root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

この例では、文字列「bash」は4つのリテラル文字で構成される基本的な正規表現です。これはgrepに通知します 「b」の直後に「a」、「s」、「h」が続く文字列を検索します。

デフォルトでは、 grep コマンドでは大文字と小文字が区別されます。これは、大文字と小文字が別個のものとして扱われることを意味します。

検索時に大文字と小文字を区別しない場合は、 -iを使用します オプション(または-ignore-case

grepに注意することが重要です 検索パターンを単語ではなく文字列として検索します。したがって、「gnu」を検索している場合は、 grep また、「gnu」が「cygnus」や「magnum」などの大きな単語に埋め込まれている行も印刷されます。

検索文字列にスペースが含まれている場合は、一重引用符または二重引用符で囲む必要があります。

grep "Gnome Display Manager" /etc/passwd

アンカー#

アンカーはメタ文字であり、行のどこで一致を見つける必要があるかを指定できます。

^ (caret)記号は、行頭の空の文字列と一致します。次の例では、文字列「linux」は、行の先頭にある場合にのみ一致します。

grep '^linux' file.txt

$ (ドル)記号は、行頭の空の文字列と一致します。文字列「linux」で終わる行を見つけるには、次を使用します。

grep 'linux$' file.txt

両方のアンカーを使用して正規表現を作成することもできます。たとえば、「linux」のみを含む行を検索するには、次のコマンドを実行します。

grep '^linux$' file.txt

もう1つの便利な例は、 ^ $です。 すべての空の行に一致するパターン。

一致する単一文字#

(ピリオド)記号は、任意の1文字に一致するメタ文字です。たとえば、「kan」で始まり、2文字で、「roo」という文字列で終わるものに一致させるには、次のパターンを使用します。

grep 'kan..roo' file.txt

ブラケット式#

角かっこ式を使用すると、文字のグループを角かっこで囲むことで一致させることができます [] 。たとえば、「accept」または「accent」を含む行を見つけるには、次の式を使用できます。

grep 'acce[np]t' file.txt

角かっこ内の最初の文字がカレットの場合^ 、次に、角かっこで囲まれていない任意の1文字に一致します。次のパターンは、「co」で始まり、「l」の後に「la」が続く文字以外の文字列(「coca」、「cobalt」など)の任意の組み合わせに一致しますが、「cola」を含む行には一致しません。 」:

grep 'co[^l]a' file.txt

文字を1つずつ配置する代わりに、角かっこ内に文字の範囲を指定できます。範囲式は、範囲の最初と最後の文字をハイフンで区切って指定することによって作成されます。例: [a-a] [abcde]と同等です および[1-3] [123]と同等です 。

次の式は、大文字で始まる各行に一致します。

grep '^[A-Z]' file.txt

grep 角かっこで囲まれた定義済みの文字クラスもサポートします。次の表に、最も一般的な文字クラスのいくつかを示します。

Quantifier キャラクタークラス
[:alnum:] 英数字。
[:alpha:] アルファベット文字。
[:blank:] スペースとタブ。
[:digit:] 数字。
[:lower:] 小文字。
[:upper:] 大文字。

すべての文字クラスの完全なリストについては、Grepマニュアルを確認してください。

数量詞#

数量詞を使用すると、一致が発生するために存在する必要があるアイテムの出現回数を指定できます。次の表は、GNU grepでサポートされている数量詞を示しています。 :

Quantifier 説明
* 前のアイテムを0回以上一致させます。
前のアイテムを0回または1回一致させます。
+ 前のアイテムを1回以上一致させます。
{n} 前のアイテムと正確に一致するn
{n、} 前のアイテムと少なくともn一致します
{、m} 前の項目に一致する最大m
{n、m} nの前のアイテムと一致します m

* (アスタリスク)文字が前の項目と0回以上一致している。以下は、「right」、「sright」、「ssright」などに一致します。

grep 's*right'

以下は、大文字で始まり、ピリオドまたはコンマで終わるすべての行に一致する、より高度なパターンです。 。* 正規表現は任意の数の任意の文字に一致します:

grep -E '^[A-Z].*[.,]$' file.txt

(疑問符)文字は前の項目をオプションにし、1回だけ一致できます。以下は「明るい」と「正しい」の両方に一致します。 基本的な正規表現を使用しているため、文字はバックスラッシュでエスケープされます:

grep 'b\?right' file.txt

拡張正規表現を使用した同じ正規表現は次のとおりです。

grep -E 'b?right' file.txt

+ (プラス)文字が前の項目と1回以上一致している。以下は「sright」と「ssright」に一致しますが、「right」には一致しません。

grep -E 's+right' file.txt

中括弧文字{} 正確な数、上限または下限、または一致が発生するために発生する必要のある発生範囲を指定できます。

以下は、3〜9桁のすべての整数に一致します。

grep -E '[[:digit:]]{3,9}' file.txt
代替番号

交互という用語は、単純な「OR」です。代替演算子| (パイプ)を使用すると、リテラル文字列または式セットである可能性のあるさまざまな一致を指定できます。この演算子は、すべての正規表現演算子の中で最も優先順位が低くなっています。

以下の例では、 fatalという単語のすべての出現箇所を検索しています。 、エラー 、およびクリティカル Nginxログエラーファイル内:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

拡張正規表現を使用する場合は、演算子 | 以下に示すように、エスケープしないでください:

grep -E 'fatal|error|critical' /var/log/nginx/error.log
グループ化#

グループ化は正規表現の機能であり、パターンをグループ化して1つのアイテムとして参照できます。グループは括弧()を使用して作成されます 。

基本的な正規表現を使用する場合、括弧は円記号( \ )でエスケープする必要があります 。

次の例は、「fearless」と「less」の両方に一致します。 数量詞は(fear)を作成します オプションのグループ:

grep -E '(fear)?less' file.txt

特別なバックスラッシュ式#

GNU grep バックスラッシュとそれに続く通常の文字で構成されるいくつかのメタ文字が含まれます。次の表は、最も一般的な特殊な円記号式の一部を示しています。

説明
\ b 単語の境界に一致します。
\ < 単語の先頭で空の文字列を照合します。
\> 単語の末尾で空の文字列を照合します。
\ w 単語を一致させます。
\ s スペースを一致させます。

次のパターンは、「abject」と「object」という別々の単語に一致します。大きな単語に埋め込まれている場合、単語と一致しません:

grep '\b[ao]bject\b' file.txt

結論#

正規表現は、テキストエディタ、プログラミング言語、および grepなどのコマンドラインツールで使用されます。 、 sed 、および awk 。正規表現の作成方法を知っていると、テキストファイルの検索、スクリプトの記述、またはコマンド出力のフィルタリングに非常に役立ちます。

ご質問やご意見がございましたら、お気軽にコメントをお寄せください。


Linux
  1. 正規表現:すべてをまとめる

  2. 正規表現とgrep:データフローとビルディングブロック

  3. 10 の例を含む grep コマンドの高度な正規表現 – パート II

  1. 10 の例を含む grep コマンドの正規表現 – パート I

  2. Windowsで行末の正規表現一致を使用するには?

  3. \d は grep の基本式でサポートされていませんか?

  1. 正規表現の使用を開始する:例

  2. 正規表現の紹介

  3. grep 抽出番号範囲