我在使用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而不是代码?
答案 0 :(得分:2)
file
,wc -l
。 grep
:which grep
。 >
重定向输出,或| more
或| less
不要因您之前附加的尝试而混淆。编辑:您的文件看起来有错误的行结尾(也许是旧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$
现在它应该正确解析 - 所以只需验证它确实正确地转换了文件 祝你好运!