为什么grep匹配所有行,无论模式是什么

时间:2015-05-31 21:05:39

标签: regex bash grep

我在使用grep时遇到问题。 我有一个文件http://pastebin.com/HxAcciCa,我想检查某些模式。当我试图搜索它时,如果模式已存在于给定文件中,grep将返回所有行。

要解释更多这是我正在运行的代码

grep -F  "ENVIRO" "$file_pos" >> blah    

无论我尝试什么,即使我提供整行作为模式bash总是返回所有行 这些是我正在尝试的变种:

grep -F  "E20" "$file_pos" >> blah
grep E20 "$file_pos" >> blah 
grep C:\E20-II\ENVIRO\SSNHapACS480.dll "$file_pos" >> blah
grep -F C:\E20-II\ENVIRO\SSNHapACS480.dll "$file_pos" >> blah

同样由于某些奇怪的原因,在向grep添加-x选项时,尽管存在确切的模式,但它不会返回任何行。

我搜索了网络和bash文档的原因,但找不到任何内容。

我的最终测试是以下

grep -F -C 1  "E20" "$store_pos" >> blah #store_pos has the same value as $file_pos

我想也许是在结果之后打印线条但事实并非如此。 我正在使用blah文件来查看输出。 我也在使用Linux薄荷丽贝卡。 最后虽然命名很熟悉,但这个问题与Why does grep match all lines for the pattern "\'"

并不相似

最后我想说我是bash的新手。 我怀疑错误可能是由于主文件http://pastebin.com/HxAcciCa而不是代码?

3 个答案:

答案 0 :(得分:2)

  1. 检查输入文件中的行结尾:filewc -l
  2. 检查您确实使用了正确的grepwhich grep
  3. 使用>重定向输出,或| more| less不要因您之前附加的尝试而混淆。
  4. 编辑:您的文件看起来有错误的行结尾(也许是旧Mac OS(CR))。如果您有dos2unix,可以尝试将它们转换为Unix样式行结尾(LF)。

答案 1 :(得分:2)

从评论中看来,该文件的回车符分隔行,而不是grep期望的换行符;因此,grep将文件视为一个大的行,它可以匹配或不匹配作为一个整体。

(注意:关于如何划分"纯文本"文件中的行至少有三种不同的约定 - unix使用换行符(\n),DOS / Windows使用回车符接着是换行符(\r\n),而OSOS的OSX前版本只使用回车符(\r)。)

我不清楚你的档案如何以这种格式结束,但你可以通过以下方式轻松解决:

tr '\r' '\n' <badfile >goodfile

或动态:

tr '\r' '\n' <badfile | grep ...

答案 2 :(得分:1)

我目前无法访问PC,但有什么可能帮助您排除故障: 1.使用grep --color -F查看它是否匹配正确。 2.声明后,使用| cat -A看看是否有任何令人惊讶的控制字符,行应以$结尾,任何其他字符如\ I或\ M有时会令人头疼。

我怀疑是2号,因为它似乎是Windows输出。在这种情况下你可以cat filename | dos2unix | grep stmt应该解决它

您是否将dos2unix输出另存为另一个文件? 只需仔细检查文件,它应该类似于:

[root@pro-mon9001 ~]# cat -A Test.txt
Windows^M$
Style^M$
Files^M$
Are^M$
Hard ^M$
To ^M$
Parse^M$


[root@pro-mon9001 ~]# dos2unix Test.txt 
dos2unix: converting file Test.txt to Unix format ...

[root@pro-mon9001 ~]# cat -A Test.txt
Windows$
Style$
Files$
Are$
Hard$
To$
Parse$

现在它应该正确解析 - 所以只需验证它确实正确地转换了文件 祝你好运!