ウェブサイト検索

16のBash正規表現(RegEx)例:grep、sed、およびawkコマンドを使用


正規表現、またはRegexは、ファイルから特定のパターンにマッチするインスタンスを見つけて操作するためのパターンを形成する特殊文字のシーケンスです。主にファイル内の特定の文字、単語、フィルタリング、またはテキストの操作に使用されます。

正規表現(Regex)は、LinuxのBashスクリプトを含むプログラミング言語で広く使用されています。このガイドでは、Bashにおける正規表現の使い方、主要な正規表現、およびさまざまな正規表現処理エンジンの使用方法について説明します。

  • 正規表現とは
  • 正規表現のバージョン
  • 正規表現の構文
  • 正規表現構文の構成要素
  • Linuxにおける正規表現の使用例16選
  • 正規表現チートシート
  • 結論

Regexとは何ですか

Linuxにおける正規表現(regex)は、文字列やテキストファイル内の特定のパターンと一致するために特殊なメタ文字で構成されたパターンです。

実際の例を使って理解しましょう。特定の変数を見つけて、別のコードファイルで操作したい場合、そんな状況では正規表現が必要になることがあります。

正規表現のバージョン

正規表現には異なるバージョンがあり、すべての正規表現プロセッサのコマンドがすべての正規表現をサポートしているわけではないことに注意することが重要です。

  • 基本正規表現 (BRE)
  • 拡張正規表現 (ERE)
  • Perl 互換正規表現 (PCRE)

BREとEREはさらに次のように分類されます:

  • POSIX BRE/ERE
  • GNU BRE/ERE

POSIX BREとPOSIX EREはGNU BREとEREのサブセットであり、GNU BRE/EREはPCREのサブセットです。

正規表現の構文

正規表現と共に使用される異なるコマンドラインユーティリティには、以下のようなものがあります:

  • grep
  • sed
  • awk

これらのコマンドは正規表現エンジンとも呼ばれ、複雑な正規表現を翻訳し、出力を提供します。

grepによる正規表現の構文

grep [options] 'pattern' [string/filename]

sedによる正規表現の構文

sed [options] '/pattern/' [string/filename]

awkによる正規表現の構文

awk [options] '/pattern/' [string/filename]

正規表現構文の構成要素

正規表現構文の主な構成要素は6つあります:

  • キャラクター
  • メタキャラクター
  • 量詞
  • キャラクタークラス
  • グルーピング
  • 見回り

文字: これらのコンポーネントは、任意の単一の文字または複数の文字を使用して、文字列やファイル内の正確なパターンを検索するためのパターンを形成します。たとえば、文字Hはファイル内のHを検索し、同様に、文字列Linuxはファイル内の正確なLinuxという単語を検索します。ただし、-iフラグを使用すると検索が大文字と小文字を区別しなくなります。

メタキャラクター:これらの要素は特殊な文字を含み、特定の機能を持っています。たとえば、ドットメタキャラクターは文字を見つけるために使用され、^は行の開始と一致し、$は行の終わりと一致します。別のメタキャラクターであるパイプa|bは、ファイル内のaとbを一致させるために使用されます。

量化子:これらの要素は、特定のパターンが何回繰り返される必要があるかを見つけるために使用されます。たとえば、疑問符 ? は前の文字をゼロまたは1回だけ繰り返し、他のアスタリスクは前の文字をゼロ回以上繰り返します。

文字クラス:角括弧([])で囲まれた文字のグループは、文字クラスの要素として知られています。例えば、[0-9]は0から9までの数字を示し、同様に[A-Z]はAからZまでのアルファベットの大文字を示します。

グループ化: このコンポーネントは、パターンを丸括弧()にグループ化するのに役立ちます。特に、電話番号やメールアドレスのような繰り返しのシーケンスを見つけるのに便利です。

ルックアラウンド: このコンポーネントは、別のパターンに先行または後続するパターンの正規および負のルックアラウンドを作成するために使用されます。たとえば、a(?=b)は、bの前にあるすべてのaを探します。

Linuxでの正規表現の使用例16選

以下の例は、さまざまなメタキャラクター、量指定子、グループ、およびいくつかのユニークなパターンの使用法を網羅しています。

例1: ドット(.) 表現の使用

ドットは、単一の文字と一致するために使用される正規表現の基本メタキャラクターです。例えば:

grepを使用して:

grep 'U.untu' mytextfile.txt

sedを使用して:

sed -n '/U.untu/p' mytextfile.txt

awkを使用する:

awk '/U.untu/' mytextfile.txt

例 2: キャレット (^) 表現の使用

キャレット^メタキャラクターは、指定されたパターンから始まるすべての行を見つけるために使用されます。例えば:

grepを使用する:

grep '^K' mytextfile.txt

sedを使用する:

sed -n '/^K/p' mytextfile.txt

awkを使用する:

awk '/^K/' mytextfile.txt

上記のコマンドは、K から始まるファイル内のすべてのエントリを出力します。

例3: ドル ($) 表現の使用

このメタキャラクターは、特定の文字で終わるすべての文字列を見つけるために使用されます。例えば:

grepを使用する:

grep 'u$' mytextfile.txt

sedを使用する:

sed -n '/u$/p' mytextfile.txt

awkを使用する:

awk '/u$/' mytextfile.txt

上記のコマンドは、uで終わるファイル内のすべての文字列を生成します。

例4:アスタリスク(*)式の使用

アスタリスク * 演算子は、文字列内の前の文字の出現をゼロ回以上に一致させます。これは {0,} に相当します。例えば:

grepを使用する:

grep 'tu*' mytextfile.txt

sedを使用する:

sed -n '/tu*/p' mytextfile.txt

awkを使用する:

awk '/tu*/' mytextfile.txt

例5: クエスチョンマーク (?) 表現の使用

クエスチョンマーク(?)の量指定子は、前の文字がゼロ回または1回だけ出現するかどうかを検索するために使用されます。これはオプショナルな修飾子として機能します。

grepを使用する:

grep -E 'Ub?' mytextfile.txt

上記のコマンドの -E は拡張正規表現のためのものです。

sedを使用する:

sed -nE '/Ub?/p' mytextfile.txt

上記のコマンドの -E は拡張正規表現用です。

awkを使用する:

awk '/Ub/' mytextfile.txt

アスタリスクと質問符の量子の違いは、以下の画像に示されています。

アスタリスクは、前の文字に一致するすべての文字を検索しますが、クエスチョンマークは前の文字と一度だけ一致します。

例6: バックスラッシュ (\) 表現の使用

このバックスラッシュ \ メタキャラクターは、特別な文字を表すために使用されます。たとえば、アスタリスク * 自体は特別な文字であるため、アスタリスクを文字通り使用するにはバックスラッシュを使用します。

名前にスペースを含むすべてのLinuxディストリビューションをファイルmytextfile.txtで探しましょう。

grepを使用する:

grep '\s' mytextfile.txt

sedを使用する:

sed -n '/\s/p' mytextfile.txt

awkを使用する:

awk '/\s/' mytextfile.txt

さらに、バックスラッシュは他のさまざまなエスケープ文字でも使用されます。

例7:丸括弧()を使用してパターンのグループを作成する

丸括弧() は、その中にある表現のグループを一致させるために使用されます。例を使って理解してみましょう:

grepを使用する:

grep -E '(untu)' mytextfile.txt

sedを使用する:

sed -nE '/(untu)/p' mytextfile.txt

awkを使用する:

awk '/(untu)/' mytextfile.txt

上記のコマンドでは、エンジンがグループ (untu) に一致するエントリを取得しています。このグループは、その後に続く別のパターンとともに使用することもできます。たとえば、(untu) グループを (unt)u に置き換えると、結果は同じになります。

例8: 中かっこ{}を使用した範囲パターンの作成

波括弧 {} は繰り返し量詞です。これらは3つの異なる方法で使用できます:

{x}: {x}回出現する

{x,y} または {min,max}: x回の出現で、y回を超えないこと

{x,}: x回以上の回数で表示

grepを使用する:

grep -E l\{2} mytextfile.txt

sedを使用する:

sed -nE '/l{2}/p' mytextfile.txt

awkを使用する:

awk '/l{2}/' mytextfile.txt

上記のコマンドは、BillやSkillのように、文字lが2回含まれるエントリを見つけます。

例9:\dを使用して数字を見つける

\d式は、文字列やファイル内の数字を含む文字列を見つけるために使用されます。例えば:

grepを使用する:

grep -P '\d' mytextfile.txt

PはPerl互換の正規表現であることを示し、詳細についてはここをお読みください。

sed と awk では、\d は使用できません。なぜなら、sed は POSIX 正規表現であり、Perl PCRE ではないからです。したがって、sed と awk における \d の等価物は [0-9] または [[:digit:]] です。

sedを使用する:

sed -n '/[0-9]/p' mytextfile.txt

または :

sed -n '/[[:digit:]]/' mytextfile.txt

awkを使用する:

awk '/[0-9]/' mytextfile.txt

または :

awk -n '/[[:digit:]]/' mytextfile.txt

例10: 論理OR演算子の使用 |

正規表現は論理ORゲートと同じように機能します。例えば、a|oを使用すると、このパターンはa文字またはo文字を含むすべての単語を見つけることができます。

grepを使用する:

grep -E 'k|a' mytextfile.txt

sedを使用する:

sed -nE '/k|a/p' mytextfile.txt

awkを使用する:

awk '/k|a/' mytextfile.txt

例11:特定の文字数を持つすべての単語を見つけること

特定の文字数を持つすべての単語を見つけるには、ドット(.)を使用できます。ドットメタキャラクターは1文字を見つけるために使用されますが、複数の文字を検索するためにも使用できます。4文字のすべての行を見つけるには、次のようにしてください:

grepを使用する:

grep '^....$' mytextfile.txt

sedを使用する:

sed -n '/^....$/p' mytextfile.txt

awkを使用する:

awk '/^....$/' mytextfile.txt

例 12: ファイルからIPアドレスを見つける

IPアドレスは、正規表現を使用してファイルから抽出したい重要な項目の1つです。IPアドレスにはドットが含まれているため、正規表現を使用して見つけるのは簡単な操作ではありません:ドット(.)をスラッシュでエスケープする必要があります。/etc/hostsファイルからIPアドレスを抽出してみましょう。

grepを使用する:

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

または :

grep -E '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /etc/hosts

sedを使用する:

sed -nE '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/p' /etc/hosts

awkを使用する:

awk '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/' /etc/hosts

例13:小数の発見

10進数は、整数部分と小数点(.)の後に続く小数部分を組み合わせた数です。ファイルから正規表現を使用して10進数を取得するには、以下のコマンドを参照してください:

grepを使用する:

grep -P '^\d*\.\d+$' mytextfile.txt

\d は [[:digit:]] と [0-9] と同等ですが、grepはPCRE正規表現をサポートしているので、-Pフラグを使ってそれを使用できます。

sedを使用する:

sed -nE '/[[:digit:]]*\.[[:digit:]]+$/p' mytextfile.txt

awkを使用する:

awk '/[0-9]*\.[0-9]+$/' mytextfile.txt

上記のコマンドでは[[:digit:]]を[0-9]に置き換えることができます。

例 14: HH:MM 12 時間形式での時間の確認

正規表現はファイル内の時間を見つけるためにも使用できます。grep、sed、およびawkコマンドを使用してファイルから時間を抽出する方法を見てみましょう:

grepを使用する:

grep -E '^(0?[1-9]|1[0-2]):[0-5][0-9]$' mytextfile.txt

sedを使用する:

sed -nE '/^(0?[1-9]|1[0-2]):[0-5][0-9]$/p' mytextfile.txt

awkを使用する:

awk '/^(0?[1-9]|1[0-2]):[0-5][0-9]$/' mytextfile.txt

例15: YYYY-MM-DD形式の日付を見つける

ファイルから時間を抽出するために、次の正規表現をgrepとともに使用します:

grepを使用する:

grep -P '([12]\d{3}:(0[1-9]|1[0-2]):(0[1-9]|[12]\d|3[01]))' mytextfile.txt

sedを使用する:

sed -nE '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]))/p' mytextfile.txt

awkを使用する:

awk '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]))/' mytextfile.txt

例16: パターンの検索と置換

置換は、パターンを見つけて置き換えるために使用される別の正規表現のメソッドです。例えば:

sedを使用する:

構文:

sed -i 's/[pattern]/[replacement]/' [filename]

元のテキストファイルは次の通りです:

コマンドを実行する:

sed -i 's/KaOS/Peepin/' mytextfile.txt

上記のコマンドでは-iは元のファイルを変更するために使用されます。このフラグがないと、ファイルは変更されず、結果がターミナルにのみ表示されます。

ファイルを確認して認証してください:

検索は、式の最後にgを使用することでさらに強化できます。gはすべての出現を置き換えます。一方、これがない場合は最初の出現のみが置き換えられます。

awkを使用する:

構文:

awk '{sub([pattern]/[replacement]); print}' [filename] > [new_filename]

コマンドを実行する:

awk '{sub(Peepin/,"KaOS"); print}' mytextfile.txt > newtextfile.txt

新しいファイルを確認して、確認してください:

Peepinは新しいファイルでKaOSに戻りました。

パターンのすべての出現を置き換えるために、subの代わりにgsubを使用して強化することもできます。

考慮すべきもう一つの重要な点は、awk コマンドは元のファイルを変更することなく、出力をターミナルにのみ表示するということです。結果を保存するには、リダイレクションオペレーターを使用し、ファイル名を指定してください。

正規表現チートシート

正規表現は、多くのメタキャラクタや量指定子を提供して、複雑なパターンを作成し、検索をさらに良くします。一般的に使用される正規表現のルールを一覧にしましょう。

正規表現の文字クラス

量詞と選択肢

アンカー

エスケープ文字

グループとルックアラウンド

結論

正規表現は、ファイルから情報を検索し処理するためのパターンを作成するために使用される文字のシーケンスです。Linuxには、grep、sed、awkなどのさまざまな正規表現エンジンがあります。本ガイドでは、これらの3つのLinuxコマンドを使用した基本から高度な正規表現までを扱います。すべてのLinux正規表現エンジンがすべての正規表現のバリエーションをサポートしているわけではないことに注意が必要です。たとえば、sedとawkはPCREをサポートしていませんが、すべてのエンジンはBRE、ERE、およびPCREをサポートしています。