我有一个奇怪的表演egrep -f
。
示例:
$ egrep -f ~/tmp/tmpgrep2 orig_20_L_A_20090228.txt | wc -l
3
$ for lines in `cat ~/tmp/tmpgrep2` ; do egrep $lines orig_20_L_A_20090228.txt ; done | wc -l
12
有人可以给我一个暗示可能是什么问题吗? 不,执行之间的文件没有变化。 egrep行数的预期答案是12。
文件内容更新:搜索到的文件包含cca 13000行,每行为500个字符长,模式文件包含12行,每行为24个字符长。模式始终(且仅)发生在已存储文件中的固定位置(26-49)。
对模式内容进行更新:来自tmpgrep2的每个模式都是24个字符长的数字。
答案 0 :(得分:2)
如果在同一行找到搜索模式,那么您可以得到您看到的结果:
假设您寻找:
abc
def
ghi
jkl
,数据文件为:
abcdefghijklmnoprstuvwxzy
然后一次性命令将打印1,循环将打印4。
答案 1 :(得分:1)
在第二个版本中,读取的行是否包含shell正在扩展/替换您的内容?然后grep在读取模式本身时就无法完成,从而导致匹配的模式发送不同。
我不完全确定shell是否在这样的调用中对变量值进行了任何扩展,但这至少是一个想法。
编辑:不,它似乎没有做任何替换。但它可能引用问题,如果你的模式包含空格,for循环将逐步遍历每个标记,而不是通过每一行。看一下内置的read
bash。
答案 2 :(得分:1)
〜/ tmp / tmpgrep2中是否有任何重复项? Egrep只使用dupes一次,但你的循环将使用每次出现。
通过这样做来摆脱欺骗:
$ for lines in `sort < ~/tmp/tmpgrep2 | uniq` ; do egrep $lines orig_20_L_A_20090228.txt ; done | wc -l
答案 3 :(得分:0)
我是第二个@unwind。
为什么不在没有wc -l
的情况下运行并查看每个搜索的内容?
也许:
for lines in `cat ~/tmp/tmpgrep2` ; do echo $lines ; done
现在看到shell正在处理$lines
?
答案 4 :(得分:0)
其他人已经提出了我要看的大部分内容。我要检查的下一件事是环境变量GREP_OPTIONS,或者在你的机器上调用的任何东西。使用干扰环境设置的命令行参数时,我收到了最奇怪的错误消息或行为。