2017-04-25 38 views
2

我試圖解析,將有這樣的線日誌文件:猛砸包括字符之間的字符串中的awk打印

aaa bbb ccc: [DDD] efg oi  
aaa bbb ccc: lll [DDD] efg oo  
aaa bbb ccc: [DDD] 

其中[DDD]可在線路的任何地方。

只有一件事會[]之間的任何行

用awk和空間作爲分隔符,我怎麼可以打印1,第3和[]之間的所有數據(整個字符串)?

預期輸出:aaa ccc: DDD

+2

你嘗試過什麼,怎麼做的失敗?看起來你應該能夠通過閱讀任何Awk介紹的第一頁的一半來解決這個問題。 – tripleee

+0

'awk'{print $ 1,$ 3,$ 4}'文件' – RomanPerekhrest

+0

'awk'{print $ 1,$ 3,???}'',可以在某些位置打印數據,但我在尋求幫助可以在任何字符串中的字符。 –

回答

3

GAWK(GNU AWK)的方法:

比方說,我們有以下行文件:

aaa bbb ccc: ddd [fff] ggg hhh 

的命令:

awk '{match($0,/\[([^]]+)\]/, a); print $1,$3,a[1]}' file 

輸出:

aaa ccc: fff 

匹配(字符串,正則表達式[,數組])最長,最左邊的
搜索 SUBSTRING由正則表達式匹配regexp並返回該子串開始的字符位置(索引)(一個,如果它開始於軋製字符串)。如果沒有找到匹配,返回零..

+0

將位於「[」和「]」之間的數據不必位於第4個位置 –

+1

$ 1並且3美元是強制性的?如果'['和']'之間的數據在任意位置,是否可以有多個條目,比如'aaa bbb ccc:ddd [fff] ggg hhh [jjj]'? – RomanPerekhrest

+0

'[''''''$和$ 3之間只有一個條目是強制性的 –

1

考慮:

$ cat file 
aaa bbb ccc: [DDD] efg oi  
aaa bbb [ccc:] lll DDD efg oo  
aaa [bbb] ccc: DDD 

(注意 - 從OP的例子改變)

在POSIX awk

awk 'BEGIN{fields[1]; fields[3]} 
           {s="" 
           for (i=1;i<=NF;i++) 
             if ($i~/^\[/ || i in fields) 
              s=i>1 ? s OFS $i : $i 
           gsub(/\[|\]/,"",s) 
           print s 
           }' file 

打印:

aaa ccc: DDD 
aaa ccc: 
aaa bbb ccc: 

如果同時包含在[]和選定的fields數組中,則不會打印該字段兩次。 (即,[aaa] bbb ccc:不打印aaa兩次)也將打印在正確的字段順序,如果你有aaa [bbb] ccc ...

-1
awk '$5=="[DDD]"{gsub("[\\[\\]]","");print $1,$3,$5}' file 

awk '$5=="[DDD]"{print $1,$3, substr($5,2,3)}' file 

aaa ccc: DDD 
+0

我想知道什麼是錯的? –

+0

不確定,但代碼只回答一般皺眉。 –