awk匹配/ etc / hosts中不正确的主机名

时间:2018-11-17 17:03:33

标签: bash parsing awk match matching

我正在使用该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)

3 个答案:

答案 0 :(得分:0)

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

sUser='machine\.005'

如果要从用户输入中获取值,则可以使用外壳程序的替换运算符:

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

有关将shell变量合并到awk脚本中的更好方法,请参见How do I use shell variables in an awk script?

答案 1 :(得分:0)

EDIT2: ,因为OP需要删除从#开始的行和我认为空的行,然后尝试遵循。

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


编辑: 或尝试在awk代码本身中转义DOT,请尝试执行以下操作。

sUser="machine.005"
awk -v sUser="$sUser" 'BEGIN{sub(/\./,"\\.",sUser)} match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) && $0 ~ sUser{print $2}'  Input_file


由于DOT被认为是任何字符,所以正因为如此,它才捕获machine005|6之间的所有内容,因此我们需要对其进行转义以告知程序它是实际的DOT,因此不应被视为特殊含义。

请您尝试以下。

sUser="machine\\\.005"
awk -v u="$sUser" 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) && $0 ~ u{print $2}' Input_file

输出如下。

machine.005

答案 2 :(得分:0)

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

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