我試圖解析,將有這樣的線日誌文件:猛砸包括字符之間的字符串中的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
我試圖解析,將有這樣的線日誌文件:猛砸包括字符之間的字符串中的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
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並返回該子串開始的字符位置(索引)(一個,如果它開始於軋製字符串)。如果沒有找到匹配,返回零..
將位於「[」和「]」之間的數據不必位於第4個位置 –
$ 1並且3美元是強制性的?如果'['和']'之間的數據在任意位置,是否可以有多個條目,比如'aaa bbb ccc:ddd [fff] ggg hhh [jjj]'? – RomanPerekhrest
'[''''''$和$ 3之間只有一個條目是強制性的 –
考慮:
$ 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 ...
awk '$5=="[DDD]"{gsub("[\\[\\]]","");print $1,$3,$5}' file
或
awk '$5=="[DDD]"{print $1,$3, substr($5,2,3)}' file
aaa ccc: DDD
我想知道什麼是錯的? –
不確定,但代碼只回答一般皺眉。 –
你嘗試過什麼,怎麼做的失敗?看起來你應該能夠通過閱讀任何Awk介紹的第一頁的一半來解決這個問題。 – tripleee
'awk'{print $ 1,$ 3,$ 4}'文件' – RomanPerekhrest
'awk'{print $ 1,$ 3,???}'',可以在某些位置打印數據,但我在尋求幫助可以在任何字符串中的字符。 –