2013-05-10 27 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