Egrep使用-f选项行为奇怪

时间:2009-03-06 15:06:25

标签: linux shell resultset grep

我有一个奇怪的表演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个字符长的数字。

5 个答案:

答案 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,或者在你的机器上调用的任何东西。使用干扰环境设置的命令行参数时,我收到了最奇怪的错误消息或行为。