我需要替换这些值,特别是该文件底部名为 的现有文件中等号“ =
”和冒号“ ”之间的值,即:
zoo.cfg
...
Server.1=10.42.227.70:2891:3881
Server.2=10.42.229.63:2891:3881
Server.3=10.42.234.18:2891:3881
...
使用主机文件(即源文件)中的值,即
10.42.227.66 zoo1
10.42.229.119 zoo2
10.42.234.21 zoo3
有人可以指导我如何做到这一点吗?
另外,zoo.cfg 文件中的Server.1 等于zoo1,Server.2 等于zoo2,Server.3 等于zoo3。
为了补充这个问题,在主机文件中,有多个其他主机的条目(即除了zoo1、zoo2和zoo3之外的主机)。 Hosts文件内容如下:
10.42.224.153 dev.nifi1.datacond.dfc
10.42.229.87 dev.nifi2.datacond.dfc
10.42.236.46 dev.nifi3.datacond.dfc
10.42.231.56 zoo1
10.42.224.225 zoo2
10.42.239.41 zoo3
10.42.233.198 controlnode
10.42.231.56 node-master
10.42.230.71 node1
10.42.237.120 node2
有没有办法修改 awk 脚本,以便仅处理动物园主机行,即忽略所有其他主机条目?
答案1
使用任何 awk:
$ cat tst.awk
NR == FNR {
map[$2] = $1
next
}
FNR == 1 {
tgt = FILENAME
sub(/\.[^.]*$/,"",tgt)
}
{
key = $1
sub(/=.*/,"",key)
sub(/.*\./,"",key)
key = tgt key
}
key in map {
sub(/=[^:]+/,"=" map[key])
}
{ print }
$ awk -f tst.awk hosts zoo.cfg
...
Server.1=10.42.231.56:2891:3881
Server.2=10.42.224.225:2891:3881
Server.3=10.42.239.41:2891:3881
...
上面假设第一个字段host
不包含任何&
s 并且您的字段都不包含空格,如示例所示。
以上是在这些输入文件上运行的:
$ head -50 hosts zoo.cfg
==> hosts <==
10.42.224.153 dev.nifi1.datacond.dfc
10.42.229.87 dev.nifi2.datacond.dfc
10.42.236.46 dev.nifi3.datacond.dfc
10.42.231.56 zoo1
10.42.224.225 zoo2
10.42.239.41 zoo3
10.42.233.198 controlnode
10.42.231.56 node-master
10.42.230.71 node1
10.42.237.120 node2
==> zoo.cfg <==
...
Server.1=10.42.227.70:2891:3881
Server.2=10.42.229.63:2891:3881
Server.3=10.42.234.18:2891:3881
...