grepでパターン、ファイル、ディレクトリを除外する方法

公開: 2022-06-29
bashプロンプトを表示するLinuxラップトップ
fatmawati achmad zaenuri / Shutterstock.com

1974年以来、Linux grepコマンドは、人々がファイル内の文字列を見つけるのを支援してきました。 ただし、 grepが完全すぎる場合もあります。 grepにさまざまなことを無視するように指示するいくつかの方法があります。

grepコマンド

grepコマンドは、テキストファイルを検索して、コマンドラインで指定した検索パターンに一致する文字列を探します。 grepの力は、正規表現の使用にあります。 これらを使用すると、明示的に定義するのではなく、探しているものを説明できます。

grepの誕生は、Linuxよりも前のものです。 1970年代初頭にUnixで開発されました。 その名前は、 edラインエディタのg / re / pキーシーケンスに由来します(ちなみに、「ee-dee」と発音されます)。 これは、グローバル、通常のエクスプレス検索、プリントマッチングラインの略です。

grepは、有名な(おそらく、悪名高い)徹底的でひたむきです。 結果として木が見えなくなる可能性があるため、時間を無駄にせずにファイルやディレクトリを検索する場合があります。

Linuxでgrepコマンドを使用する方法
関連Linuxでgrepコマンドを使用する方法

もちろん、grepを統治する方法はあります。パターン、ファイル、ディレクトリを無視するように指示して、grepが検索をより速く完了し、意味のない誤検知に悩まされないようにすることができます。

パターンを除く

grepで検索するには、 catなどの他のプロセスから入力をパイプするか、最後のコマンドラインパラメーターとしてファイル名を指定します。

ルイス・キャロルの詩「ジャバウォックの詩」のテキストを含む短いファイルを使用しています。 これらの2つの例では、検索語「Jabberwock」に一致する行を検索しています。

 cat jabberwocky.txt | grep「Jabberwock」
 grep "Jabberwock" jabberwocky.text 

grepを使用して同じテキストファイルを検索する2つの異なる方法

検索の手がかりに一致する行が一覧表示され、各行の一致する要素が赤で強調表示されます。 それは簡単な検索です。 しかし、「Jabberwock」という単語を含む行を除外して、残りを印刷したい場合はどうでしょうか。

これは、 -v (一致の反転)オプションを使用して実現できます。 これは、検索語と一致しない行をリストします。

 grep -v "Jabberwock" jabberwocky.text 

grepで-v反転検索オプションを使用する

「Jabberwock」を含まない行がターミナルウィンドウに一覧表示されます。

jabberwockという単語を含まないすべての行

必要な数の用語を除外できます。 「Jabberwock」を含む行と「and」を含む行を除外してみましょう。 これを実現するには、 -e (式)オプションを使用します。 使用している検索パターンごとに使用する必要があります。

 grep -v -e "Jabberwock"-e"および"jabberwocky.txt 

grepで複数の検索句を使用する

これに対応して、出力の行数が減少します。

どちらの検索語にも一致しないテキストの行

-E (拡張正規表現)オプションを使用すると、検索パターンを「 | 」と組み合わせることができます。 「これは、このコンテキストではパイプを示すものではなく、論理OR演算子です。

 grep -Ev "Jabberwock | and" jabberwocky.txt 

grepで論理OR演算子を使用する

前の長く巻かれたコマンドで行ったのとまったく同じ出力が得られます。

どちらの検索語にも一致しないテキストの行

明示的な検索の手がかりの代わりに正規表現パターンを使用する場合、コマンドの形式は同じです。 このコマンドは、「ACHT」のセット内の任意の文字で始まるすべての行を除外します。

 grep -Ev "^ ACHT" jabberwocky.txt 

特定の文字で始まるファイルを除外する

パターンを含むが別のパターンも含まない行を表示するには、 grepgrepにパイプします。 「Jabberwock」という単語を含むすべての行を検索してから、「slain」という単語含むすべての行を除外します。

 grep "Jabberwock" jabberwocky.txt | grep -v "slain" 

grepをgrepにパイプして、2回フィルタリングする

ファイルを除外する

grepに、ファイルのコレクション内の文字列またはパターンを探すように依頼できます。 コマンドラインに各ファイルを一覧表示することもできますが、多くのファイルでは、そのアプローチは拡張できません。

 grep "vorpal" verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt 

名前付きファイルのリストを検索する

一致する行を含むファイルの名前が、出力の各行の先頭に表示されることに注意してください。

入力を減らすために、ワイルドカードを使用できます。 しかし、それは直感に反する可能性があります。 これは機能しているようです。

 grep "vorpal" * .txt 

ワイルドカードを使用してファイルのコレクションを検索する

ただし、このディレクトリには、詩とは関係のない他のTXTファイルがあります。 同じコマンド構造で「sword」という単語を検索すると、多くの誤検知が発生します。

 grep "sword" * .txt 

TXTファイルのコレクションから「剣」を検索する

必要な結果は、TXT拡張子を持つ他のファイルからの誤った結果の大洪水によって隠されています。

誤検知の大規模な結果セット

「vorpal」という単語は何にも一致しませんでしたが、「sword」は「password」という単語に含まれているため、一部の疑似ログファイルで何度も見つかりました。

これらのファイルを除外する必要があります。 これを行うには、 --excludeオプションを使用します。 「vol-log-1.txt」という単一のファイルを除外するには、次のコマンドを使用します。

 grep --exclude = vol-log-1.txt "sword" * .txt

この例では、「vol」で始まる名前の複数のログファイルを除外します。 必要な構文は次のとおりです。

 grep --exclude = vol * .txt "sword" * .txt 

ワイルドカードを含むファイルを除外する

-R (dereference-recursive)オプションを使用すると、 grepはディレクトリツリー全体を検索します。 デフォルトでは、それらの場所にあるすべてのファイルを検索します。 除外したいファイルには複数の種類がある可能性があります。

このテストマシンの現在のディレクトリの下には、ログファイル、CSVファイル、およびMDファイルを含むネストされたディレクトリがあります。 これらはすべて、除外するタイプのテキストファイルです。 ファイルタイプごとに--excludeオプションを使用することもできますが、ファイルタイプをグループ化することで、より効率的に目的を達成できます。

このコマンドは、CSVまたはMD拡張子を持つすべてのファイル、および名前が「vol」または「log」で始まるすべてのTXTファイルを除外します。

 grep -R --exclude = *。{csv、md} --exclude = {vol *、log*}。txt"sword" / home / dave / data / 

複数の--exclude句とファイル名のグループ化を使用する

ディレクトリを除く

無視したいファイルがディレクトリに含まれていて、検索したいファイルがそれらのディレクトリにない場合は、それらのディレクトリ全体を除外できます。

--exclude-dirオプションを使用し、無視するディレクトリに名前を付けることを除いて、概念はファイルを除外する概念と非常に似ています。

 grep -R --exclude-dir = backup "vorpal" / home / dave / data 

検索からディレクトリを除外する

「backup」ディレクトリを除外しましたが、「backup2」という別のディレクトリを検索しています。

1つのコマンドで--exclude-dirオプションを複数回使用できるのは当然のことです。 除外されたディレクトリへのパスは、検索を開始するディレクトリを基準にして指定する必要があることに注意してください。ファイルシステムのルートからの絶対パスは使用しないでください。

 grep -R --exclude-dir = backup --exclude-dir = backup2 "vorpal" / home / dave / data 

検索から2つのディレクトリを除外する

グループ化も使用できます。 同じことをより簡潔に達成することができます:

 grep -R --exclude-dir = {backup、backup2} "vorpal" / home / dave / data 

グループ化によるディレクトリの除外

同じコマンドでファイルとディレクトリの除外を組み合わせることができます。 ディレクトリからすべてのファイルを除外し、検索されるディレクトリから特定のファイルタイプを除外する場合は、次の構文を使用します。

 grep -R --exclude = *。{csv、md} --exclude-dir = backup / archive "frumious" / home / dave / data 

同じコマンドでファイルタイプとディレクトリを除外する

時々それはあなたが除外するものです

grepを使用すると、干し草の山から針を見つけようとしているように感じることがあります。 干し草の山を取り除くことは大きな違いになります。

関連: Linuxで正規表現(regexes)を使用する方法