grepで1つの単語を除外するにはどうすればよいですか?


回答:


802

次のようにgrepの-v(for --invert-match)オプションを使用して実行できます。

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" file持っているラインフィルタしますunwanted_wordgrep XXXXXXXXパターンを持つ行だけが一覧表示されますがXXXXXXXX

編集:

コメントから、を含まないすべての行を一覧表示したいようですunwanted_word。その場合、必要なのは次のとおりです。

grep -v 'unwanted_word' file

2
「不要な単語」を含む行の後のN行も除外するにはどうすればよいですか?-v 'unwanted_word' --after N行とその後ろのN行が含まれているため、役に立ちません。
Andrey Regentov 2014年

-vまたは--invert-match、一致しない行を選択します。あなたの場合grep -v 'unwanted_word' fileまたはgrep --invert-match 'unwanted_word' file
adamski.pro 2016年

上の1行とパターンが一致する下の1行を無視したいのですが、どうすればそれを実現できますか?
Kanji Viroja 2016

素晴らしいが、私は私のレポの状態熟読迅速にgitの中でこれを使用し、魔法のように動作します:git status -s |grep -v "folder_I_dont_care"
benjaminz

3
奇妙なことに、これが一番の答えですが、場合によっては間違っていることもあります。私が検索したい場合はsun、それがされている場合を除きsunrisegrep sun|grep -v sunrise両方が含まれている行をスキップsunし、sunrise一度に、それは私が欲しいものではありません。grep -P 'sun(?!rise)'はるかに優れています。
グリーン

86

私は質問を「単語を一致させるが別の単語を除外するにはどうすればよいですか」と理解しました。1つの解決策は2つのgrepsを直列に並べたものです。

grep "word1" | grep -v "word2"

私の場合:「plot」と「#plot」を区別する必要があります。grepの「word」オプションでは実行できません(「#」は英数字ではありません)。

お役に立てれば。


16
で強調表示するには、順序を逆にする必要がありますword1
Matthew Read

1
その例にファイル名のプレースホルダーを追加することは明確になると思います
patrick

39

オプション付きのgrepPerl正規表現をサポートしている場合は、-P次のことができます(bashの場合、tcshの場合はをエスケープする必要があります!)。

grep -P '(?!.*unwanted_word)keyword' file

デモ:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

私たちは今、すべてを一覧表示してみましょうfoo除き、foo3

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 

これをありがとう、とても便利です!grepコマンドではデフォルトで大文字と小文字が区別されることを述べて
おき

2
grep -v -P正規表現では否定なしでも機能することに注意してください。
cybersoft、2015年

「bashの場合...あなたはエスケープする必要があります!。ありがとう、ありがとう、ありがとう!それが私が欲しかったものです!
ガブリエルステープルズ

36

適切な解決策はgrep -v "word" fileawk同等のものを使用してを使用することです。

awk '!/word/' file

あなたは、あなたが言う、先のより複雑な状況を持って起こる場合は、XXX表示されるようにしてYYY いない表示されるように、その後、awk代わりにいくつかの配管の便利来るgrepのを:

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

もっと複雑なことを言うこともできます。例:XXXまたはのいずれかを含む行が必要ですが、次の行は必要YYYありませんZZZ

awk '(/XXX/ || /YYY/) && !/ZZZ/' file


2
grep -P大きなファイルのソリューションよりもはるかに高速であるように見えます。
MBR 2016年

@MBR grep -PはPerl正規表現を使用することを意味するため、そのパッケージのロードは通常の方法よりもはるかに高価になりますgrep
fedorqui 'SO stop harming'

10

grep -vを使用して一致を反転します。

grep -v "unwanted word" file pattern

6

grepは、一致しない行を選択するための「-v」または「--invert-match」オプションを提供します。

例えば

grep -v 'unwanted_pattern' file_name

これにより、「unwanted_pa​​ttern」のないファイルfile_nameからすべての行が出力されます。

フォルダ内の複数のファイルでパターンを検索する場合は、次のように再帰検索オプションを使用できます

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

ここで、grepは、現在のディレクトリ内のすべてのファイルで「wanted_pa​​ttern」のすべての出現をリストし、それを2番目のgrepに渡して「unwanted_pa​​ttern」をフィルターで除外しようとします。'|' -パイプは、左のプログラムの標準出力(grep -r 'wanted_pa​​ttern' *)を右のプログラムの標準入力(grep -v 'unwanted_pa​​ttern')に接続するようにシェルに指示します。


4

この-vオプションでは、パターンに一致しないすべての行が表示されます。

grep -v ^unwanted_word

-5

たくさんのファイルがあるディレクトリがあります。文字列「speedup」を含まないすべてのファイルを検索したいので、次のコマンドを正常に使用しました。

grep -iL speedup *

1
manページから: "-L、--files-without-match通常の出力を抑制します。代わりに、通常は出力が出力されない各入力ファイルの名前を出力します。 スキャンは最初の一致で停止します。 "(強調私によって)これに注意してください!
xuiqzy 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.