2011-04-04 63 views
60

使用awk,我需要在與正則表達式模式匹配的文件中找到一個單詞。如何使用awk打印匹配的正則表達式模式?

我只有想打印與模式匹配的單詞。

因此,如果行,我有:

xxx yyy zzz 

而且圖案:

/yyy/ 

我只想得到:

yyy 

編輯: 感謝到ku魯米我設法寫的是這樣的:

awk '{ 
     for(i=1; i<=NF; i++) { 
       tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/) 
       if(tmp) { 
         print $i 
       } 
     } 
}' $1 

,這就是我需要的:)非常感謝!

+2

我讀到這,這太古怪了我:S – marverix 2011-04-04 08:17:19

+2

那麼我會建議你提供一點點你的任務細節。它太含糊。 – 2011-04-04 08:20:36

+0

@maxtaldykin你可以將你的自我回答從問題轉移到單獨的答案嗎? – kenorb 2018-02-14 20:35:34

回答

85

這是非常基本的

awk '/pattern/{ print $0 }' file 

awk使用//搜索pattern,然後打印出的線,它默認稱爲記錄,通過$ 0到4表示。至少讀了documentation

如果您只想打印出匹配的單詞。

awk '{for(i=1;i<=NF;i++){ if($i=="yyy"){print $i} } }' file 
+29

由於'print'是默認動作:'awk'/ pattern /'file'就足夠了。 – Johnsyweb 2011-04-04 08:22:59

+13

@Johnsyweb,是的,我知道這個事實。對於像marverix這樣的初學者來說,它意味着更具視覺衝擊力。 – kurumi 2011-04-04 08:25:37

+8

我不懷疑你的知識。然而,這些信息可能對其他人找到答案有用。 – Johnsyweb 2011-04-04 08:42:50

71

這聽起來像你試圖模仿GNU的grep -o行爲。這將做到這一點提供你只需要在每一行的第一場比賽:

awk 'match($0, /regex/) { 
    print substr($0, RSTART, RLENGTH) 
} 
' file 

下面是一個例子:

% awk 'match($0, /a.t/) { 
    print substr($0, RSTART, RLENGTH) 
} 
' /usr/share/dict/words | head 
act 
act 
act 
act 
aft 
ant 
apt 
art 
art 
art 

爲了您的家庭作業的其餘部分,你應該看看了每個什麼matchsubstRSTARTRLENGTH做的awk手冊。

之後,您可能希望擴大此處理在同一行上的多個匹配。我不能做全部你的功課:-)

+0

注意:要回答最後一部分,所有需要的構造都在[kurumi的答案](http://stackoverflow.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from -file/5536068#5536068)和我自己的。 – Johnsyweb 2011-04-04 10:04:17

+0

很棒的回答。只是因爲我很懶,所以我想在這裏解釋一下。但這就是爲什麼我使用AWK! – 2014-08-22 22:08:14

+0

如果我想用匹配結果做一些事情,除了打印它呢?例如,我想將所有匹配添加到數組中。 – Evya2005 2017-06-04 09:41:46

8

如果你只對輸入的最後一行感興趣,而你期望只找到一個匹配(例如一個shell的摘要行的一部分)命令),你也可以嘗試這種非常緊湊的代碼,從Print regexp matches in AWK通過:

$ echo "xxx yyy zzz" | awk '{match($0,"yyy",a)}END{print a[0]}' 
yyy 

或者更復雜的版本有部分結果:

$ echo "xxx=a yyy=b zzz=c" | awk '{match($0,"yyy=([^ ]+)",a)}END{print a[1]}' 
b 

警告:awkmatch()函數三個參數只存在於gawk,而不是在mawk

下面是一個使用在grep,而不是awklookbehind regex另一個很好的解決方案。該解決方案具有較低的要求安裝:

$ echo "xxx=a yyy=b zzz=c" | tail -n1 | grep -Po '(?<=yyy=)[^ ]+' 
b 
16

呆子可以用得到的每一行相匹配的部分以此爲行動:

{ if (match($0,/your regexp/,m)) print m[0] } 

匹配(字符串,正則表達式[, array]) 如果存在數組,則將其清零, 然後將數組的第零個元素設置爲由正則表達式匹配的 字符串的整個部分。如果正則表達式包含圓括號,則數組的整數索引元素 設置爲包含與相應的括號化子表達式匹配的 字符串的部分。 http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions

8

如果Perl是一種選擇,你可以試試這個:

perl -lne 'print $1 if /(regex)/' file