鉴于从ifconfig
开始的这条特定线路,在我的情况下:
inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.255
如何提取192.168.2.13
部分(本地IP地址),大概是使用正则表达式?
答案 0 :(得分:55)
这是使用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
附录:
答案 1 :(得分:4)
使用此正则表达式((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)
答案 2 :(得分:3)
你可以使用egrep(与grep -E基本相同)
在egrep中,有一些用于字符类的命名组,例如:“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地址
答案 3 :(得分:3)
只是添加一些替代方法:
ip addr | grep -Po '(?!(inet 127.\d.\d.1))(inet \K(\d{1,3}\.){3}\d{1,3})'
它将打印出所有IP,但是打印出localhost。
答案 4 :(得分:2)
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
答案 5 :(得分:1)
我没有足够的声誉点来评论,但我在史蒂夫的“仅选择有效地址”正则表达式中发现了一个错误。我不太明白这个问题,但我相信我找到了解决办法。第一个命令演示了这个bug;第二个演示了修复:
$ 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
$
答案 6 :(得分:0)
使用sed
的一种方法。第一条指令删除所有字符,直到行中的第一个数字,第二条指令保存第1组中的第一个IP(\1
)并用它替换所有行:
sed -e 's/^[^0-9]*//; s/\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/'
答案 7 :(得分: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"
答案 8 :(得分:0)
此代码在 raspberry pi零w 上对我有效。
(从ifconfig
输出中提取 wlan0:inet 192.168.x.y 地址)
在 ifconfig 输出中搜索模式'inet 192',并使用 space 定界符获得第10位。
$> ifconfig |grep 'inet 192'|cut -d' ' -f10
输出: 192.168.1.6
答案 9 :(得分:0)
如果使用支持Perl正则表达式的grep:
(your command that pulls mentioned line) | grep -Po 'inet \K[\d\.]+'