Bash:编写一个函数来检查/ etc / hosts中是否存在给定的主机名

时间:2015-07-09 10:54:39

标签: bash awk hosts

我正在尝试用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
}

我更愿意使用awkgrep来获得解决方案。

这个函数适用于我较小的本地文件,但它在较大的文件上失败了;我不确定原因。我错过了什么?我怎样才能改进或简化我的功能?

我已经检查了以下答案,但它无法正常工作:https://stackoverflow.com/a/25277451/157762

2 个答案:

答案 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}}