2017-06-02 39 views
1

我的文本文件看起來像下面在awk打印匹配列沒有發現

date="2017-10-10" ip=192.168.1.1:22 inbound=100 outbound=100 
date="2017-10-10" ip=192.168.1.1:22 inbound=100 
date="2017-10-10" ip=192.168.1.1:22 outbound=100 

我用下面的awk代碼打印匹配的字符串和提取不管是「=」之後。

awk '{for(i=1;i<=NF;i++)if($i~/inbound=/)print $(i)}' | cut -d : -f1 | cut -d = -f2 

例如,我會搜索「inbound =」並提取「100」。 但棘手的部分是「入站」不會出現在文本的所有行 現在我想打印「0」,如果一行沒有「入站」一詞。

預期輸出

100 
100 
0 Not Found 
+0

*無論是之後的‘=’* - 適合不但'inbound' – RomanPerekhrest

回答

0

只要你有name = value對您輸入這是最好的到F IRST的名字創建的映射(f[]下)的數組,然後你可以只打印(或做別的用)值:

$ awk -v n="inbound" -F'[ =]+' '{delete f; for (i=1;i<NF;i+=2) f[$i]=$(i+1); print (n in f ? f[n] : "0 Not Found")}' file 
100 
100 
0 Not Found 

想要做「出站」或任何其他領域一樣嗎?剛初始化的變量名稱相應n

$ awk -v n="outbound" -F'[ =]+' '{delete f; for (i=1;i<NF;i+=2) f[$i]=$(i+1); print (n in f ? f[n] : "0 Not Found")}' file 
100 
0 Not Found 
100 
$ 
$ awk -v n="date" -F'[ =]+' '{delete f; for (i=1;i<NF;i+=2) f[$i]=$(i+1); print (n in f ? f[n] : "0 Not Found")}' file 
"2017-10-10" 
"2017-10-10" 
"2017-10-10" 
$ 
$ awk -v n="ip" -F'[ =]+' '{delete f; for (i=1;i<NF;i+=2) f[$i]=$(i+1); print (n in f ? f[n] : "0 Not Found")}' file 
192.168.1.1:22 
192.168.1.1:22 
192.168.1.1:22 
+1

Thanks。This works too too – aravi

+0

不客氣,不過,從[你的後續問題](https://stackoverflow.com/q/44340126/1745001)認爲你真的理解了這個答案,或者爲什麼它與你得到的其他答案不同,因爲它也爲你的後續問題提供瞭解決方案。 –

1

輸入

$ cat file 
date="2017-10-10" ip=192.168.1.1:22 inbound=100 outbound=100 
date="2017-10-10" ip=192.168.1.1:22 inbound=100 
date="2017-10-10" ip=192.168.1.1:22 outbound=100 

輸出

$ awk '{if(match($0,/inbound=[0-9]+/)){s=substr($0,RSTART,RLENGTH); print substr(s,index(s,"=")+1);next}print 0,"Not Found"}' file 
100 
100 
0 Not Found 

說明

awk '{ 

    # Search for word inbound=[0-9]+ in record/line/row, if found then 
    if(match($0,/inbound=[0-9]+/)) 
    { 
     # Extract word 
     s=substr($0,RSTART,RLENGTH) 

     # Print value which is after "=" 
     print substr(s,index(s,"=")+1) 

     # Go to next line 
     next 
    } 

     # If above condition is not true then word inbound not found in line/row/record 

     print 0,"Not Found" 
    } 
' file 
2

使用了GNU AWK

awk '{print match($0,/inbound=([0-9]+)/,a)?a[1]:0}' file 

在Perl中

perl -lne 'print /inbound=(\d+)/?$1:0' file 

在sed

sed 's/.*inbound=\([0-9]\+\).*/\1/;t;s/.*/0/' file 
+3

@Inian最後ARG匹配的是GNU AWK只可惜,否則你要亂「RSTART」和「RLENGTH」。 – 123