我正在尝试用bash编写一个函数来检查hostname
中是否存在给定的/etc/hosts
。评论和部分匹配不应计算在内。换句话说,如果完全找到指定的0
,它应该只返回hostname
。这是我到目前为止所得到的:
check_host()
{
AWK=$(awk '$1 ~ /^#/ { next } $2=="'$1'" {print $2}' /etc/hosts)
if [ -n "$AWK" ]; then
return 0
else
return 1
fi
}
我更愿意使用awk
或grep
来获得解决方案。
这个函数适用于我较小的本地文件,但它在较大的文件上失败了;我不确定原因。我错过了什么?我怎样才能改进或简化我的功能?
我已经检查了以下答案,但它无法正常工作:https://stackoverflow.com/a/25277451/157762
答案 0 :(得分:2)
您可以使用getent
命令将其传递给awk
:
getent hosts | awk -v host="$HOSTNAME" '{for(i=1;i<=NF;i++){if($i==host){print $i;e=1}}}END{exit !e}'
awk
使用空格序列作为(默认)分隔符拆分该行,并检查它是否与主机名完全匹配。如果找到它会打印主机名并退出0
,否则它不会输出任何内容并以1
退出。
getent
的优点是它在系统上显示有效的本地主机信息,而不是解析/etc/hosts
。虽然这可能是许多用例的首选,但我也可以想象确实需要解析/etc/hosts
的用例。在那种情况下,我建议使用真正的解析器,如提到here
前回答(错误)
您可以使用getent
命令:
getent hosts | grep -wF HOSTNAME
但是,这取决于hosts
中的/etc/nsswitch.conf
设置,但它应该与我所知道的所有Linux发行版附带的默认配置一起使用。
错误,因为: -w告诉grep该模式应该被字边界包围,我正在使用它来确保foo-bar
不匹配模式foo
。不幸的是,连字符是一个单词边界!! (捂脸)
答案 1 :(得分:1)
您可以使用以下功能:
check_host localhost; echo $?
0
check_host foobar; echo $?
1
<强>测试强>
{{1}}