有没有办法根据一个公共键列(ip 地址)对来自两个不同命令的 bash 输出进行“左外连接”?出于各种原因,我想避免将任一命令的输出保存到文件中,并使用文件名作为 awk/join 的输入。
这是我想要合并在一起的两个输出:
output1=$(oc get pod -lname=elasticsearch -o wide)
output2=$(curl -ks https://elasticsearch.apps.ocp.domain.com/_cat/allocation?v)
这是我的 elasticsearch pod 的磁盘利用率
$ echo "$output1"
shards disk.indices disk.used disk.avail disk.total disk.percent host ip node
347 1.5tb 1.5tb 4.2tb 5.8tb 27 10.1.1.1 10.1.1.1 jxAuPMt
335 1.7tb 1.7tb 4tb 5.8tb 30 10.2.2.2 10.2.2.2 bwYW1cg
341 1.3tb 1.9tb 959.7gb 2.9tb 67 10.3.3.3 10.3.3.3 69O4sR-
343 1.6tb 1.7tb 1.1tb 2.9tb 59 10.4.4.4 10.4.4.4 zCVUS05
346 1.4tb 1.9tb 1000.6gb 2.9tb 66 10.5.5.5 10.5.5.5 AlvtEtf
345 1.6tb 1.6tb 1.2tb 2.9tb 57 10.6.6.6 10.6.6.6 pmObkSm
248 1tb 1tb 374.9gb 1.4tb 74 10.7.7.7 10.7.7.7 OSzB5J1
332 1.4tb 1.9tb 952.1gb 2.9tb 68 10.8.8.8 10.8.8.8 EShhlrb
218 1011.8gb 1tb 418.2gb 1.4tb 71 10.9.9.9 10.9.9.9 1rQ7PXD
329 1.7tb 1.8tb 1tb 2.9tb 63 10.10.10.10 10.10.10.10 73TfUnn
15 UNASSIGNED
以下是我的环境中正在运行的 elasticsearch pod
$ echo "$output2"
NAME READY STATUS RESTARTS AGE IP NODE
elasticsearch-4-40700 1/1 Running 0 4d 10.1.1.1 server1b.ocp.domain.com
elasticsearch-4-6m2p1 1/1 Running 0 4d 10.2.2.2 server2b.ocp.domain.com
elasticsearch-4-8n8v5 1/1 Running 0 7d 10.3.3.3 server3b.ocp.domain.com
elasticsearch-4-ffnk0 1/1 Running 0 4d 10.4.4.4 server4b.ocp.domain.com
elasticsearch-4-h5xr6 1/1 Running 0 7d 10.5.5.5 server5b.ocp.domain.com
elasticsearch-4-h6c15 1/1 Running 0 7d 10.6.6.6 server6b.ocp.domain.com
elasticsearch-4-j7cv5 1/1 Running 0 7d 10.7.7.7 server7b.ocp.domain.com
elasticsearch-4-nn3pc 1/1 Running 0 5d 10.8.8.8 server8b.ocp.domain.com
elasticsearch-4-sq5hr 1/1 Running 0 7d 10.9.9.9 server9b.ocp.domain.com
elasticsearch-4-zj7tq 1/1 Running 0 7d 10.10.10.10 server10b.ocp.domain.com
elasticsearch-4-az9sp 1/1 Running 0 7d 10.10.10.11 server11b.ocp.domain.com
elasticsearch-4-bi2c7 1/1 Running 0 7d 10.10.10.12 server12b.ocp.domain.com
根据 IP 地址对输出 1 和输出 2 进行“左外连接”后的预期结果
NAME READY STATUS RESTARTS AGE IP NODE shards disk.indices disk.used disk.avail disk.total disk.percent node
elasticsearch-4-40700 1/1 Running 0 4d 10.1.1.1 server1b.ocp.domain.com 347 1.5tb 1.5tb 4.2tb 5.8tb 27 jxAuPMt
elasticsearch-4-6m2p1 1/1 Running 0 4d 10.2.2.2 server2b.ocp.domain.com 335 1.7tb 1.7tb 4tb 5.8tb 30 bwYW1cg
elasticsearch-4-8n8v5 1/1 Running 0 7d 10.3.3.3 server3b.ocp.domain.com 341 1.3tb 1.9tb 959.7gb 2.9tb 67 69O4sR-
elasticsearch-4-ffnk0 1/1 Running 0 4d 10.4.4.4 server4b.ocp.domain.com 343 1.6tb 1.7tb 1.1tb 2.9tb 59 zCVUS05
elasticsearch-4-h5xr6 1/1 Running 0 7d 10.5.5.5 server5b.ocp.domain.com 346 1.4tb 1.9tb 1000.6gb 2.9tb 66 AlvtEtf
elasticsearch-4-h6c15 1/1 Running 0 7d 10.6.6.6 server6b.ocp.domain.com 345 1.6tb 1.6tb 1.2tb 2.9tb 57 pmObkSm
elasticsearch-4-j7cv5 1/1 Running 0 7d 10.7.7.7 server7b.ocp.domain.com 248 1tb 1tb 374.9gb 1.4tb 74 OSzB5J1
elasticsearch-4-nn3pc 1/1 Running 0 5d 10.8.8.8 server8b.ocp.domain.com 332 1.4tb 1.9tb 952.1gb 2.9tb 68 EShhlrb
elasticsearch-4-sq5hr 1/1 Running 0 7d 10.9.9.9 server9b.ocp.domain.com 218 1011.8gb 1tb 418.2gb 1.4tb 71 1rQ7PXD
elasticsearch-4-zj7tq 1/1 Running 0 7d 10.10.10.10 server10b.ocp.domain.com 329 1.7tb 1.8tb 1tb 2.9tb 63 73TfUnn
elasticsearch-4-az9sp 1/1 Running 0 7d 10.10.10.11 server11b.ocp.domain.com
elasticsearch-4-bi2c7 1/1 Running 0 7d 10.10.10.12 server12b.ocp.domain.com
答案1
下面产生您想要的输出,但没有标题:
awk 'NR==FNR{a[$8]=$0}FILENAME==ARGV[1]{b[$6]=$2} FILENAME==ARGV[2]{print $0,a[$6]}' <(oc get pod -lname=elasticsearch -o wide) <(curl -ks https://elasticsearch.apps.ocp.domain.com/_cat/allocation?v) | awk 'NR>1' | awk '!($14=$15="")'
有点不清楚的部分是如何删除重复的 IP 地址列'awk '!($14=$15="")''
您可能更愿意使用一个多行脚本而不是单行脚本来使这个过程更加清晰。