2014-09-29 88 views
0

我有數據,如下所示:grepping柱(和|或)運營商

bark art|evt|evt|nat 
barnburner evt|hum 
bash evt|evt 
battle act|act|act|evt|evt 
bay anm|art|art|art|evt|nat|plt 
beat act|act|atr|com|evt|evt|evt|hum|loc|tme 
beating act|act|evt|evt 
bread act|act|evt|evt|hum|nat 

我希望能夠從中提取那些在第一列中的任何字符串的所有行,但一第二欄中的特定信息模式。 更具體地說,我想提取那些在第二列有evt的行,並且至少至少有我指定的另一個值。

舉例來說,我想提取具有EVT至少哼哼NAT(或兩者NATEVT simutaneously)的所有行。 因此,我期望的結果將是:

bark art|**evt**|**evt**|**nat**  
barnburner **evt**|**hum** 
bay anm|art|art|art|**evt**|**nat**|plt 
beat act|act|atr|com|**evt**|**evt**|**evt**|**hum**|loc|tme 
bread act|act|**evt**|**evt**|**hum**|**na**t 

我一直在試圖與沒有成功grep做到這一點。

,我一直在試圖grep的是:

$ grep 'evt\|(hum|nat)' file 

任何人都可以點我的方向是什麼,我做錯了什麼? 謝謝!

+1

而不是使用複雜的'grep'的命令,你可以考慮使用'awk',它處理列和條件很容易。 'awk -v FS =「|」 '$ 1 ==「evt」&&($ 2 ==「evt」|| $ 2 ==「act」)'file'等 – fedorqui 2014-09-29 10:39:06

回答

2

的grep:

  • 默認:BRE(基本正則表達式),你有逃避一些特殊字符來他們特殊的意義。像|, (...

  • -E選項:ERE(推廣的正則表達式),你逃避一些特殊字符來採取特殊的意義。像|, (, {...

所以,你使用的grep的默認選項,這是BRE,則evt\|(hum|nat)匹配 "evt" or literal "(hum|hat)"BRE,你正在尋找的可能是:evt|\(hum\|nat\)這裏\(and \|具有特殊的意義。

或者使用-E BRE,那麼你就可以grep 'evt\|(hum|hat),該\|採取了特殊的意義遠,使其匹配文字"|"

1

你是如此接近,只是使用擴展正則表達式參數E

$ grep -E 'evt\|(hum|nat)' file 
bark art|evt|evt|nat 
barnburner evt|hum 
bay anm|art|art|art|evt|nat|plt 
beat act|act|atr|com|evt|evt|evt|hum|loc|tme 
bread act|act|evt|evt|hum|nat