【发布时间】: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
$ip 是 222.222.222.222,正如你所期望的那样。
如果我$sUSER=machine.005
$ip 是 555.555.555.555 就像你所期望的那样
但如果我的 /etc/hosts 是:
222.222.222.222 machine_005
555.555.555.555 machine.005
那么如果我 $sUSER=machine_005 $ip 是 222.222.222.222 就像你所期望的那样。
但是,如果我$sUSER=machine.005 $ip 是222.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