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