如何仅从 Linux 中的 ip addr 检索 IPV4

How to retrieve only the IPV4 from ip addr in Linux

我正在尝试将 tun0 接口的 IPV4 传递到脚本中。

./start.sh `ip addr | grep tun0 | grep inet`

我遇到的问题是我想不出如何将其进一步分离以获得 10.10.14.252

inet 10.10.14.252/23 scope global tun0

感谢任何帮助,也许使用 sed 仅检索 10.10.14.252。 IPV4 是动态的,脚本可以在任何环境下执行,不一定总是以 10.10

开头
ip addr | grep tun0|grep inet|tr ' ' "\n"|grep 10.|tr '/' "\n"|grep 10

这有效,它很长但有效。但是我能保证 IPV4 总是以 10 开头吗?

试试 Awk。

ip addr |
awk '/inet/ && /tun0/ {
  ip = ; sub(/\/.*/, "", ip); print ip }'

通常,如果您有一个 grep 进入 sed 或 Awk 的管道,get rid of the grep.

一个 sed 使用 ip 地址捕获组的想法:

$ ip addr | sed -En '/inet .* tun0/{s/^inet ([^ /]*).*//p}'

注意: 假定 ip 地址紧跟在 inet 字符串之后,然后是 space 或正斜杠

出于测试目的,我们假设 ip addr > ip.out 生成:

$ cat ip.out
some stuff on line 1
inet 10.10.14.252/23 scope global tun0
some stuff on line 3

正在模拟 ip addr:

$ cat ip.out | sed -En '/inet .* tun0/{s/^inet ([^ /]*).*//p}'
10.10.14.252

jqip -json 一起使用:

$ ip -j -4 -o addr | jq -r '.[] | select(.addr_info[].dev=="tun0") | .addr_info[].local'

我建议:

ip -o -4 addr list tun0 | awk -F ' *|/' '{print }'