我需要这样的东西:
grep ^"unwanted_word"XXXXXXXX
nlejzf6q1#
您可以使用grep的-v(对于--invert-match)选项来执行此操作,如下所示:
-v
--invert-match
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file将过滤具有unwanted_word的线,并且grep XXXXXXXX将仅列出具有模式XXXXXXXX的线。
grep -v "unwanted_word" file
unwanted_word
grep XXXXXXXX
XXXXXXXX
从您的注解看,您似乎想列出所有没有unwanted_word的行。在这种情况下,您需要做的就是:
grep -v 'unwanted_word' file
a64a0gku2#
我把这个问题理解为“我如何匹配一个单词但排除另一个单词”,对于这个问题,一个解决方案是两个连续的grep:第一个grep查找所需的“word1”,第二个grep排除“word2”:
grep "word1" | grep -v "word2"
在我的例子中:我需要区分“plot”和“#plot”,而grep的“word”选项不能做到这一点(“#”不是字母数字)。
kulphzqa3#
如果您的grep支持Perl正则表达式,并且带有-P选项,则可以执行(如果bash;如果是tcsh,则需要转义!):
grep
-P
!
grep -P '(?!.*unwanted_word)keyword' file
演示:
$ cat file foo1 foo2 foo3 foo4 bar baz
现在让我们列出除foo3之外的所有foo
foo3
foo
$ grep -P '(?!.*foo3)foo' file foo1 foo2 foo4 $
6bc51xsx4#
正确的解决方案是使用grep -v "word" file及其等价的awk:
grep -v "word" file
awk
awk '!/word/' file
但是,如果您碰巧遇到了一个更复杂的情况,比如说,您希望XXX出现而YYY * 不 * 出现,那么awk就很方便,而不必管道连接几个grep:
XXX
YYY
awk '/XXX/ && !/YYY/' file # ^^^^^ ^^^^^^ # I want it | # I don't want it
你甚至可以说一些更复杂的话。例如:我希望这些行包含XXX或YYY,但不包含ZZZ:
ZZZ
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
等等。
xqnpmsa85#
使用grep -v进行反向匹配:
grep -v "unwanted word" file pattern
9ceoxa926#
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'。|' - pipe将告诉shell将左边程序的标准输出(grep -r 'wanted_pattern' *)连接到右边程序的标准输入(grep -v 'unwanted_pattern ')。
xmd2e60i7#
-v选项将向您显示所有与模式不匹配的行。
grep -v ^unwanted_word
bf1o4zei8#
我使用grep -vw "^/"排除了根(“/”)挂载点。
grep -vw "^/"
# cat /tmp/topfsfind.txt| head -4 |awk '{print $NF}' / /root/.m2 /root /var # cat /tmp/topfsfind.txt| head -4 |awk '{print $NF}' | grep -vw "^/" /root/.m2 /root /var
zynd9foi9#
我有一个目录,里面有很多文件。我想找到所有不包含字符串“speedup”的文件,所以我成功地使用了下面的命令:
grep -iL speedup *
9条答案
按热度按时间nlejzf6q1#
您可以使用grep的
-v
(对于--invert-match
)选项来执行此操作,如下所示:grep -v "unwanted_word" file
将过滤具有unwanted_word
的线,并且grep XXXXXXXX
将仅列出具有模式XXXXXXXX
的线。从您的注解看,您似乎想列出所有没有
unwanted_word
的行。在这种情况下,您需要做的就是:a64a0gku2#
我把这个问题理解为“我如何匹配一个单词但排除另一个单词”,对于这个问题,一个解决方案是两个连续的grep:第一个grep查找所需的“word1”,第二个grep排除“word2”:
在我的例子中:我需要区分“plot”和“#plot”,而grep的“word”选项不能做到这一点(“#”不是字母数字)。
kulphzqa3#
如果您的
grep
支持Perl正则表达式,并且带有-P
选项,则可以执行(如果bash;如果是tcsh,则需要转义!
):演示:
现在让我们列出除
foo3
之外的所有foo
6bc51xsx4#
正确的解决方案是使用
grep -v "word" file
及其等价的awk
:但是,如果您碰巧遇到了一个更复杂的情况,比如说,您希望
XXX
出现而YYY
* 不 * 出现,那么awk
就很方便,而不必管道连接几个grep
:你甚至可以说一些更复杂的话。例如:我希望这些行包含
XXX
或YYY
,但不包含ZZZ
:等等。
xqnpmsa85#
使用grep -v进行反向匹配:
9ceoxa926#
grep提供了“-v”或“--invert-match”选项来选择不匹配的行。
例如:
这将输出文件file_name中没有'unwanted_pattern'的所有行。
如果要在一个文件夹内的多个文件中搜索模式,可以使用递归搜索选项,如下所示
这里grep将尝试列出当前目录中所有文件中出现的所有'wanted_pattern',并将其传递给第二个grep以过滤掉'unwanted_pattern'。|' - pipe将告诉shell将左边程序的标准输出(grep -r 'wanted_pattern' *)连接到右边程序的标准输入(grep -v 'unwanted_pattern ')。
xmd2e60i7#
-v
选项将向您显示所有与模式不匹配的行。bf1o4zei8#
我使用
grep -vw "^/"
排除了根(“/”)挂载点。zynd9foi9#
我有一个目录,里面有很多文件。我想找到所有不包含字符串“speedup”的文件,所以我成功地使用了下面的命令: