为什么 grep 匹配所有行,不管模式是什么

Why does grep matches all the lines no matter what the pattern

我在使用 grep 时遇到问题。 我有一个文件 http://pastebin.com/HxAcciCa,我想检查其中的某些模式。当我试图搜索它时,grep returns 所有行,前提是该模式已经存在于给定文件中。

为了解释更多,这是我 运行

的代码
grep -F  "ENVIRO" "$file_pos" >> blah    

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

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 选项时,它不会 return 任何一行,尽管存在确切的模式。

我在网络和 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 而不是代码?

  1. 检查输入文件中的行结尾:filewc -l
  2. 检查您确实使用了正确的 grepwhich grep
  3. 使用 > 重定向输出,或使用 | more| less 以免被您追加的早期尝试所混淆。

编辑:看起来你的文件有错误的行尾(可能是旧的 Mac OS (CR))。如果你有 dos2unix 你可以尝试将它们转换为 Unix 风格的行结尾 (LF).

我目前无法访问 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$

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

从评论来看,文件似乎有回车 returns 分隔行,而不是 grep 期望的换行符;结果,grep 将文件视为一大行,作为一个整体匹配或不匹配。

(注意:关于如何分隔 "plain text" 文件中的行至少有三种不同的约定——unix 使用换行符(\n),DOS/Windows 使用回车符 return 后跟换行符 (\r\n),OSX 之前的 MacOS 版本只使用回车符 return (\r).)

我不清楚你的文件是如何以这种格式结束的,但你可以通过以下方式轻松修复它:

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

或即时使用:

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