如何从`ip route`命令的输出中选择IP地址?

时间:2013-01-05 16:07:19

标签: linux sed grep pattern-matching

  

$ ip route get 255.255.255.255

     

广播255.255.255.255 dev eth0 src 192.168.223.129

我希望得到192.168.223.129的IP地址我所知道的是我必须使用sed命令。另外,您能描述一下使用的命令吗?

5 个答案:

答案 0 :(得分:3)

如果我要提取文本,首先出现的是grep / ack。

试试这个:

ip route get 255.255.255.255|grep -oP '(?<=src ).*'

答案 1 :(得分:3)

这是一种模式匹配问题,grep是最简单的,也是最适合这样做的工具。

您要匹配的是src后面的IP地址。您可以使用此正则表达式匹配IP地址:(\d{1,3}.){4}并使用positive lookbehind确保IP地址位于src之后的单词(?<=src )

$ ip route get 255.255.255.255 | grep -Po '(?<=src )(\d{1,3}.){4}'
192.168.223.129

要对grep使用正向前瞻,您需要为perl正则表达式使用-P标志,而-o标志告诉grep仅显示匹配的部分line作为grep的默认行为是显示包含匹配项的整行。

此解决方案独立于ip route get 255.255.255.255的输出,因为您正在搜索单词src后面的IP地址,而不依赖于输出的格式,例如它发生的最后一个字在第一行。

答案 2 :(得分:2)

使用AWK而不是

使用AWK可以更轻松地解决此问题。假设它不是家庭作业,请使用正确的工具!例如,要将IP地址存储在变量中以供以后使用,您可以执行以下操作:

ip_address=$(
    ip route get 255.255.255.255 |
    awk '{print $NF; exit}'
)

然后,您可以通过新变量访问该值。例如:

$ echo "$ip_address"
192.168.1.1

答案 3 :(得分:1)

如果您可以使用sed,则可以使用以下内容: 输出ip route

[aman@aman ~]$ ip route get 255.255.255.255
broadcast 255.255.255.255 dev wlan0  src 192.168.1.4 
    cache <local,brd> 

获取ip地址

[aman@aman ~]$ ip route get 255.255.255.255|head -1|cut -f7 -d' '
192.168.1.4

答案 4 :(得分:1)

使用sed你可以这样做:

ip route get 255.255.255.255 | sed -n '/src/ s/.*src //p'

-n抑制输出。 /src/位选择执行替换s///和打印p命令的行。替换命令s/.*src //删除所有内容,包括src(注意尾随空格)。