仅显示匹配的字符串 - grep

时间:2014-08-28 10:09:11

标签: regex grep

我有两个文件。 File1如下

Apple
Cat
Bat

File2如下

I have an Apple
Batman returns
This is a test file. 

现在我想检查第一个文件中哪些字符串不在第二个文件中。我可以做一个grep -f file1 file2,但那会在第二个文件中给我匹配的行。

2 个答案:

答案 0 :(得分:5)

要获取第一个文件和第二个文件中的字符串

grep -of file1 file2

结果(使用给定的例子)将是:

Apple
Bat

要获取第一个文件中但不在第二个文件中的字符串,您可以:

grep -of file1 file2 | cat - file1 | sort | uniq -u

甚至更简单(感谢@ triplee'评论):

grep -of file1 file2 | grep -vxFf - file1

结果(使用给定的例子)将是:

Cat

grep 页面:

  

-o - 仅匹配
  仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

uniq 页面:

  

-u - 唯一
  仅打印唯一的行

答案 1 :(得分:0)

如果你想显示file1中不在file2中的单词,那么一种肮脏的方式就是循环遍历单词和grep。如果不匹配,请打印单词:

while read word
do
    grep -q "$word" f2 || echo "$word"
done < f1

要匹配确切的字词,请添加-wgrep -wq ...

测试

$ while read word; do grep -q "$word" f2 || echo "$word"; done < f1
Cat
$ while read word; do grep -wq "$word" f2 || echo "$word"; done < f1
Cat
Bat

更好的方法是使用awk:

$ awk 'FNR==NR {a[$1]; next} {for (i=1;i<=NF;i++) {if ($i in a) delete a[$i]}} END {for (i in a) print i}' f1 f2
Cat 
Bat 

这会将file1中的值存储到数组a[]中。然后,它循环遍历file2的所有行,检查每个元素。如果其中一个匹配数组a[]中的值,则从阵列中删除此元素。最后,在END{}块中打印未找到的值。