2012-11-28 107 views
11

考慮我有以下數據流:使用grep多個搜索模式

BODY1 
attrib1: someval11 
attrib2: someval12 
attrib3: someval13 

BODY2 
attrib1: someval21 
attrib2: someval22 
attrib3: someval23 

BODY3 
attrib1: someval31 
attrib2: someval32 
attrib3: someval33 

我想提取只有身體的每個attrib1和attrib3,即

attrib1: someval11 
attrib3: someval13 
attrib1: someval21 
attrib3: someval23 
attrib1: someval31 
attrib3: someval33 

我試過

grep 'attrib1\|attrib3',根據this site,但沒有返回任何東西。 grep attrib1grep attrib2確實會返回數據,但僅適用於指定的單個模式。

+0

不在於它解決您的問題,但它可能是更容易跟蹤和更快grep來查找,如果你的正則表達式是'ATTRIB [13 ]'。使通用部分更長通常更好。 –

+0

如果在屬性1和3之間沒有共生模式,該怎麼辦?如果他們被命名爲完全不同的東西? – amphibient

+0

在實際的例子中,我的attrib1被稱爲foo,而attrib3被稱爲bar ... – amphibient

回答

15

grep -e 'attrib1' -e 'attrib3' file

man頁:

-e PATTERN,--regexp = PATTERN
使用模式爲圖案。這可用於指定 多個搜索模式,或用於保護以 連字符( - )開頭的模式。 (-e由POSIX指定)。

編輯: 或者,可以節省模式在一個文件中,並使用-f選項:

[email protected]:~$ cat>patt 
attrib1 
attrib3 

[email protected]:~$ grep -f patt test 
attrib1: someval11 
attrib3: someval13 
attrib1: someval21 
attrib3: someval23 
attrib1: someval31 
attrib3: someval33 
+0

grep:非法選項 - e。我正在使用SunOS – amphibient

+0

正如手冊頁所述,-e由POSIX指定,因此它應該可以工作。 我會盡力尋找替代品。 – axiom

+0

@foampile你可以試試看看'-f'選項是否有用。 另請注意,對於你的例子,'grep'attrib1 \ | attrib3''應該也能正常工作。 – axiom

0

這工作,與GNU的grep 2.6.3

grep "attrib[13]" 

grep "^[^0-9]*[13]:" 
+0

如果在屬性1和屬性3之間沒有共生模式,該怎麼辦?如果他們被命名爲完全不同的東西? – amphibient

+0

你在找什麼,在行的第一個單詞的末尾加上1或3,然後是冒號? – Sirch

0

這取決於你進入的外殼。 grep -iw 'patter1\|patter2\|pattern3'適用於bash shell,因爲它不適用於korn shell。對於korn shell,我們可能需要嘗試grep -e pattern1 -e patter2等等。

+0

您使用的shell不直接影響'grep'外部命令支持的參數。 – tripleee

10

另外egrep;

egrep "pattern1|pattern2|pattern3" file 
8

非常簡單的命令:

bash> grep "attrib1\|attrib3" <file.name> 

attrib1: someval11 attrib3: someval13 attrib1: someval21 attrib3: someval23 attrib1: someval31 attrib3: someval33