Grep 在一行中搜索两个单词

Grep 在一行中搜索两个单词

我一直在尝试找到一种方法来过滤包含单词“lemon”和“rice”的一行。我知道如何找到“lemon”或“rice”,但不知道如何同时找到它们两个。它们不需要相邻,只要是同一行文本即可。

答案1

“在同一行”的意思是“‘rice’后面跟着随机字符,然后是‘lemon’,反之亦然”。

在正则表达式中为rice.*lemonlemon.*rice。您可以使用 来组合它们|

grep -E 'rice.*lemon|lemon.*rice' some_file

如果您想使用普通正则表达式而不是扩展正则表达式(-E),那么您需要在之前加上反斜杠|

grep 'rice.*lemon\|lemon.*rice' some_file

对于更多的单词,很快就会变得有点长,通常更容易使用多次调用grep,例如:

grep rice some_file | grep lemon | grep chicken

答案2

您可以将第一个 grep 命令的输出通过管道传输到另一个 grep 命令,这样就可以匹配两个模式。因此,您可以执行以下操作:

grep <first_pattern> <file_name> | grep <second_pattern>

或者,

cat <file_name> | grep <first_pattern> | grep <second_pattern>

例子:

让我们在文件中添加一些内容:

$ echo "This line contains lemon." > test_grep.txt
$ echo "This line contains rice." >> test_grep.txt
$ echo "This line contains both lemon and rice." >> test_grep.txt
$ echo "This line doesn't contain any of them." >> test_grep.txt
$ echo "This line also contains both rice and lemon." >> test_grep.txt

该文件包含什么:

$ cat test_grep.txt 
This line contains lemon.
This line contains rice.
This line contains both lemon and rice.
This line doesn't contain any of them.
This line also contains both rice and lemon.

现在,让我们 grep 我们想要的内容:

$ grep rice test_grep.txt | grep lemon
This line contains both lemon and rice.
This line also contains both rice and lemon.

我们只得到两个模式都匹配的行。您可以扩展它并将输出通过管道传输到另一个 grep 命令以进行进一步的“AND”匹配。

答案3

虽然问题要求使用“grep”,但我认为发布一个简单的“awk”解决方案可能会有所帮助:

awk '/lemon/ && /rice/'

除了“and”之外,还可以使用更多单词或其他布尔表达式轻松进行扩展。

答案4

此命令返回包含 foo 或 goo 的行的匹配项。

grep -e foo -e goo

此命令返回以任意顺序包含 foo 和 goo 的行的匹配项。

grep -e foo.*goo -e goo.*foo

相关内容