2013-05-10 78 views
0

我在文件中有以下正则表达式。 BTW,即时通讯在SunOS没有输出从grep或fgrep与-f选项不起作用

例如:文件模式包含以下行:

Ora-[0-9] 
violated 

我有一个文件 “数据文件”,它包含以下内容:

0:/scm/123451/test1.sql:[email protected]:databasedb:no:yes:ORA-1234|key violated 
1:/scm/123451/test1.sql:[email protected]:databasedb:no:yes:ORA-|key violated 
2:/scm/123451/test1_A.sql:[email protected]:databasedb:no:yes:ORA-|key violated 
3:/scm/123451/test1_B.sql:[email protected]:databasedb:yes:yes:Violated 
4.giga:key violated unique:giga 
5.fifa:ora-error null value found:giga 

现在,我想使用命令grep -ffgrep -f查找与模式文件的正则表达式匹配的行。当patter文件仅包含“Ora- [0-9]”行时,下面的两个命令不起作用。

grep -if ./pattern ./datafile 
frep -if ./pattern ./datafile 

我错过了什么,模式文件中的模式是否需要固定字符串?

回答

1

我认为你没有注意到模式只匹配“Ora”,但是如果你看看你的数据文件,你有一个“ora”和一个“ORA”而不是“Ora”。因此,要么包括不区分大小写的匹配,要么纠正模式。编辑: 道歉,有点晚了。我没有注意到SunOS。似乎在SunOS上,grep实现有所不同,因为它在我的Linux机器上正常运行。 Solaris grep问题?

+0

这就是为什么即时通讯使用-i选项与fgrep或grep – 2013-05-10 01:48:09

2

尝试/usr/xpg4/bin/grep不是/usr/bin/grep这是你似乎得到的结果。 Solaris /usr/bin中有许多UNIX命令用于追溯兼容性。 /usr/bin/awk是臭名昭着的。

你可以看到你在默认情况下使用grep命令得到的grep:

which grep 

您可以通过放置在/usr/xpg4/bin PATH变量你来的/ usr/bin中前更改此为您处理。或者使用grep作为/ usr/xpg4/bin/grep的别名。

在.profile中添加别名(也许.bashrc中,无论):

alias grep=/usr/xpg4/bin/grep 

更改PATH(再次.profile或地方):

例老路 -

PATH=/usr/bin:/usr/sbin 

变更示例PATH

PATH=/usr/bin/xpg4/bin:/usr/bin:/usr/sbin 

更改PATH可能会影响现有个人脚本的行为方式,通常以轻微但有时令人讨厌的方式。

还可以考虑只使用egrep -i '(ora|violated)' - 建议基于您的示例。这不需要模式文件。根据需要,它可以有很多变化。

+0

谢谢吉姆。它与grep/fgrep一起使用xpg4路径... – 2013-05-10 07:05:10

+0

看来像SunOS默认情况下grep/fgrep造成了很大的麻烦。当我使用/ usr/bin/xpg4/bin/grep或fgrep时,它工作正常。我在一个脚本里面,在一段时间内读取一行LOOP,并且循环的输入是一个文件。 LOOP也有一些变量设置,它处理ssh,即var1 =“$(ssh -nq ......”“....”)“;在这种情况下,xpg4 grep/fgrep不工作? – 2013-05-10 08:42:14