Есть ли способ выполнить «левое внешнее соединение» для вывода bash из двух разных команд на основе общего ключевого столбца (IP-адреса)? По разным причинам я хотел бы избежать сохранения вывода любой из команд в файл и использования имени файла в качестве входных данных в awk / join.
Это 2 выхода, которые я хотел бы объединить вместе:
output1=$(oc get pod -lname=elasticsearch -o wide)
output2=$(curl -ks https://elasticsearch.apps.ocp.domain.com/_cat/allocation?v)
Вот диск использование моих модулей elasticsearch
$ 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 в моей среде
$ 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
Ожидаемые результаты после выполнения «левого внешнего соединения» из output1 и output2 на основе IP-адреса
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
Нижеприведенный ниже результат дает желаемый результат, но без заголовков:
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="")''
Возможно, вам лучше использовать небольшой многострочный скрипт вместо однострочного, чтобы упростить этот процесс.