Linux 正規表現チュートリアル: Grep 正規表現の例

⚡ スマートサマリー

Linuxの正規表現は、grep、sed、viなどのツール間でデータを検索し、複雑なパターンに一致させるための特殊な文字シーケンスです。基本形式、間隔形式、拡張形式、および括弧展開形式を使用して、テキストを正確にフィルタリングします。

  • 🔎 彼らが何でありますか: 正規表現(regexpまたはregexと略される)は、検索やマッチングのためのテキストパターンを記述するものです。
  • 🧩 基本セット: . ^ $ * および \ などの記号は、パターン内の文字を固定、繰り返し、およびエスケープします。
  • 🔢 間隔: {n}や{n,m}などの括弧は、直前の文字が何回繰り返されるかを制御します。
  • 拡張: grep -E では、\+ と \? は、文字が 1 回以上出現する場合と、0 回または 1 回出現する場合に一致します。
  • 🧵 装具の拡張: 波括弧は、シーケンスまたはカンマ区切りリストから複数の文字列を生成します。
  • 🛠️ 使用場所: grep、sed、tr、viなどのツールは、正規表現を使用してテキストをフィルタリングします。
  • 🤖 AIによる支援: AIアシスタントとGitHub Copilotは、正規表現パターンを迅速に生成、説明、デバッグできます。

Linuxのgrepを使った正規表現 ― 基本、区間、拡張正規表現の例

正規表現は、 Linux テキストツールを使用すると、コンパクトなパターンでデータを照合、フィルタリング、変換できます。このページでは、基本形式、間隔形式、拡張形式、および括弧展開について、grepの具体的な例を交えて説明します。

Linux の正規表現とは何ですか?

Linuxの正規表現は、データの検索や複雑なパターンのマッチングに役立つ特殊文字です。正規表現は「regexp」または「regex」と略されます。多くのLinuxプログラムで使用されています。 grepbash、rename、sedなど。

正規表現の種類

理解を容易にするため、正規表現の種類を一つずつ見ていきましょう。このページでは、基本正規表現、区間正規表現、拡張正規表現について解説し、最後に中括弧展開について説明します。

基本的な正規表現

正規表現でよく使われるコマンドには、tr、sed、 vi、そしてgrep。以下の表に、基本的な正規表現の一部を示します。

シンボル 詳細説明
. 任意の文字を置き換えます
^ 文字列の先頭に一致します
$ 文字列の末尾に一致します
* 直前の文字と0回以上一致する
\ 特殊キャラクターを表す
() グループ正規表現
? ちょうど1文字に一致する

具体例を見てみましょう。まず、以下に示すように、cat sampleコマンドを実行して、既存のファイルの内容を表示します。

catコマンドのサンプル:ターミナルで既存ファイルの内容を表示する

次に、「a」という文字を含むコンテンツを検索します。下のスクリーンショットは、grepコマンドが「a」を含むすべての行を返す様子を示しています。

サンプルファイルから文字「a」を含む行をgrepで検索する

キャレット「^」は文字列の先頭に一致します。以下の例では、文字「a」で始まるコンテンツを検索します。

キャレットアンカーを使用して、文字「a」で始まる行のみに一致するgrepを実行します。

文字「a」で始まる行のみがフィルタリングされます。先頭に文字「a」が含まれていない行は無視されます。

別の例を見てみましょう。下のスクリーンショットは、行末でフィルタリングする前のサンプルファイルの内容を示しています。

文字「t」で終わる行をフィルタリングする前のサンプルファイルの内容

以下に示すように、「$」アンカーを使用して、末尾が「t」で終わる行のみを選択します。

ドル記号アンカーを使用して、文字「t」で終わる行のみを選択するgrepコマンド

間隔の正規表現

これらの式は、文字列中の特定の文字の出現回数を指定します。以下に示します。

表現 詳細説明
{NS} 「n」回出現する直前の文字と正確に一致します
{n、m} 「n」回出現する前にある文字と一致しますが、m 回を超えません
{n、} 前の文字が「n」回以上出現する場合にのみ一致します。

例えば、「p」という文字を含む行をすべて除外します。下のスクリーンショットは、該当する行を示しています。

サンプルファイルから文字「p」を含む行をgrepでフィルタリングする

次に、文字列中に文字「p」がちょうど2回、連続して出現するかどうかを確認します。構文は次のとおりです。

cat sample | grep -E p\{2}

インターバルマッチの結果は以下のとおりです。

grep -E 文字 p がちょうど 2 回出現する区間式

注: これらの正規表現には -E を追加する必要があります。

拡張正規表現

これらの正規表現は、複数の表現を組み合わせたものです。その例をいくつか挙げます。

表現 詳細説明
\+ 前の文字の XNUMX つ以上の出現に一致します
\? 前の文字の XNUMX 回または XNUMX 回の出現に一致

例えば、「t」という文字が出現する箇所をすべて検索してみましょう。下のスクリーンショットはその結果を示しています。

サンプルファイルから文字「t」を含むすべての行をgrepで検索します

文字「a」が文字「t」より前に来る行を除外したいとします。その場合は、以下のようなコマンドを使用できます。

cat sample|grep "a\+t"

出力結果は以下のスクリーンショットに示されています。

grep 拡張式で、1 つ以上の a 文字の後に t が続くものに一致するもの

ブレースの拡張

中括弧展開の構文は、中括弧 '{}' 内に記述された項目のシーケンス、またはカンマで区切られた項目のリストのいずれかです。シーケンスの開始項目と終了項目は、ピリオド '..' で区切られます。

以下にいくつかの例を示します。

括弧展開を使用してシーケンスとリストから複数の文字列を生成するechoコマンド

上記の例では、echoコマンドはブレース展開を使用して文字列を作成し、単一のパターンから複数の文字列を生成します。

よくあるご質問

grep はデフォルトで基本的な正規表現を使用します。egrep は拡張正規表現を有効にし (grep -E と同じ)、fgrep は正規表現を使用せずに固定文字列に一致します (grep -F)。最新の GNU grep では egrep と fgrep は非推奨となっているため、grep -E と grep -F の使用をお勧めします。

文字クラスは、文字のカテゴリに一致します。[az] のような角括弧式は範囲に一致し、[[:alpha:]]、[[:digit:]]、[[:space:]] などの POSIX クラスは、文字、数字、空白文字に一致します。これにより、パターンが読みやすく、異なるロケール間でも移植性を維持できます。

-i オプションを追加してください。例えば、grep -i “hello” sample と入力します。これは Hello、HELLO、hello のすべてに一致します。-i オプションがない場合、正規表現は大文字と小文字を区別するため、大文字とその小文字は異なる文字として扱われます。

シェルのワイルドカード(グロビング)はファイル名を展開します。ここで、* は任意の文字、? は 1 文字を表します。正規表現はファイル内のテキストに一致します。ここで、* は直前の文字が 0 個以上繰り返されることを意味します。同じ記号でも、それぞれの文脈で異なる意味を持ちます。

-o オプションを使用します。たとえば、grep -o “a\+t” sample のように指定します。grep は行全体を表示する代わりに、パターンに一致する部分のみを表示します。1 行につき 1 つの一致が出力されます。これは、たとえば次のような場合に便利です。tracメールアドレスや数字などの値。

パイプ記号と組み合わせて使用​​します。拡張モードでは、`grep -E “cat|dog” sample` は cat または dog を含む行に一致します。基本モードでは、`grep “cat\|dog” sample` のようにエスケープする必要があります。組み合わせを使用すると、1 つのコマンドで複数のパターンを同時に検索できます。

AIアシスタントは、平易な英語の説明を実用的な正規表現に変換したり、難解なパターンが何をするのかを説明したり、一致しなかった場合に修正案を提案したりすることができます。また、機械学習ツールは、手作業では記述するのが面倒な大規模なログファイル内の繰り返しパターンを検出することも可能です。

Yes. GitHubコパイロット 入力中にコメントや部分的なパターンからgrepコマンドや正規表現を直接提案します。複雑な式を素早く記述できますが、生成されたパターンは実際のサンプルデータでテストしてから使用することをお勧めします。