我正在尝试使用 grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} 解析 IP 地址的日志文件行。 [0-9]{1,3}' 并且只想提取每个给定行中的最后一个 IP 地址。
要解析的两行示例:
Via: SIP/2.0/UDP 78.41.207.101:5237;branch=z9hG4bK-577783956;rport=5237
Via: SIP/2.0/UDP 127.0.0.1:5079;branch=z9hG4bK-1014230957;rport=5079;received=194.126.22.146
我越来越:
78.41.207.101
127.0.0.1
194.126.22.146
我想得到什么:
78.41.207.101
194.126.22.146
我将不胜感激你的帮助。
答案1
你可以试试这个sed
sed -E 's/.*[^0-9](([0-9]{1,3}\.){3}[0-9]{1,3}).*/\1/' infile
解释 :
-E 使用扩展正则表达式。
如果没有 -E 你必须这样写命令
sed 's/.*[^0-9]\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/' infile
(([0-9]{1,3}.){3}[0-9]{1,3}) 与您的 RE 相同。
<-------> !
1 3 time
'[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'
<---------><---------><--------->
1 2 3
第一部分 .*[^0-9] 是贪婪的。
它匹配行中最后一个正则表达式之前的所有内容。
最后一个 .* 匹配行尾。
答案2
我喜欢在这种情况下使用 awk:
$ awk '{print $NF}' FPAT="[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}" file1
78.41.207.101
194.126.22.146
FPAT
用于定义字段的组成(与 grep -o 模式相同)
$NF
是每行的最后一个字段
答案3
大多数正则表达式机器使用贪婪模式,即它们尽可能匹配。所以类似的东西^.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
会匹配直到并包括最后的 IPv4 地址。抓住那个。