为什么 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 而不是代码?
- 检查输入文件中的行结尾:
file
、wc -l
。
- 检查您确实使用了正确的
grep
:which grep
。
- 使用
>
重定向输出,或使用 | 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 ...
我在使用 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 而不是代码?
- 检查输入文件中的行结尾:
file
、wc -l
。 - 检查您确实使用了正确的
grep
:which grep
。 - 使用
>
重定向输出,或使用| 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 ...