基本正規表現によるパターンマッチング
このステップでは、grep で基本正規表現 (BRE: Basic Regular Expressions) を使用して、より柔軟な検索パターンを作成する方法を探ります。BRE では、メタ文字と呼ばれる特定の文字が、その文字通りの意味を超えた特別な意味を持ちます。これにより、固定された文字列だけでなく、パターンに一致させることができます。
ここでは、2 つの基本的なメタ文字 * (アスタリスク) と . (ドット) について説明します。
まず、アスタリスク (*) を見てみましょう。このメタ文字は、直前の文字の 0 回以上の繰り返しに一致します。実際に動作を確認するために、次のコマンドを実行してください。シェルが * をファイルのワイルドカードとして展開しようとするのを防ぎ、リテラルパターンとして扱うように、パターンをシングルクォート ('roo*') で囲みます。
grep 'roo*' /etc/passwd
出力にはおそらく複数の行が表示されます。
root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
この結果を分析してみましょう。パターン 'roo*' は、ro の後に 0 個以上の o が続く行を検索します。
root 行は、roo (ro の後に 1 つの o) を含んでいるため一致します。
proxy 行は、"proxy" 内に ro (ro の後に 0 個の o) を含んでいるため一致します。
systemd-timesync 行は、"Synchronization" 内に ro を含んでいるため一致します。
rtkit 行は、"proc" 内に ro を含んでいるため一致します。
operator 行は、"operator" と "/root" の両方に ro を含んでいるため一致します。
次に、ドット (.) メタ文字を見てみましょう。ドットは任意の 1 文字に一致します。次のコマンドを実行して、動作がどのように異なるかを確認してください。
grep 'ro.' /etc/passwd
今回は、次のような一致が表示されます。
root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
パターン 'ro.' は、ro の後に正確に 1 文字の何らかの文字が続く行を検索します。
root 行は、"root" 内で ro の後に o が続くため一致します。
proxy 行は、"proxy" 内で ro の後に x が続くため一致します。
systemd-timesync 行は、"Synchronization" 内で ro の後に n が続くため一致します。
rtkit 行は、"proc" 内で ro の後に c が続くため一致します。
operator 行は、"operator" と "/root" 内で ro の後に別の文字が続くため一致します。
出力を比較することで、正規表現の威力を明確に理解できます。'roo*' と 'ro.' の両方のパターンが複数の行に一致していますが、異なるメタ文字を使用することで、さまざまな方法で検索を微調整できることがわかります。