从file1获取IP并在file2中更新

从file1获取IP并在file2中更新

我有两个文件:一个文件包含需要在另一个文件中替换的 IP 列表。我的文件如下:

文件1.txt

173.43.24.67
170.34.24.59
172.83.47.83
160.28.39.49

文件2.txt

### HostList ##
[group]
dev  ansible_host=pub_ip1 ansible_user=ubuntu  
test ansible_host=pub_ip2 ansible_user=ubuntu  
prod ansible_host=pub_ip3 ansible_user=ubuntu
uat  ansible_host=pub_ip4 ansible_user=ubuntu

预期产出

### HostList ##
[group]
dev  ansible_host=173.43.24.67 ansible_user=ubuntu  
test ansible_host=170.34.24.59 ansible_user=ubuntu  
prod ansible_host= 172.83.47.83 ansible_user=ubuntu
uat  ansible_host=160.28.39.49 ansible_user=ubuntu

如果有人能帮助我实现上述目标,那就太好了。

答案1

您必须先删除 file2.txt 的前两行,然后:

$ paste file1.txt file2.txt  | tr '=' ' ' | awk '{printf("%s %s=%s %s\n",$2,$3,$1,$5)}' | column -t
dev   ansible_host=173.43.24.67  ansible_user
test  ansible_host=170.34.24.59  ansible_user
prod  ansible_host=172.83.47.83  ansible_user
uat   ansible_host=160.28.39.49  ansible_user

答案2

这应该在任何地方都有效:

awk '
    NR == FNR {m[NR]=$0}

    NR != FNR && f {
        sub(/=.*/, "=" m[NR-FNR], $2)
        print
    }

    NR != FNR && !f {
        print
        if (/^[[]/) f = 1
    }
' file1 file2

答案3

$ awk 'NR==FNR{ips[NR]=$1; next} FNR>2{sub(/=[^ ]+/,"="ips[FNR-2])} 1' file1.txt file2.txt
### HostList ##
[group]
dev  ansible_host=173.43.24.67 ansible_user=ubuntu
test ansible_host=170.34.24.59 ansible_user=ubuntu
prod ansible_host=172.83.47.83 ansible_user=ubuntu
uat  ansible_host=160.28.39.49 ansible_user=ubuntu

答案4

另一个基于第一个答案的 sed 。

paste <(sed -n '3,$p' file2.txt ) file1.txt |sed "s/\(^.*=\)\(pub_ip.\)\(.*\)\t\(.*\)/\1\4\3/"| cat <(head -2 file2.txt) -

输出:

### HostList ##
[group]
dev  ansible_host=173.43.24.67 ansible_user=ubuntu  
test ansible_host=170.34.24.59 ansible_user=ubuntu  
prod ansible_host=172.83.47.83 ansible_user=ubuntu
uat  ansible_host=160.28.39.49 ansible_user=ubuntu

编辑:

paste <(sed -n '3,$p' file2.txt ) file1.txt |sed "s/\(^.*=\)\(pub_ip[[:digit:]]*\)\(.*\)\t\(.*\)/\1\4\3/"| cat <(head -2 file2.txt) -

在 pub_ip 部分之后我们想要选择任何数字。

解释。 <(sed -n '3,$p' file2.txt )我们从 file2 中删除了第一两行。粘贴命令将其与 file1 合并。

输出paste <(sed -n '3,$p' file2.txt ) file1.txt

dev  ansible_host=pub_ip1 ansible_user=ubuntu   173.43.24.67
test ansible_host=pub_ip2 ansible_user=ubuntu   170.34.24.59
prod ansible_host=pub_ip3 ansible_user=ubuntu   172.83.47.83
uat  ansible_host=pub_ip14 ansible_user=ubuntu  160.28.39.49

之后,我们将该文件中的行分为四个部分。

(dev  ansible_host=) 1st
(pub_ip[digits]) 2nd
( ansible_user=ubuntu) 3rd (plus tab)
173.43.24.67 4th.

并打印第 1、4、3 部分。输出:

dev  ansible_host=173.43.24.67 ansible_user=ubuntu  
test ansible_host=170.34.24.59 ansible_user=ubuntu  
prod ansible_host=172.83.47.83 ansible_user=ubuntu
uat  ansible_host=160.28.39.49 ansible_user=ubuntu

=> 我们只需要将这个输出和 file2 中的前两行连接起来

相关内容