複数の文字列での 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
マニュアルページから情報を導き出しました。