我正在使用该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)
答案 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被认为是任何字符,所以正因为如此,它才捕获machine
和005|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