我有包含数据的日志文件,如下所示,我正在尝试使用grep
提取部分行。
数据:
Wed Nov 11|09:14:00.750|I|39|Dispatched message : uID : A13549123c, MSG : Some message here. Can be any amount of chars and contain anything., MSGREFNUM : 12948230158AASJKDHACNBMAMNSBD, Sender : IamSender|com.uws.wamg2.MessDisp|dispatchMessage|123
Wed Nov 11|09:58:01.928|I|41|Dispatched message : uID : 09qwCA0erR, MSG : Some other message without REFNUMcrap.
从第1行中提取MSG:
grep -o -P '(?<=MSG : ).*(?=, MSGREFNUM)' testfile
返回:
Some message here. Can be any amount of chars and contain anything.
第二行永远不会包含MSGREFNUM,只是一个“。”和换行符。
我想也许“^”可以用来匹配换行符,但它不起作用。
也许最好匹配“MSG:blabla而不是MSGREFNUM”?
如何在grep中添加OR条件*(例如“\ _”或类似的)以便grep能够同时捕获它们?
答案 0 :(得分:3)
认为你的意思是,
grep -oP '(?<=MSG : )(?:.*(?=, MSGREFNUM)|.*)' file
<强>解释强>
(?<=MSG : )
lookbehind,它位于MSG :
(?:
非捕获组的开始。.*(?=, MSGREFNUM)
首先,应该执行此模式。因此它匹配, MSGREFNUM
之前存在的所有字符。现在正则表达式引擎应该看起来是下一个模式。|
或.*
这匹配到最后一个字符。请注意,这仅适用于其余行(即行,其中, MSGREFNUM
子字符串不存在)。