grepでパターン、ファイル、ディレクトリを除外する方法
公開: 2022-06-29 1974年以来、Linux grep
コマンドは、人々がファイル内の文字列を見つけるのを支援してきました。 ただし、 grep
が完全すぎる場合もあります。 grep
にさまざまなことを無視するように指示するいくつかの方法があります。
grepコマンド
grep
コマンドは、テキストファイルを検索して、コマンドラインで指定した検索パターンに一致する文字列を探します。 grep
の力は、正規表現の使用にあります。 これらを使用すると、明示的に定義するのではなく、探しているものを説明できます。
grep
の誕生は、Linuxよりも前のものです。 1970年代初頭にUnixで開発されました。 その名前は、 ed
ラインエディタのg / re / pキーシーケンスに由来します(ちなみに、「ee-dee」と発音されます)。 これは、グローバル、通常のエクスプレス検索、プリントマッチングラインの略です。
grep
は、有名な(おそらく、悪名高い)徹底的でひたむきです。 結果として木が見えなくなる可能性があるため、時間を無駄にせずにファイルやディレクトリを検索する場合があります。
もちろん、grepを統治する方法はあります。パターン、ファイル、ディレクトリを無視するように指示して、grepが検索をより速く完了し、意味のない誤検知に悩まされないようにすることができます。
パターンを除く
grep
で検索するには、 cat
などの他のプロセスから入力をパイプするか、最後のコマンドラインパラメーターとしてファイル名を指定します。
ルイス・キャロルの詩「ジャバウォックの詩」のテキストを含む短いファイルを使用しています。 これらの2つの例では、検索語「Jabberwock」に一致する行を検索しています。
cat jabberwocky.txt | grep「Jabberwock」
grep "Jabberwock" jabberwocky.text
検索の手がかりに一致する行が一覧表示され、各行の一致する要素が赤で強調表示されます。 それは簡単な検索です。 しかし、「Jabberwock」という単語を含む行を除外して、残りを印刷したい場合はどうでしょうか。
これは、 -v
(一致の反転)オプションを使用して実現できます。 これは、検索語と一致しない行をリストします。
grep -v "Jabberwock" jabberwocky.text
「Jabberwock」を含まない行がターミナルウィンドウに一覧表示されます。
必要な数の用語を除外できます。 「Jabberwock」を含む行と「and」を含む行を除外してみましょう。 これを実現するには、 -e
(式)オプションを使用します。 使用している検索パターンごとに使用する必要があります。
grep -v -e "Jabberwock"-e"および"jabberwocky.txt
これに対応して、出力の行数が減少します。
-E
(拡張正規表現)オプションを使用すると、検索パターンを「 |
」と組み合わせることができます。 「これは、このコンテキストではパイプを示すものではなく、論理OR
演算子です。
grep -Ev "Jabberwock | and" jabberwocky.txt
前の長く巻かれたコマンドで行ったのとまったく同じ出力が得られます。
明示的な検索の手がかりの代わりに正規表現パターンを使用する場合、コマンドの形式は同じです。 このコマンドは、「ACHT」のセット内の任意の文字で始まるすべての行を除外します。
grep -Ev "^ ACHT" jabberwocky.txt
パターンを含むが別のパターンも含まない行を表示するには、 grep
をgrep
にパイプします。 「Jabberwock」という単語を含むすべての行を検索してから、「slain」という単語も含むすべての行を除外します。
grep "Jabberwock" jabberwocky.txt | grep -v "slain"
ファイルを除外する
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拡張子を持つ他のファイルからの誤った結果の大洪水によって隠されています。
「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-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
グループ化も使用できます。 同じことをより簡潔に達成することができます:
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)を使用する方法