我需要将我的 VPS 机器的 IP 放入变量中。我的意思是外部 IP 地址出现inet addr
在ifconfig
输出中的部分值。
我试过了:
ipa="$(hostname -i)"
但echo ${ipa}
带来了 localhost token: 127.0.1.1
,所以我寻找其他解决方案,我发现的所有解决方案包括许多awk
我一无所知的管道和操作(从未使用过awk
,我对正则表达式不是很熟悉)。
我试过这个:
ipa=$(ifconfig | grep "inet addr:[0-999]\.[0-999]\.[0-999]\.[0-999]")
但由于echo ${ipa}
输出为空行,它失败了。
为什么我尝试的方法失败了,或者至少你将如何解决它?
答案1
ipa=$(ifconfig | perl -lane '/inet addr:(\S+)/ and $1 !~ "^127" and print $1')
另请参阅这里有大量的替代方案。例如使用grep
:
ipa=$(ifconfig | grep -Po 'inet addr:\K[^\s]+' | grep -v '^127')
解释:
ipa=$( )
将括号中的命令输出分配给变量ipa
ifconfig
showinterfaces 及其地址。您可能更喜欢ip address
| grep -Po 'inet addr:\K[^\s]+'
使用兼容的正则表达式过滤输出perl
,再次打印匹配的文本
| grep -v '^127'
过滤器,这次排除以 ( -v
) 开头的 ( ^
)值127
为了获取我的外部IP,我通常这样做:
dig +short myip.opendns.com @resolver1.opendns.com
答案2
grep "inet addr:[0-999]\.[0-999]\.[0-999]\.[0-999]"
这将匹配后跟单个字符的字符串,该字符是to 、 a或 ainet addr:
中的数字,后跟一个点,然后是to或或... 例如的另一个字符,但不是。0
9
9
9
0
9
9
9
inet addr:1.2.3.4
inet addr:11.22.33.44
括号组不匹配形成数字的字符串,只匹配单个字符。