grep OR条件向前看

时间:2015-11-11 11:01:32

标签: regex grep

我有包含数据的日志文件,如下所示,我正在尝试使用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能够同时捕获它们?

1 个答案:

答案 0 :(得分:3)

认为你的意思是,

grep -oP '(?<=MSG : )(?:.*(?=, MSGREFNUM)|.*)' file

DEMO

<强>解释

  • (?<=MSG : ) lookbehind,它位于MSG :
  • 旁边
  • (?:非捕获组的开始。
  • .*(?=, MSGREFNUM)首先,应该执行此模式。因此它匹配, MSGREFNUM之前存在的所有字符。现在正则表达式引擎应该看起来是下一个模式。
  • |
  • .*这匹配到最后一个字符。请注意,这仅适用于其余行(即行,其中, MSGREFNUM子字符串不存在)。