28

鉴于从 中提取的特定行ifconfig,在我的情况下:

inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.255

如何提取192.168.2.13部分(本地 IP 地址),大概是使用正则表达式?

4

12 回答 12

60

这是一种使用方法grep

line='inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

结果:

192.168.2.13
192.168.2.256

如果您只想选择有效地址,您可以使用:

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"

结果:

192.168.0.255

否则,只需选择您要使用的字段awk,例如:

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | awk -v OFS="\n" '{ print $2, $NF }'

结果:

192.168.0.255
192.168.2.256


附录:

字边界\b

于 2012-07-14T10:30:59.170 回答
5

使用这个正则表达式((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?=\s*netmask)

于 2012-07-14T10:26:30.783 回答
4

只是添加一些替代方式:

ip addr | grep -Po '(?!(inet 127.\d.\d.1))(inet \K(\d{1,3}\.){3}\d{1,3})' 

它会打印出除 localhost 之外的所有 IP。

于 2015-02-10T17:15:20.100 回答
4

您可以在 egrep 中使用 egrep(与 grep -E 基本相同)
,其中有用于字符类的命名组,例如:“digit”
(在这种情况下会使命令更长 - 但你明白了......)

另一件很高兴知道的事情是您可以使用括号重复一个模式

ifconfig | egrep '([0-9]{1,3}\.){3}[0-9]{1,3}'

或者

ifconfig | egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'


如果您只关心实际 IP 地址,请使用参数-o将输出限制为匹配的模式而不是整行:

ifconfig | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

...如果你不想要 BCast 地址等,你可以使用这个 grep:

ifconfig | egrep -o 'addr:([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | egrep -o '[[:digit:]].*'

我以为您只是在谈论 IPv4 地址

于 2014-04-08T13:53:39.603 回答
3

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

于 2012-07-14T10:25:09.567 回答
1

我没有足够的声誉点来发表评论,但我在史蒂夫的“仅选择有效地址”正则表达式中发现了一个错误。我不太明白这个问题,但我相信我已经找到了解决办法。第一个命令演示了这个错误;第二个演示了修复:

$ echo "test this IP: 200.1.1.1" |grep -oE "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
$ echo "test this IP: 200.1.1.1" |grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
200.1.1.1
$
于 2015-02-19T11:39:11.767 回答
0

一种使用方式sed。第一条指令删除行中第一个数字之前的所有字符,第二条指令将第一个 IP 保存在组 1 ( \1) 中并用它替换所有行:

sed -e 's/^[^0-9]*//; s/\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/'
于 2012-07-14T10:45:31.310 回答
0

这段代码也很好用,也很简单。

ifconfig | grep Bcast > /tmp/ip1
cat /tmp/ip1 | awk '{ print $2 }' > /tmp/ip2
sed -i 's/addr://' /tmp/ip2
IPADDRESS=$(cat /tmp/ip2)
echo "$IPADDRESS"
于 2014-01-23T12:40:15.117 回答
0

此代码适用于我在树莓派零 w上。

(从输出中提取wlan0:inet 192.168.xy地址)ifconfig

在ifconfig输出中搜索模式 'inet 192'并使用空格分隔符获得第 10 个位置。

 $> ifconfig |grep 'inet 192'|cut -d' ' -f10

输出: 192.168.1.6

于 2019-01-01T17:27:23.017 回答
0
grep -oE "\b([0-9]{1,3}\.?){4}\b"
于 2018-09-14T09:59:09.780 回答
0

也许这是一个 sed 命令,仅用于运动:

    ip -o -4 addr show dev eth0 | sed 's/.* inet \([^/]*\).*/\1/'
于 2015-09-10T13:59:49.293 回答
0

如果使用支持 Perl 正则表达式的 grep:

(your command that pulls mentioned line) | grep -Po 'inet \K[\d\.]+'
于 2019-01-14T07:29:46.237 回答