多行sed正则表达式提取问题:缓冲区匹配的一部分

时间:2014-03-13 07:51:42

标签: regex bash sed

我必须从日志中提取数据,而我正在尝试使用sed从3行中提取数据。日志条目(在grepping之后)如下所示:

Tuesday March 11 2014
INBOUND>>>>>  06:22:10:066 Eventid:141004(3)
[SGW-S11/S4]GTPv2C Rx PDU, from 172.9.9.1:10000 to 173.10.10.1:2123 (187)
TEID: 0x00000000, Message type: EGTP_CREATE_SESSION_REQUEST (0x20)

我需要提取“从IP”,“到IP”和“消息类型”。 这就是我现在所拥有的:

sed -n '1!N; s/^INBOUND>>>>>.*\n.*from \([0-9.]*\).* to \([0-9.]*\).*/\1 \2/p'
  • 当我将其扩展到第三行时,要提取消息类型,使用:

    sed -n '1!N; s/^INBOUND>>>>>.*\n.*from \([0-9.]*\).* to \([0-9.]*\).*\n.*, Message type: \([A-Z_]*\).*/\1 \2/p'

    整个模式不匹配。

  • 这与字符串不匹配,除非在INBOUND>>>>>字符串之前有一行,我认为应该匹配,因为^表示行的开头。 (这不是一个真正的问题,因为有一个日期戳,只是好奇心)

Bash版本:GNU bash,版本3.2.25(1)-release(x86_64-redhat-linux-gnu)

Sed版本:GNU sed版本4.1.5

你能不能给我任何指示?提前谢谢。

P.S。 IP可以是IPv4或IPv6,但是一旦这个问题得到解决,我就会更改IP正则表达式。

P.P.S。我需要使用正则表达式,即不是awk,因为还会有其他模式;这是第一次,我遇到了问题:(

2 个答案:

答案 0 :(得分:1)

  • 您的整个模式

    sed -n '1!N; s/^INBOUND>>>>>.*\n.*from \([0-9.]*\).* to \([0-9.]*\).*\n.*, Message type:\([A-Z_]*\).*/\1 \2/p'

    无法匹配,因为您在Message type:\([A-Z_]*\)之间缺少空格

  • 您确定INBOUND之前没有隐藏字符(当您省略第一行时)吗?

这个适用于我:

sed -r 's/.*from ([0-9.:]*) to ([0-9.:]*).*Message type: ([A-Z_]*).*/\1 \2 \3/'

enter image description here (请注意,我使用了-r标志,因此我不必转义括号)

答案 1 :(得分:0)

您可以使用awk而不使用正则表达式:

awk -F" |:" '/^INBOUND/ {getline;print $5 RS $8;getline;print $7}' file
172.9.9.1
173.10.10.1
EGTP_CREATE_SESSION_REQUEST

您说这是grep的约会,可能会合并到awk 向我们提供所有数据以及您希望如何输出,我们将为您提供帮助。

awk -F" |:" '/^INBOUND/ {getline;printf "%s %s",$5,$8;getline;print "",$7}' file
172.9.9.1 173.10.10.1 EGTP_CREATE_SESSION_REQUEST