如何在同一行中grep两个单词?

9 浏览
0 Comments

如何在同一行中grep两个单词?

我该如何使用grep命令来筛选出包含两个输入词的行呢?我想要找到同时包含这两个词的行,应该怎么做?我尝试使用管道符号来实现,像这样:\n

grep -c "word1" | grep -r "word2" logs

\n但是它在第一个管道命令之后就卡住了。\n为什么会这样呢?

0
0 Comments

问题的出现原因是需要在同一行上匹配两个单词,而grep命令默认只能匹配一行上的一个单词。解决方法是使用awk命令,通过在awk命令中使用正则表达式匹配两个单词来实现。

首先,我们可以使用以下命令来使用awk:

cat <yourFile> | awk '/word1/ && /word2/'

这个命令将会从输入文件中查找包含"word1"和"word2"的行。顺序不重要,只要一行上同时存在这两个单词即可。

举个例子,假设有一个名为file1的文件,内容如下:

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

那么,执行以下命令:

/tmp$ cat file1| awk '/word1/ && /word2/'

将会得到以下结果:

word1 is in this file as well as word2
word2 is in this file as well as word1

注意,awk命令比grep命令要慢一些。同时,使用cat命令来读取文件可能是多余的。一个单独的awk命令通常比两个单独的grep进程更快。

0
0 Comments

如何在同一行上grep两个单词?

出现原因:

最初的脚本中的命令序列是grep -c "word1" | grep -r "word2" logs。这是一个奇怪的命令序列。第一个grep将在其标准输入上计算'word1'出现的次数,并将该数字打印在其标准输出上。直到您指示EOF(例如通过键入Control-D),它都会等待您键入一些内容。第二个grep在目录logs下的文件中进行递归搜索,查找'word2'(或者如果它是一个文件,则在文件logs中进行搜索)。在我的例子中,它将失败,因为在我运行管道的位置没有称为logs的文件或目录。请注意,第二个grep根本不读取其标准输入,因此管道是多余的。

解决方法:

以下是问题中命令的一个简单重写:grep "word1" logs | grep "word2"。第一个grep查找文件logs中包含'word1'的行,然后将这些行传递给第二个grep,第二个grep查找包含'word2'的行。

然而,并不需要使用两个这样的命令。您可以使用扩展的grep(grep -E或egrep):grep -E 'word1.*word2|word2.*word1' logs。如果您知道'word1'将在行上出现在'word2'之前,您甚至不需要使用这些备选项,普通的grep命令就可以了:grep 'word1.*word2' logs。'一命令'变体的优点是只运行一个进程,因此包含'word1'的行不必通过管道传递给第二个进程。这样的影响取决于数据文件的大小以及匹配'word1'的行数。如果文件很小,则性能不太可能成为问题,运行两个命令是可以的。如果文件很大但只有少数行包含'word1',则在管道上没有传递太多数据,使用两个命令是可以的。但是,如果文件很大且'word1'频繁出现,则可能会传递大量数据到管道,单个命令可以避免这种开销。对此,正则表达式更复杂;您可能需要对其进行基准测试,以找出最佳的方法——但仅当性能真的很重要时。如果运行两个命令,请尽量选择第一个grep中出现频率较低的单词,以最大程度地减少第二个处理的数据量。

此外,如果您使用--color=auto标志,此解决方案还可以更好地突出显示结果,比使用两个greps要好。

当使用grep 'word1.*word2'时,它能突出显示仅包含word1和word2的行吗?-- 不。您可能会在grep ‘word1.*word2’ | grep -F -e ‘word1’ -e ‘word2’中获得所需的结果,但我没有验证过。

当输出有颜色时,这个解决方案会对word1,,,everything inbetween...word2进行着色。有没有办法只对word1和word2进行着色,就像你做grep 'word1|word2' - 这是或的情况,但类似于grep 'word1&word2'这样的情况?要实现这个目标可能并不容易。您可能需要将此代码的输出通过一个带有颜色的grep,仅查找这两个单词:grep -E -e ‘word1|word2’。

感谢您的回答。我发布了一个问题并得到了一些解决方案,但是看起来使用--color=always最简单,只需grep word2在管道中就可以了。

0
0 Comments

原因:有用户询问如何使用grep命令同时匹配同一行上的两个单词。用户提到使用了选项“-c”和“-r”,但是并没有给出具体原因。另外,用户还表示对grep命令的man页不满意,认为其中的内容比随机猜测还要令人困惑。

解决方法:通过阅读grep命令的man页,可以得知如何同时匹配同一行上的两个单词。用户可以使用管道符“|”将两个grep命令连接起来。第一个grep命令用来匹配含有word1的行,第二个grep命令用来匹配含有word2的行。这样,通过管道连接,就可以显示同时包含word1和word2的行。

如果只想要统计同一行上同时包含两个单词的行数,可以在第二个grep命令中使用选项“-c”。这样,就可以显示同时包含两个单词的行的数量。

另外,用户提到在使用“grep -c "word1"”命令时出现了卡住的情况。这是因为没有指定文件名,导致grep命令从标准输入中获取输入,从而导致看起来卡住。可以使用Ctrl+D键发送EOF(文件结尾)信号,使grep命令退出。

用户还提到了对man页的不满,认为man页中没有提供简单的示例。用户认为Linux工具提供了大量选项,并且使用了单个字母的别名,这使得在互联网上对命令进行简洁加密后,大家需要通过谷歌搜索来解密命令的含义。

对此,有人表示谷歌搜索之所以有帮助,是因为有好的man页和有经验的人可以解释它们。但也有人认为如果工具的开发者编写更好的man页,这样就不会存在这个问题了。man页是为那些已经熟悉工具但需要一点提醒的人编写的,而不是为了解决问题的人编写的。

最后,还有人指出如果word1恰好也是文件名的一部分,那么结果可能不是用户想要的。

0