TL;DR; 对于IPv4地址,我更喜欢选项2。调整正则表达式以获取IPv6和/或
awk
来获取两者。针对
EDIT中提出的建议,稍作修改就可以使用选项2。
虽然我的回答来得非常晚,但是我想在这里分享我的解决方案,特别是因为已接受的答案在openWRT上无法使用(最小安装没有Python),而其他答案在逗号后面找不到地址而出现错误。
选项1(从Nameserver发送的最后一个条目中提供最后一个地址):
nslookup example.com 2>/dev/null | tail -2 | tail -1 | awk '{print $3}'
非常简单明了,不需要解释管道命令。
不过,在我的测试中,这总是返回IPv4地址(因为IPv4始终是最后一行,至少在我的测试中是)。然而,我读到了关于nslookup
的意外行为。因此,我必须找到一种方法来确保即使顺序相反,我也能获得IPv4 - 感谢正则表达式
选项2(确保您获得IPv4):
nslookup example.com 2>/dev/null | sed 's/[^0-9. ]//g' | tail -n 1 | awk -F " " '{print $2}'
解释:
nslookup example.com 2>/dev/null
- 查询给定主机并忽略 STDERR (2>/dev/null
)
sed 's/[^0-9. ]//g'
- 正则表达式获取 IPv4 (数字和点, 可以在这里了解 's' 命令 here)
tail -n 1
- 获取最后 1 行 (或者使用 tail -1
)
awk -F " " '{print $2}
- 使用 " " 作为字段分隔符,捕获并打印行的第二部分
编辑: 根据评论稍作修改,使其更通用:
nslookup example.com 2>/dev/null | printf "%s" "$(sed 's/[^0-9. ]//g')" | tail -n 1 | printf "%s" "$(awk -F " " '{print $1}')"
在上面的编辑中,我使用了
printf
命令替换来处理任何不需要的尾随换行符。
busybox
中运行您的代码,那么它并不是 bash;这意味着您需要 POSIX sh 兼容性,这是一种不同的语言(尽管 bash 是其超集,就像 C++ 是 C 的超集一样)。请适当标记。 - Charles Duffy