将外部 IP 放入变量 - grep 操作失败

将外部 IP 放入变量 - grep 操作失败

我需要将我的 VPS 机器的 IP 放入变量中。我的意思是外部 IP 地址出现inet addrifconfig输出中的部分值。

我试过了:

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
ifconfigshowinterfaces 及其地址。您可能更喜欢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或或... 例如的另一个字符,但不是。09990999inet addr:1.2.3.4inet addr:11.22.33.44

括号组不匹配形成数字的字符串,只匹配单个字符。

相关内容