2013-01-08 43 views
5

我需要編寫一個正則表達式匹配以下模式:正則表達式匹配awk命令內的圖案

fltr_desc_name 

即.. 「FLTR」後跟下劃線後跟任意數目的字以下劃線分隔。

例如: 我需要一個正則表達式匹配如下:

fltr_desc_name 
fltr_nameone_nametwo 
fltr_level_name_desc 

,我使用它內部的「如果」聲明「AWK」: 爲前:

awk '/Transformation/ { if ($4=="Filter" && $5=="fltr_*") print $4,$5 }' filename 

請幫我寫的正則表達式,並告訴我如何使用內內「AWK」命令「如果」條件的正則表達式。謝謝。

+1

你有什麼到目前爲止已經試過!以及爲什麼要正則表達使用字符串函數,該函數 – diEcho

+0

你好:), 我使用正則表達式查找其穿越 - 字段類型是過濾器,所有線路(即$ 4,由於在文件中給出的第4場)和$ 5是SHLD B中的格式的過濾器的名稱「fltr_followedbyanywrdsseparatedbyunderscore」。所以我正在使用問題中所示的awk cmd,但我無法修改這些行。 – Karthik

回答

4

你可以使用

awk '/Transformation/ && $4=="Filter" && match($5, /^fltr_[A-Za-z_]+/) { print $4,$5 }' filename 

無需使用if語句,你可以使用多個匹配條件按以上。 match$5返回正則表達式^fltr_[A-Za-z_]+的匹配位置,或0,如果有沒有。 0評估爲假,其他爲真。

+0

非常感謝。它工作得很好:)歡呼 – Karthik

+2

@Karthik match()是不必要的。你的主要問題是你正在使用字符串比較運算符(==)而不是RE比較運算符(〜)。我會發布真正的解決方案。 –

+0

@EdMorton,很好 - 在'man awk'中尋找一個正則表達式運算符,但沒有在其他運算符中列出,所以我錯過了它,而是去匹配。謝謝! –

1

fltr_[a-zA-Z_]+[a-zA-Z]

,或者如果你想從匹配字符串開始只是字符串結尾:

^fltr_[a-zA-Z_]+[a-zA-Z]$

+0

+1不以下劃線結束,即使它沒有明確說明 –

+0

@ sharp12345,謝謝您的答覆。 :) – Karthik

0

你可以只使用fltr_\w+

,如果你需要一個良好的程序編寫和測試正則表達式。試試這個:http://gskinner.com/RegExr/

+0

OP想要awk,而不是perl。 –

+0

@selltheworld感謝您的建議,並鏈接:) – Karthik

0

試試這個

^fltr[_\d\w]+$ 

它將採取一切,你需要的。

+0

OP希望awk中,不使用Perl。此外,'\ w'包括'_'和'\ D'已經 - http://perldoc.perl.org/perlrecharclass.html#Word-characters –

+0

@og大,感謝您的回答。我會嘗試你的建議:) – Karthik

7
awk '/Transformation/ && $4=="Filter" && $5~/^fltr_[[:alpha:]_]+/ { print $4,$5 }' filename 
+1

+1使用區域意識字符類。一般來說,即使沒有說明,我也會使用'[:alnum:]''。 –

+1

OP聲明包含「由下劃線分隔的單詞」的字符串,至少在我的腦海裏,**單詞**不包含數字,但是我認爲是YMMV。 –

+0

我可以看到,特別是給出了「fltr_nameone_nametwo」示例,但它不是延伸到'fltr_name1_name2' –

9

需要在awk的正則表達式匹配使用波形符~/ /,即

if ($5 ~ /fltr_*/) 
+0

它真的幫助 – SeeTheC