2015-07-20 45 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'