如何找到包含两个指定单词的所有行?

7 grep awk text-processing

我需要检查文本文件中的任何一行是否存在两个(指定的)单词。单词的字符没有限制。例如:

我想找到一个文本文件中包含“cat”和“elephant”这两个词的行(即,在同一行;不一定并排):

Cat is smaller than elephant
Elephant is larger than cat
Cats are cute!
Elephants are very strong
Cat and elephants live in different environments
cats are friendly
Run Code Online (Sandbox Code Playgroud)

在前面的示例中,如何找到包含这两个单词的行?

Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environments
Run Code Online (Sandbox Code Playgroud)

我毫无希望地尝试了 grep 和 awk。问题是有大写和小写的单词,所以无论字母状态如何,我如何匹配这两个单词!?

小智 8

grep

grep -i "cat" file | grep -i "elephant"

Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environment
Run Code Online (Sandbox Code Playgroud)

标志grep是忽略大小写(上/下)

 -i, --ignore-case         ignore case distinctions
Run Code Online (Sandbox Code Playgroud)

或者 awk

awk 'BEGIN{IGNORECASE=1} /cat/&&/elephant/{print $0}' file
Run Code Online (Sandbox Code Playgroud)

@glenn jackman建议awk可以按如下方式运行该语句:

awk '/cat/&&/elephant/' IGNORECASE=1 file
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 6

$ grep -Fiw cat <file | grep -Fiw elephant
Cat is smaller than elephant
Elephant is larger than cat
Run Code Online (Sandbox Code Playgroud)

我们首先从file包含单词的文件中提取所有行cat,然后将这些行缩小到包含单词的行elephant

这是使用grep -F -i -wwhere完成的

  • -F品牌grep对待图案作为一个固定的字符串,而不是作为正则表达式,
  • -igrep不区分大小写的匹配,和
  • -w品牌grep只匹配完整的单词。

-w选项是POSIX 标准grep的扩展,但由大多数常见grep实现实现。当匹配字符串是较长单词的一部分时,它基本上不允许匹配给定模式。

请注意,我不匹配该行

Cat and elephants live in different environment
Run Code Online (Sandbox Code Playgroud)

这是由于selephants. 我也不会匹配这条线

elephantiasis is catastrophic
Run Code Online (Sandbox Code Playgroud)

出于同样的原因。

你想在词尾允许复数s,使用

$ grep -Eiw 'cats?' <file | grep -Eiw 'elephants?'
Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environment
Run Code Online (Sandbox Code Playgroud)

在这里,我们在 的两次调用中都使用(扩展的)正则表达式而不是固定字符串grep。表达式将匹配s两个单词末尾的可选。现在我们匹配catand cats(不区分大小写),但不会匹配catnip, catsup, 或scat