我有一个令人困惑的grep问题,我无法调试。这在Mac OS High Sierra上是可重现的,但是当前的Ubuntu(它按预期工作)不会出现问题。
我有三个文件:
cat haystack
apple
aardvark
cow
cat pattern1
a
aardvark
animal
cat pattern2
c
b
apple
您可以使用以下命令创建这3个文件:
perl -e 'print "a\naardvark\nanimal"' > pattern1;
perl -e 'print "c\nb\napple"' > pattern2;
perl -e 'print "apple\naardvark\ncow"' > haystack;
问题在于:这会产生预期的响应:
grep -iowFf pattern2 haystack
apple
解释一下,grep ......
-i = case insensitive
-o = display the match
-w = word match <== this is the option which is breaking it
The expression is searched for as a word (as if surrounded by `[[:<:]]' and `[[:>:]]'
-F = fast grep (fixed strings)
-f = read pattern from file
这不会返回任何内容:
grep -iowFf pattern1 haystack
但我希望&#34; pattern1
&#34;返回&#34; aardvark
&#34;。
我正在尝试使用这个小型测试平台,但我真正的项目要大得多。我发现当我更改patternN
文件中的行序列时,结果会发生变化。
sort -r pattern1 > pattern1.reverse
grep -iowFf pattern1.reverse haystack
返回&#34; aardvark
&#34;
我错过了什么?我一直在敲打这个问题。这是MacOS 10.13中的错误吗?有解决方法吗? (是的,一种解决方法是在我的模式中用\ b .... \ b替换-w参数并关闭-F,但我正在处理非常大的文件,我想要性能。)
答案 0 :(得分:3)
在MacOSX上:
$ grep -V
grep (BSD grep) 2.5.1-FreeBSD
在Centos7上,例如
$ grep -V
grep (GNU grep) 2.20
现在,两个版本的工作方式不同(正如您所注意到的)。要解决此问题,您可以在MacOSX上安装GNU版本的grep,brew install grep
安装GNU grep,前缀为g
。现在你可以做到:
$ ggrep -iowFf pattern1 haystack
aardvark