複数の文字列での grep の使用

Niraj Menon 2022年4月12日
複数の文字列での grep の使用

Bash のスクリプトライターをして、関連情報を得るためにテキストの壁を解析する必要がある状況に陥る可能性があります。その情報が順序付けられていない場合があります。そのため、関連するすべてのデータを取得するためのパターンを理解する必要があります。

Linux でのこの作業に最適なツールは、1973 年頃に Ken Thompson によって作成された grep です。grep はすべての最新の UNIX システムで使用できます。

このチュートリアルでは、単一のフレーズのキャプチャから、正規表現または固定文字列を使用した複数のパターンのキャプチャなどの基本的な例から、Bash コマンドラインを想定した grep の使用について幅広く説明します。

grep を使用して単純なフレーズをキャプチャする

grep を使用する最も簡単な方法は、ファイル内のフレーズの出現を見つけることです。ターゲットの単語とファイルが与えられると、次のようにファイル内の単語を検索できます。

user@linux:~$ cat file.txt
UNIX
tutorial
word
words
sword
tests
Linux

user@linux:~$ grep word file.txt
word
words
sword

上記のように、サブストリング word を含むすべての単語がキャプチャされます。

図のように、プログラムの出力をキャプチャして、フレーズの出力を grep することもできます。例としてファイルを引き続き使用しますが、stdout に出力する任意のプログラムでこれを行うことができます。

user@linux:~$ cat file.txt | grep word
word
words
sword

grep が完全に一致するフレーズのみを出力する(つまり、周囲にスペースがあり、他の単語のサブストリングではない)場合は、-w/--word-regexp フラグを使用して全体を有効にすることができます単語のマッチング。

-x/--line-regexp を使用してフレーズが 1 行で表示される場合は、同じアイデアを使用してフレーズを照合できます。

user@linux:~$ cat file.txt | grep -w word
word

複数の文字列を持つ grep

改行で区切られた複数のフレーズを使用して、プログラムからファイルまたはテキストストリーム内の関連する一致をキャプチャするには、-F/--fixed-strings を使用してそれらを指定できます。

少数の一致の代わりに、以下に示す文字列を渡すことができます。ドル記号は改行を示します。

grep -F "words$word" file.txt
# or
fgrep "words$word" file.txt

ファイルからのより大きなリストの場合は、cat を使用してファイルを grep の引数として出力し、同じ構文を再利用できます。

user@linux:~$ cat match.txt
word
sword
user@linux:~$ fgrep "$(cat match.txt)" file.txt
word
words
sword

正規表現を使用した grep

このセクションは、正規表現に精通している場合に非常に役立ちます。-E/--extended-regexp を使用すると、RegEx パターンを指定して、単一または複数のフレーズではキャッチできない、より複雑なフレーズをキャプチャできます。

電子メールアドレスと URL をランダムに含むファイルがある場合、grep コマンドを個別に呼び出すことで、電子メールまたは URL に一致する行を除外したい場合があります。

電子メールをキャプチャするための単純な、ほとんど単純な RegEx パターンは、[^\@]+\@[^\.]+.*になります。これを grep で使用するには、次のようにします。

user@linux:~$ cat file.txt 
user@linux.com
linux@torvalds.com
not a URL or email
https://www.google.com/
https://apple.com/
not an email or URL
user@linux:~$ egrep '[^\@]+\@[^\.]+.*' file.txt
user@linux.com
linux@torvalds.com

RegEx を利用する別の例は、複数のパターンを指定して、それらのすべてがファイルに存在するかどうかを確認することです。これを行うには、次のパターンがあります。

以下の例で使用されている 2つの正規表現パターンの比較に注意してください。1つは OR 演算子を使用し、もう 1つは行に 3つの単語すべてが含まれている必要があるように記述されています。

user@linux:~$ cat file.txt
apple banana grape
bus lamppost bench
apple bench grape
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P 'apple|banana|grape' file.txt
apple banana grape
apple bench grape
banana grape apple
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P '^(?=.*apple)(?=.*banana)(?=.*grape)' file.txt
apple banana grape
banana grape apple

UNIX システムで使用できる文字列照合ツールは grep だけではないことに注意してください。awk を使用して複雑なパターンをキャプチャすることもできます。sed を使用して、一致基準に基づいてフレーズを置き換えることもできます。

このチュートリアルは、UNIX 端末またはこのページman grep と入力してアクセスできる grep マニュアルページから情報を導き出しました。