How to grep for two words existing on the same line?
如何grep包含行上两个输入字的行? 我正在寻找包含两个单词的行,我该怎么做? 我试过像这样的管子:
1 | grep -c"word1" | grep -r"word2" logs |
它只是在第一个管道命令后卡住了。
为什么?
你为什么通过
要在同一行上查找2个单词,只需执行以下操作:
1 | grep"word1" FILE | grep"word2" |
如果您只想计算同一行上2个单词的行数,请执行以下操作:
1 | grep"word1" FILE | grep -c"word2" |
另外,要解决您的问题,为什么会卡住:在
处方
在问题中一个简单的重写命令是:
1 | grep"word1" logs | grep"word2" |
第一个
但是,没有必要使用这样的两个命令。您可以使用扩展
1 | grep -E 'word1.*word2|word2.*word1' logs |
如果你知道'word1'将在行上的'word2'之前,你甚至不需要替代方案,而常规
1 | grep 'word1.*word2' logs |
"一个命令"变体的优点是只有一个进程在运行,因此包含"word1"的行不必通过管道传递给第二个进程。这有多重要取决于数据文件的大小以及多少行匹配'word1'。如果文件很小,性能可能不是问题,运行两个命令就可以了。如果文件很大但只有几行包含'word1',则管道上传递的数据不会太多,并且使用两个命令就可以了。但是,如果文件很大并且经常出现'word1',那么您可能会将大量数据传递到管道中,而单个命令可以避免这种开销。相反,正则表达式更复杂;您可能需要对其进行基准测试以找出最佳效果 - 但前提是性能确实很重要。如果运行两个命令,则应该在第一个
诊断
最初的脚本是:
1 | grep -c"word1" | grep -r"word2" logs |
这是一个奇怪的命令序列。第一个
使用Bash,父shell会一直等到管道中的所有进程都退出,所以它会等待
请注意,即使您输入数据作为第一个
脚注:
有一段时间,答案是:
1 2 | grep -E 'word1.*word2|word2.*word1'"$@" grep 'word1.*word2'"$@" |
这引发了以下评论。
你可以使用awk。像这样...
1 | cat <yourFile> | awk '/word1/ && /word2/' |
订单并不重要。所以,如果你有一个文件,...
一个名为file1的文件包含:
1 2 3 4 | word1 is in this file as well as word2 word2 is in this file as well as word1 word4 is in this file as well as word1 word5 is in this file as well as word2 |
然后,
1 | /tmp$ cat file1| awk '/word1/ && /word2/' |
会导致,
1 2 | word1 is in this file as well as word2 word2 is in this file as well as word1 |
是的,awk比较慢。
主要问题是你没有提供任何输入的第一个grep。您需要重新排序命令
1 | grep"word1" logs | grep"word2" |
如果你想计算出现次数,那么在第二个grep上放一个'-c'。
你试试下面的命令
1 | cat log|grep -e word1 -e word2 |
这对我来说似乎是最简单的方法
使用grep:
1 | grep -wE"string1|String2|...." file_name |
或者您可以使用:
1 | echo string | grep -wE"string1|String2|...." |
以下是使用
1 | git grep -e pattern1 --and -e pattern2 --and -e pattern3 |
上面的命令将打印一次匹配所有模式的行。
如果文件不受版本控制,请添加
Search files in the current directory that is not managed by Git.
检查
也可以看看:
- 如何使用grep匹配string1和string2?
- 检查文件中是否存在多个字符串或正则表达式。
- 如何使用多个AND模式运行grep?
- 有关存储在文件中的多种模式,请参阅:一次匹配文件中的所有模式。