awk split函数与正则表达式

时间:2015-07-20 19:42:26

标签: awk split solaris

我必须在两个标准上分割线,我用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]]

3 个答案:

答案 0 :(得分:4)

你永远不需要使用awk grep,因为awk可以做任何有用的事情,grep可以做。我不知道你是怎么用正则表达式做的,我只计算方括号:

$ 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]]

答案 1 :(得分:1)

您可以使用awk和输出字段分隔符来处理回车:

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

*我没有测试过这个,虽然它可能会让你对拆分的替代方法有所了解。

答案 2 :(得分: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'