AWK - 当RS是正则表达式时使用RT给出了下一个匹配的RS而不是当前的RS

eda*_*els 2 regex awk grep

我试图使用gawk从日志中提取段落,它正在完美地工作,我想要包括它找到的记录分隔符.

这是命令:

gawk --re-interval 'BEGIN{RS="[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}.[0-9]{1,6} \\[[A-Z]*\\]";} /983a99f8-bec6-11e1-80dd-059a821d0b73/ {print $0}' full.log 
Run Code Online (Sandbox Code Playgroud)

如果我添加打印RT,$ 0,则打印下一个匹配的RT而不是当前匹配.

这是一些示例文本

9:08:06.899627 [DEBUG] <0.30065.3>@agent:1565 Recs to loop through:  [{agent_state,"OpenAcdAgent43","Jeff",
                            undefined,wrapup,
                            {call,"983a99f8-bec6-11e1-80dd-059a821d0b73",
                                voice,
                                {"8501112234","MorganGrimes"},
                                "9201",<0.30392.3>,[],
                                {client,"8221314","DCF",[],1340629596,
                                    1340629596},
                                [creole_general],
                                <0.30398.3>,outband,inband,inbound,10},
                            1340629658,undefined,"Default",1340629658
9:08:06.899707 [INFO] <0.168.0>@cpx_monitor:649 Down message for reference #Ref<0.0.16.137225> of <0.30064.3> due to normal
Run Code Online (Sandbox Code Playgroud)

我想成为9:08:06.899627 [DEBUG]能够做到的是在我的比赛前9:08:06.899627 [DEBUG],但RS取消了.我得到9:08:06.899707 [INFO].

谢谢!

Pau*_*ce. 5

那是因为记录分隔符出现在记录的末尾.那么9:08:06.899627 [DEBUG]是空记录9:08:06.899707 [INFO]的结束,并且是与GUID正则表达式匹配的记录的结尾.

您需要保存前一个RT并输出保存的一个.

gawk --re-interval 'BEGIN{RS="[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}.[0-9]{1,6} \\[[A-Z]*\\]";} /983a99f8-bec6-11e1-80dd-059a821d0b73/ {print savedRT, $0} {savedRT = RT}' full.log 
Run Code Online (Sandbox Code Playgroud)