【问题标题】:awk matching incorrect hostname in /etc/hostsawk 在 /etc/hosts 中匹配不正确的主机名
【发布时间】:2019-04-20 13:33:47
【问题描述】:

我正在使用这个 awk 代码在 /etc/hosts 文件中选择一个 IP 地址,虽然我可以强制它匹配正确的主机名,但是如果 awk 首先看到它,它会选择一个“几乎相似”的主机名。我对此进行了研究,但我无法弄清楚。

sUSER=machine_005
ip=$(awk '/^[[:space:]]*($|#)/{next}/'$sUSER'/{print $1; exit}' /etc/hosts)

我知道第一部分查找 $ 或 #,如果找到则调用下一行。最终公式中需要此功能。需要的另一个功能是在第一场比赛后停止。 我知道下一个 /xxx/ 搜索该模式,如果找到则将 $1 打印到 $ip。

这是我的主机文件示例

555.555.555.555 machine.005
222.222.222.222 machine_005

如果我$sUSER=machine_005 $ip222.222.222.222,正如你所期望的那样。

如果我$sUSER=machine.005 $ip555.555.555.555 就像你所期望的那样

但如果我的 /etc/hosts 是:

222.222.222.222 machine_005
555.555.555.555 machine.005

那么如果我 $sUSER=machine_005 $ip222.222.222.222 就像你所期望的那样。

但是,如果我$sUSER=machine.005 $ip222.222.222.222 它需要machine_005 ip 地址。

这可能是一个错误吗?还是故意的?

谢谢。

你好。我想发布提供正确输出的最后一行代码。我感谢那些做出回应的人的所有帮助和指导。我想发布最终代码,以防将来有人发现它有用。

 ip=$(awk -v sUSER=$sUSER 'BEGIN{gsub(/\./,"\\.",sUSER)}match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) && $0 ~ ("[^[:alpha:]]"sUSER"$") && $0 !~ /^$/ && $0 !~ /^#/{print $1}' /etc/hosts)

【问题讨论】:

    标签: bash parsing awk match matching


    【解决方案1】:

    在正则表达式中,. 匹配任何字符。您需要对其进行转义以使其在字面上匹配。

    sUser='machine\.005'
    

    如果您从用户输入中获取值,则可以使用 shell 的替换运算符:

    sUser=${sUser//./\\.}
    

    另请参阅 How do I use shell variables in an awk script?,了解将 shell 变量合并到 awk 脚本中的更好方法。

    【讨论】:

      【解决方案2】:

      getent 是一个用于从/etc/hosts(和其他配置数据库)检索条目的工具:

      getent hosts "${USER}" | cut -d' ' -f1
      

      【讨论】:

        猜你喜欢
        • 2022-10-04
        • 2011-07-05
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多