操作 AWK 字段变量 ($1,$2,..) 并将其添加到行尾

Manipulate AWK field variables ($1,$2,..) and add that to the end of line

我正在尝试从 ansible 库存文件创建 /etc/host 文件。

Ansible 清单文件如下所示:

[masters]
k8s-master-a.example.com ansible_ssh_host=10.15.90.2
k8s-master-b.example.com ansible_ssh_host=10.15.90.3
k8s-master-c.example.com ansible_ssh_host=10.15.90.4
[etcd]
k8s-etcd-a.example.com ansible_ssh_host=10.15.91.2
k8s-etcd-b.example.com ansible_ssh_host=10.15.91.3
k8s-etcd-c.example.com ansible_ssh_host=10.15.91.4

以下脚本将有助于使用 fqdn 条目创建它。

$cat inventory.yaml | grep -v '^\[' | sed 's/ansible_ssh_host=//g' | awk '{ print  " " }' > /etc/hosts
10.15.90.2 k8s-master-a.example.com  
10.15.90.3 k8s-master-b.example.com  
10.15.90.4 k8s-master-c.example.com  
10.15.91.2 k8s-etcd-a.example.com 
10.15.91.3 k8s-etcd-b.example.com 
10.15.91.4 k8s-etcd-c.example.com 

但我想在 /etc/hosts 文件中包含 k8s-master-* 和 k8s-etcd-* aslo。最终结果应该是这样的。

10.15.90.2 k8s-master-a.example.com k8s-master-a
10.15.90.3 k8s-master-b.example.com k8s-master-b
10.15.90.4 k8s-master-c.example.com k8s-master-c
10.15.91.2 k8s-etcd-a.example.com k8s-etcd-a
10.15.91.3 k8s-etcd-b.example.com k8s-etcd-b
10.15.91.4 k8s-etcd-c.example.com k8s-etcd-c

AWK 解决方案:

awk -F'[ =]' '/^[^\[]/ { if (match(,/\./)) print($NF " "  " " substr(,0,RSTART-1)); }'

测试:

$ awk -F'[ =]' '/^[^\[]/ { if (match(,/\./)) print($NF " "  " " substr(,0,RSTART-1)); }' inventory.yaml
10.15.90.2 k8s-master-a.example.com k8s-master-a
10.15.90.3 k8s-master-b.example.com k8s-master-b
10.15.90.4 k8s-master-c.example.com k8s-master-c
10.15.91.2 k8s-etcd-a.example.com k8s-etcd-a
10.15.91.3 k8s-etcd-b.example.com k8s-etcd-b
10.15.91.4 k8s-etcd-c.example.com k8s-etcd-c

您只需要 awk 即可。这将完成工作:

cat inventory.yaml 
[masters]
k8s-master-a.example.com ansible_ssh_host=10.15.90.2
k8s-master-b.example.com ansible_ssh_host=10.15.90.3
k8s-master-c.example.com ansible_ssh_host=10.15.90.4
[etcd]
k8s-etcd-a.example.com ansible_ssh_host=10.15.91.2
k8s-etcd-b.example.com ansible_ssh_host=10.15.91.3
k8s-etcd-c.example.com ansible_ssh_host=10.15.91.4

awk -F'[[:space:]=]' '/^[^[]/ {split(, tokens, /[.]/); print , , tokens[1]}' inventory.yaml  
10.15.90.2 k8s-master-a.example.com k8s-master-a
10.15.90.3 k8s-master-b.example.com k8s-master-b
10.15.90.4 k8s-master-c.example.com k8s-master-c
10.15.91.2 k8s-etcd-a.example.com k8s-etcd-a
10.15.91.3 k8s-etcd-b.example.com k8s-etcd-b
10.15.91.4 k8s-etcd-c.example.com k8s-etcd-c

if 'd' 文件中的数据,在 gnu awk 上试过:

awk -F'[.= ]' '[=10=]!~/^\[/{print ".""."".",,".",}' d
$ awk -F'[=[:space:]]+' 'split(,f,/[.]/)>1{print $NF, , f[1]}' file
10.15.90.2 k8s-master-a.example.com k8s-master-a
10.15.90.3 k8s-master-b.example.com k8s-master-b
10.15.90.4 k8s-master-c.example.com k8s-master-c
10.15.91.2 k8s-etcd-a.example.com k8s-etcd-a
10.15.91.3 k8s-etcd-b.example.com k8s-etcd-b
10.15.91.4 k8s-etcd-c.example.com k8s-etcd-c