如何仅从hosts文件中获取IP地址?Bash

1 投票
1 回答
817 浏览
提问于 2025-04-18 05:15

我有一个 /etc/hosts 文件的例子:

127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

## vagrant-hostmanager-start
<ipaddress1>   namenode
<ipaddress2> secondarynamenode
<ipaddress3>   slave1
<ipaddress4>  slave2

< it can be more slave nodes here>
## vagrant-hostmanager-end

现在我正在配置一个 Hadoop 集群,我需要把 /etc/hosts 文件分成以下的格式:

主节点(namenode)和备用节点(secondarynamenode)要放到一个叫做 masters 的文件里,其他的从节点(slaves)要放到一个叫做 slaves 的文件里。至少会有一个主节点,可能会有零个或多个从节点。

我想知道在 bash 中,最简单的方法是什么,来解析这个文件并把内容写入到相应的文件(masters 和 slaves)里?我用 Python 可以很简单做到,但我需要用 bash 来完成。masters 文件的内容会像这样:

<ipaddress1>
<ipaddress2>

而 slaves 文件的内容会像这样:

<ipaddress3>
<ipaddress4>

就这样,两个文件里只包含 IP 地址,而不包含机器的名字……这样做的原因是,如果机器的名字在里面,Hadoop 就无法正常工作。

我该如何使用 awkbash 来实现这个?我有以下这个命令:

awk '/namenode/{print >"masters"; next} /slave[0-9]/{print > "slaves"}' /etc/hosts

但这个命令会保留机器的名字……

1 个回答

2

这里有一种使用 awk 的方法:

awk '
$2~/namenode/ { print $1 > "masters" } 
$2~/slave/ { print $1 > "slaves"}
' /etc/hosts

撰写回答