web-dev-qa-db-ja.com

Grepで1つのWordを除外するにはどうすればいいですか?

私は何かが必要です:

grep ^"unwanted_Word"XXXXXXXX
395
john

Grepの-vオプションを使ってそれを行うこともできます。

grep -v "unwanted_Word" file | grep XXXXXXXX

grep -v "unwanted_Word" fileunwanted_Wordを持つ行をフィルター処理し、grep XXXXXXXXはパターンXXXXXXXXを持つ行のみをリストします。

編集:

あなたのコメントから、unwanted_Wordを付けずにすべての行をリストしたいようです。その場合あなたが必要とするすべては:

grep -v 'unwanted_Word' file
678
codaddict

私は質問を「どのようにしてWordにマッチさせるが他のものを除外する」として理解しました。そのための1つの解決策は2つの連続したgrepです。

grep "Word1" | grep -v "Word2"

私の場合は、 "plot"と "#plot"を区別する必要がありますが、grepの "Word"オプションではできません( "#"は英数字ではありません)。

お役に立てれば。

75
JPGConnolly

あなたのgrep-PオプションでPerlの正規表現をサポートしているならば、あなたはすることができます(bashなら; tcshなら、あなたは!をエスケープする必要があります):

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

デモ:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

foo3を除くすべてのfooをリ​​ストしましょう。

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

適切な解決策は、awkと同等のgrep -v "Word" fileを使用することです。

awk '!/Word/' file

しかし、XXXを出現させ、YYY not を出現させるなど、もっと複雑な状況が発生する可能性がある場合は、awkをいくつかgrepをパイプ処理する代わりに使用すると便利です。

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

もっと複雑なことも言えます。たとえば、XXXまたはYYYのいずれかを含み、ZZZを含まない行が必要です。

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

等.

28
fedorqui

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

grep -v "unwanted Word" file pattern
10
garima

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

例えば.

grep -v 'unwanted_pattern' file_name

これにより、ファイル 'ファイル名'からすべての行が出力されます。ファイル ''不要なパターン 'はありません。

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

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

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

4

-vオプションは、パターンと一致しないすべての行を表示します。

grep -v ^unwanted_Word
4
st0le