查找字符串中最后出现的模式

查找字符串中最后出现的模式

我正在尝试使用 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 地址。抓住那个。

相关内容