Answers:
您可以使用grep的-v
(for --invert-match
)选项来做到这一点:
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file
将过滤具有的行,unwanted_word
并且grep XXXXXXXX
仅列出带有pattern的行XXXXXXXX
。
编辑:
从您的评论看来,您想列出所有不带的行unwanted_word
。在这种情况下,您需要做的是:
grep -v 'unwanted_word' file
-v 'unwanted_word' --after N
无济于事,因为它包括第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)'
好多了。
我将问题理解为“我如何匹配一个单词,但排除另一个单词”,为此,一个解决方案是两次串联:第一个grep找到想要的“ word1”,第二个grep排除“ word2”:
grep "word1" | grep -v "word2"
在我的情况下:我需要区分“ gprep”和“ #plot”,这是grep的“ word”选项无法实现的(“#”不是字母数字)。
希望这可以帮助。
word1
。
如果您grep
支持带有-P
选项的Perl正则表达式,则可以执行此操作(如果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
s:
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 regexp,因此加载该程序包的费用将比normal贵grep
。
grep提供'-v'或'--invert-match'选项来选择不匹配的行。
例如
grep -v 'unwanted_pattern' file_name
这将从文件file_name中输出所有行,其中没有'unwanted_pattern'。
如果要在一个文件夹中的多个文件中搜索模式,则可以按以下方式使用递归搜索选项
grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'
在这里,grep将尝试列出当前目录中所有文件中所有'wanted_pattern'的出现,并将其传递给第二个grep以过滤掉'unwanted_pattern'。'|' -管道将告诉Shell将左程序的标准输出(grep -r'wanted_pattern'*)连接到右程序的标准输入(grep -v'unwanted_pattern')。
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"