ウェブサイト検索

Linuxシェルでファイル内の文字列を検索するためにgrepを使用する方法


GREPコマンド - 概要

Linuxのgrepコマンドは、特定のパターンを検索するためにファイルやテキストストリームを検索する強力なテキスト検索ユーティリティです。これは「グローバル正規表現プリント」の略で、単純なテキスト文字列やより複雑な正規表現による検索をサポートしています。このコマンドは、出力をフィルタリングし精製するために他のコマンドと組み合わせて使用されることが多いです。デフォルトでは、grepはパターンを含むすべての行を返しますが、大文字小文字の区別、出現回数のカウント、ディレクトリを再帰的に検索するなど、検索をカスタマイズするためのさまざまなオプションを提供します。これにより、システム管理者、開発者、Unixのような環境で大規模なデータセットを扱うすべての人にとって不可欠なツールとなっています。

grepコマンドは、指定された単語/文字列に一致する行をテキストまたはファイル内で検索するために主に使用されます。デフォルトでは、grepは一致した行を表示し、1つまたは複数の正規表現に一致するテキストの行を検索するために使用できます。また、一致した行のみを出力します。

前提条件

grep コマンドは、どの Linux ディストリビューションにも含まれている基本的なユーティリティの一部であるため、AlmaLinux、CentOS、Debian、Linux Mint、Ubuntu、RHEL、および RockyLinux においてはデフォルトでプリインストールされています。

基本的なgrepコマンドの構文

基本的なgrepコマンドの構文は次の通りです:

grep 'word' filename
grep 'word' file1 file2 file3
grep 'string1 string2'  filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileName

ファイル内検索のためのgrepコマンドの使い方

最初の例では、Linuxのpasswdファイルでユーザー「tom」を検索します。「tom」ユーザーのために/etc/passwdファイルを検索するには、次のコマンドを入力する必要があります:

grep tom /etc/passwd

以下がサンプル出力です:

tom:x:1000:1000:tom,,,:/home/tom:/bin/bash

grepに単語の大文字と小文字を無視するよう指示するオプションがあります。つまり、-iオプションを使うと、abc、Abc、ABC、そしてすべての可能な組み合わせを一致させることができます。

grep -i "tom" /etc/passwd

grepの再帰的使用

ディレクトリ階層に多数のテキストファイルがある場合、例えば /etc/apache2/ にあるApacheの設定ファイルなどで、特定のテキストが定義されているファイルを見つけたい場合は、grepコマンドの-rオプションを使用して再帰的な検索を行います。これは、ディレクトリ /etc/apache2/ とそのすべてのサブディレクトリにおいて文字列「197.167.2.9」を含むファイルを再帰的に検索する操作を実行します(以下のように)。

grep -r "mydomain.com" /etc/apache2/

あるいは、次のコマンドを使用することができます:

grep -R "mydomain.com" /etc/apache2/

以下はNginxサーバーでの類似検索のサンプル出力です。

grep -r "mydomain.com" /etc/nginx/
/etc/nginx/sites-available/mydomain.com.vhost:        if ($http_host != "www.mydomain.com") {

ここでは、mydomain.com の結果が見つかったファイル名(たとえば /etc/nginx/sites-available/mydomain.com.vhost)の前に別の行で表示されます。出力データにファイル名を含めないようにするには、以下で説明するように -h オプションを使用することで簡単に抑制できます:grep -h -R "mydomain.com" /etc/nginx/. 以下はサンプル出力です:

grep -r "mydomain.com" /etc/nginx/
if ($http_host != "www.mydomain.com") {

grepを使用して単語のみを検索する

abcを検索しているとき、grepはkbcabc、abc123、aarfbc35などのさまざまなものにマッチし、単語の境界を無視します。grepコマンドを使用して、完全な単語(abcとのみマッチするもの)を含む行のみを選択するように強制することができます。以下に示すように:

grep -w "abc" file.txt

例 :

二つの異なる単語を検索するためにgrepを使用する

2つの異なる単語を検索するには、以下に示すようにegrepコマンドを使用する必要があります:

egrep -w 'word1|word2' /path/to/file

一致した単語の行数をカウントする

grep コマンドは、-c (カウント) オプションを使用して、各ファイルに対して特定のパターンが一致した回数を報告する能力があります (下記に示す通り):

grep -c 'word' /path/to/file

さらに、ユーザーは出力される各行の前に、元のテキストファイルから取得された行の番号を付ける '-n' オプションを使用することができます(以下に示すように):

grep -n 'root' /etc/passwd

以下はサンプル出力です:

1:root:x:0:0:root:/root:/bin/bash

Grepの反転マッチ

ユーザーは -v オプションを使用して一致を反転させることができます。これは、指定された単語を含まない行のみが一致することを意味します。たとえば、次のコマンドを使用して "par" という単語を含まないすべての行を印刷します。

grep -v par /path/to/file

一致するファイルの名前のみをリストする方法

特定の単語、例えば「primary」と言う単語が含まれるファイル名を一覧表示するには、-lオプションを使用する必要があります。次のコマンドを使ってください:

grep -l 'primary' *.c

最後に、grepに特定の色で出力を表示するよう強制するオプションがあります。次のコマンドを使用してください:

grep --color root /etc/passwd

以下にサンプル出力を示します。

grep コマンドが複数の検索パターンを処理する方法

特定のファイル(またはファイルのセット)内で複数のパターンを検索したい場合があるかもしれません。このような状況では、grepが提供する'-e'コマンドラインオプションを使用するべきです。

例えば、現在の作業ディレクトリにあるすべてのテキストファイルの中で「how」、「to」、そして「forge」という単語を検索したい場合、以下のように行うことができます:

grep -e how -e to -e forge *.txt

こちらが実行中のコマンドです:

「<em>-e</em>」コマンドラインオプションは、パターンがハイフン(-)で始まるシナリオにおいても役立ちます。例えば、「-how」を検索したい場合、次のコマンドは役に立ちません:

grep -how *.txt

それは、-e コマンドラインオプションを使用する時であり、この場合、コマンドはあなたが何を検索しようとしているのかを正確に理解します:

grep -e -how *.txt

こちらが両方のコマンドの動作です:

grepの出力を特定の行数に制限する方法

特定の行数にgrepの出力を制限したい場合は、<em>-m</em>コマンドラインオプションを使用してそれを行うことができます。たとえば、testfile1.txtで「how」という単語を検索したいとします。このファイルには次の行が含まれています:

しかし、要求はgrepが検索パターンを含む3行見つけた後に検索を停止することです。これを行うには、次のコマンドを実行できます:

grep "how" -m3 testfile1.txt

こちらが実行中のコマンドです:

次に、コマンドのマニュアルページには次のように書かれています:

If the input is standard input from a regular file, and NUM matching lines are output, grep ensuresthat the standard input is positioned to just after the last matching line before exiting, regardless of the presence of trailing context lines. This enables a calling process to resume a search.

例えば、ループがあるbashスクリプトがあり、ループの各反復ごとに1つの一致を取得したい場合は、'grep -m1'を使用すれば必要なことができます。

grepがファイルからパターンを取得する方法

必要であれば、grepコマンドにファイルからパターンを取得させることもできます。このツールの-fコマンドラインオプションを使用すると、これが可能になります。

例えば、現在のディレクトリ内のすべての.txtファイルに「how」と「to」という単語を検索したいが、これらの入力文字列を「input」という名前のファイルを通じて供給したいとします。その場合、次のようにすることができます:

grep -f input *.txt

こちらが実行中のコマンドです:

grepが検索パターンと完全に一致する行のみを表示する方法

今まで、grepはデフォルトで検索パターンを含む完全な行を一致させて表示することがわかりました。しかし、grepが検索パターンと完全に一致する行のみを表示する必要がある場合、これを'-x'コマンドラインオプションを使用して行うことができます。

例えば、testfile1.txtファイルに以下の行が含まれているとします:

そして、探したいパターンは「元気ですか?」です。このパターンと完全に一致する行だけをgrepが表示するようにするには、次のように使用します:

grep -x "how are you?" *.txt

こちらが実行中のコマンドです:

grepの出力に何も表示させないようにする方法

grepコマンドが出力に何も生成しない場合があるかもしれません。その代わりに、コマンドの終了ステータスに基づいて一致が見つかったかどうかを知りたいだけです。これは、-qコマンドラインオプションを使用して達成できます。

-qオプションは出力をミュートしますが、ツールの終了ステータスは'echo $?'コマンドで確認できます。grepの場合、コマンドは成功した時(つまり、一致が見つかった場合)に'0'のステータスで終了し、一致が見つからなかった場合は'1'のステータスで終了します。

以下のスクリーンショットは、成功したシナリオと失敗したシナリオの両方を示しています:

検索パターンを含まないファイル名を表示するgrepの使い方

デフォルトでは、grepコマンドは検索パターンを含むファイルの名前(および一致した行)を表示します。これはこのツールに期待されることなので非常に論理的です。ただし、検索パターンを含まないファイルの名前を取得する必要がある場合もあります。

これはgrepでも可能です - -Lオプションを使うことで実現できます。したがって、たとえば、現在のディレクトリ内の「how」という単語を含まないすべてのテキストファイルを見つけるには、次のコマンドを実行できます:

grep -L "how" *.txt

こちらが実行中のコマンドです:

grepによって生成されたエラーメッセージを抑制する方法

必要に応じて、grepが出力に表示するエラーメッセージを無視するように強制することができます。これは、-sコマンドラインオプションを使用することで実行できます。例えば、grepが遭遇するディレクトリに関連するエラー/警告を生成する次のシナリオを考えてみましょう:

このようなシナリオでは、-s コマンドラインオプションが役立ちます。以下をご覧ください。

なので、エラー/警告がミュートされたことがわかります。

grepを使ってディレクトリを再帰的に検索する方法

前のポイントで使用された例から明らかなように、grepコマンドはデフォルトでは再帰的な検索を行いません。grep検索を再帰的にするには、-dコマンドラインオプションを使用し、その値に'recurse'を渡してください。

grep -d recurse "how" *

注1: 前のポイントで議論したディレクトリ関連のエラー/警告メッセージも—dオプションを使うことでミュートすることができます—していただくことは、値'skip'を渡すだけです。

注意 2: 再帰検索からパターンDIRに一致するディレクトリを除外するには、'--exclude-dir=[DIR]'オプションを使用してください。

grepでファイル名をNULL文字で終わらせる方法

既に議論したように、grepの-lコマンドラインオプションは、出力にファイル名のみを表示したい場合に使用されます。例えば:

さて、上記の出力の各名前は改行文字によって区切られていることを知っておくべきです。これを確認する方法は次のとおりです:

出力をファイルにリダイレクトし、その後ファイルの内容を印刷します。

したがって、catコマンドの出力はファイル名の間に改行文字が存在することを確認しています。

しかし、あなたがすでに知っているかもしれませんが、改行文字はファイル名の一部でもあります。したがって、ファイル名に改行が含まれ、改行で区切られたり終了したりするケースを扱うと、grepの出力を扱うのが難しくなります(特にスクリプトを介して出力にアクセスする場合)。

区切り/終了文字が改行でない方が良いでしょう。さて、grepがファイル名の後に改行ではなくNULL文字が続くことを保証するコマンドラインオプション-Zを提供していることを知って嬉しいでしょう。

したがって、私たちの場合、コマンドは次のようになります:

grep -lZ "how" *.txt

NULL文字の存在を確認する方法は次のとおりです:

次に、知っておくべき関連するコマンドラインオプションがあります:

 -z, --null-data
Treat the input as a set of lines, each terminated by a zero byte (the ASCII NUL character) insteadof a newline. Like the -Z or --null option, this option can be used with commands like sort -z to process arbitrary file names.

ログファイルのエラーを見つけるためにGREPを使用する方法

grepは、サービスのエラーをデバッグする際のLinux管理者のスイスアーミーナイフです。ほとんどのLinuxサービスには、エラーを報告するログファイルがあります。これらのログファイルは巨大なことがあり、grepは接続しているシステムのIPアドレス、エラーストリング、またはmail.logにある影響を受けたメールユーザーのメールアドレスなどを検索するための、多用途で高速なコマンドです。

例:

特定のメールアドレスに関連する接続を検索します。ここでは、'[email 'がサーバーのmail.logファイルにあります。

grep [email  /var/log/mail.log

結果 :

Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17596, TLS, session=<3uoa5ffQovld3Uep>
Aug 22 09:45:10 mail dovecot: pop3([email )<17596><3uoa5ffQovld3Uep>: Disconnected: Logged out top=0/0, retr=1/6647, del=1/1, size=6630
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17673, TLS, session=<fIIx6PfQkuBd3Uep>
Aug 22 09:45:10 mail dovecot: pop3([email )<17673><fIIx6PfQkuBd3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17868, TLS, session=<bd5L7ffQPsld3Uep>
Aug 22 09:45:10 mail dovecot: pop3([email )<17868><bd5L7ffQPsld3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email >, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17964, TLS, session=<sbpn7vfQevpd3Uep>
Aug 22 09:45:10 mail dovecot: pop3([email )<17964><sbpn7vfQevpd3Uep>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Aug 22 09:45:10 mail postfix/smtpd[6932]: NOQUEUE: reject: RCPT from unknown[1.2.3.4]: 504 5.5.2 <1.2.3.4>: Helo command rejected: need fully-qualified hostname; from=<[email > to=<[email > proto=ESMTP helo=<1.2.3.4>

このメールアドレスの接続に対してログファイルを継続的に監視するには、tailコマンドとgrepコマンドを次のように組み合わせます:

tail -f /var/log/mail.log | grep [email 

ウォッチ機能を終了するには、[strg] + cキーを押してください。

さらにGREPコマンドの例

このLinuxコマンドの使用例は、私たちの第二のGREPコマンドチュートリアルにもさらにたくさんあります。

  • grepを使用してファイル内でパターン検索を行う方法

関連記事: