2015-07-20 53 views
0

我必須在兩個標準上分割線,我用awk和它的分割函數做了它。awk與正則表達式的分割函數

以下是樣本輸入

|ERROR|ErrorHandler|[opName:Fulfill][msisdn:123][clientTrxId:[eventId:1][actionId:34]]|Failed delivery 

下面我來分析它

grep ErrorHandler a.log | awk -F'|' '{split($3,a,"\[(.*?)\]"); print a[1]}' 

我期待輸出像 [opName:履行] 但它顯示整條生產線

[opName:Fulfill][msisdn:123][clientTrxId:[eventId:1][actionId:34]] 

其歸因於上次]]。

如何修改我的正則表達式所以它解析像下面

[opName:Fulfill] 
[msisdn:123] 
[clientTrxId:[eventId:1][actionId:34]] 
+0

您無法像使用普通正則表達式那樣處理匹配對。 –

+0

任何替代建議,以實現這項任務 – ImranRazaKhan

回答

1

你可能使用awk隨着輸出字段分隔符來處理回車:

grep ErrorHandler a.log | awk -F'[|\\]]+' 'BEGIN {OFS="]\n"} {print $4, $5, $6 "]" $7 "]]"}' 

*我的天堂我沒有測試過這個,儘管它可能會給你一些想法來替代分裂。

4

因爲awk可以做grep可以做的任何有用的事情,所以你永遠不需要grep with awk。我不知道你會怎麼用正則表達式做到這一點,我算了算括號:

$ cat tst.awk 
BEGIN { FS="|" } 
/ErrorHandler/ { 
    # identify the fields by analyzing one char at a time 
    for (charNr=1;charNr<=length($4);charNr++) { 
     char = substr($4,charNr,1) 
     if ((char == "[") && (++braceCnt == 1)) { 
      fld = "" 
     } 
     fld = fld char 
     if ((char == "]") && (--braceCnt == 0)) { 
      flds[++numFlds] = fld 
     } 
    } 

    # print the fields 
    for (fldNr=1;fldNr<=numFlds;fldNr++) { 
     print flds[fldNr] 
    } 
} 

$ awk -f tst.awk a.log 
[opName:Fulfill] 
[msisdn:123] 
[clientTrxId:[eventId:1][actionId:34]] 
0

lua patterns可以做到匹配,對匹配。

printf '|ERROR|ErrorHandler|[opName:Fulfill][msisdn:123][clientTrxId:[eventId:1][actionId:34]]|Failed delivery\n' | \ 
    awk -F \| '{print $4}' | \ 
    lua -e 'for line in io.lines() do 
     for w in line:gmatch("%b[]") do 
      print(w) 
     end 
    end'