我必须从日志中提取数据,而我正在尝试使用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,因为还会有其他模式;这是第一次,我遇到了问题:(
答案 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/'
(请注意,我使用了-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