需要使用已知主机名grep / etc / hosts,然后从/ etc / hosts捕获主机名的ip地址

时间:2014-08-13 03:09:34

标签: regex linux bash dns hosts

需要使用已知主机名grep / etc / hosts,然后从/ etc / hosts中捕获主机名的ip地址。

我不是程序员,也不知道怎么做。我对正则表达式的经验非常有限,但认为这可能会以某种方式起作用。我没有使用DNS,只使用/ etc / hosts文件进行管理。

我需要使用已知的主机名grep / etc / hosts文件,然后捕获hosts条目的IP地址。主机文件是标准格式:       

请帮忙!

更新:

#维护网络

192.168.80.192  testsrv01-maint
192.168.80.193  testsrv02-maint
192.168.80.194  testsrv03-maint

#熄灯网络

192.168.120.192  testsrv01-ilo
192.168.120.193  testsrv02-ilo
192.168.120.194  testsrv03-ilo

#主要数据网

192.168.150.192  testsrv01-pri
192.168.150.193  testsrv02-pri
192.168.150.194  testsrv03-pri

#辅助数据网

192.168.200.192  testsrv01-sec
192.168.200.193  testsrv02-sec
192.168.200.194  testsrv03-sec

我需要能够将每台机器的ip地址和完整主机名条目捕获到我可以使用的变量中。例如,运行文件寻找匹配" testsrv01 *",并捕获该搜索的所有IP地址和名称。那么" testsrv02 *"等等。

2 个答案:

答案 0 :(得分:9)

简单回答

ip=$(grep 'www.example.com' /etc/hosts | awk '{print $1}')


更好的回答 简单的答案返回所有匹配的IP,甚至是评论行上的IP。您可能只想要第一个非评论匹配,在这种情况下只需使用awk直接:

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


另一件事如果您在某个时候关心解析www.example.com您的系统是否配置为使用主机,dns等,那么请考虑鲜为人知的{{1}命令:

getent


编辑以响应更新

ip=$(getent hosts 'www.example.com' | awk '{print $1}')

答案 1 :(得分:3)

您可以使用grepPerl regex输出目标主机名的IP。

grep -oP '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=.*hostname)' /etc/hosts

说明:

  • ^找到一行的开头
  • \d{1,3}找到一到三位数字
  • \.找到一个点
  • (?=something)找到something但未将其包含在匹配项中(“zero-width positive look-ahead assertion”)
  • 没有前面反斜杠的
  • .会找到任何字符
  • *重复前面的表达式(在本例中为“任何字符”)零次或多次

换句话说,这将找到一系列由点分隔的四位一位到三位数字,如果它们后跟任何字符串然后grep -o),则打印它们(hostname),所有这一切都在一条线上。