用源文件中的字符串替换输出文件中字符串中的值

用源文件中的字符串替换输出文件中字符串中的值

我需要替换这些值,特别是该文件底部名为 的现有文件中等号“ =”和冒号“ ”之间的值,即: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
...

相关内容