回答:
次のようにgrepの-v
(for --invert-match
)オプションを使用して実行できます。
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file
持っているラインフィルタしますunwanted_word
とgrep XXXXXXXX
パターンを持つ行だけが一覧表示されますがXXXXXXXX
。
編集:
コメントから、を含まないすべての行を一覧表示したいようですunwanted_word
。その場合、必要なのは次のとおりです。
grep -v 'unwanted_word' file
-v 'unwanted_word' --after N
行とその後ろのN行が含まれているため、役に立ちません。
-v
または--invert-match
、一致しない行を選択します。あなたの場合grep -v 'unwanted_word' file
またはgrep --invert-match 'unwanted_word' file
。
git status -s |grep -v "folder_I_dont_care"
sun
、それがされている場合を除きsunrise
、grep sun|grep -v sunrise
両方が含まれている行をスキップsun
し、sunrise
一度に、それは私が欲しいものではありません。grep -P 'sun(?!rise)'
はるかに優れています。
私は質問を「単語を一致させるが別の単語を除外するにはどうすればよいですか」と理解しました。1つの解決策は2つのgrepsを直列に並べたものです。
grep "word1" | grep -v "word2"
私の場合:「plot」と「#plot」を区別する必要があります。grepの「word」オプションでは実行できません(「#」は英数字ではありません)。
お役に立てれば。
word1
。
オプション付きのgrep
Perl正規表現をサポートしている場合は、-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 -v -P
正規表現では否定なしでも機能することに注意してください。
!
」。ありがとう、ありがとう、ありがとう!それが私が欲しかったものです!
適切な解決策はgrep -v "word" file
、awk
同等のものを使用してを使用することです。
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
等
grep -P
大きなファイルのソリューションよりもはるかに高速であるように見えます。
grep -P
はPerl正規表現を使用することを意味するため、そのパッケージのロードは通常の方法よりもはるかに高価になりますgrep
。
grepは、一致しない行を選択するための「-v」または「--invert-match」オプションを提供します。
例えば
grep -v 'unwanted_pattern' file_name
これにより、「unwanted_pattern」のないファイルfile_nameからすべての行が出力されます。
フォルダ内の複数のファイルでパターンを検索する場合は、次のように再帰検索オプションを使用できます
grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'
ここで、grepは、現在のディレクトリ内のすべてのファイルで「wanted_pattern」のすべての出現をリストし、それを2番目のgrepに渡して「unwanted_pattern」をフィルターで除外しようとします。'|' -パイプは、左のプログラムの標準出力(grep -r 'wanted_pattern' *)を右のプログラムの標準入力(grep -v 'unwanted_pattern')に接続するようにシェルに指示します。
たくさんのファイルがあるディレクトリがあります。文字列「speedup」を含まないすべてのファイルを検索したいので、次のコマンドを正常に使用しました。
grep -iL speedup *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"