/ / Pipe une liste ou un tableau dans awk en tant que variable (à exécuter en tant que paramètre dans une autre commande) - bash, awk, pipe

Pipe une liste ou un tableau dans awk en tant que variable (à exécuter en tant que paramètre dans une autre commande) - bash, awk, pipe

J'essaie d'exécuter la doublure ci-dessous dans le cadre du script bash.

command1 |grep -ID|grep -v + | awk "{print "command2" $2}"|bash

La première partie du tuyau affiche les informations ci-dessous:

root@system:~# command1 |grep -v ID|grep -v +
| id                                   | name                     | mac_address       | fixed_ips                                                                            |
| 00277225-34fa-48f5-9a2a-ee5f1c5b1dcb | dummy                    | fa:18:3e:c4:85:94 | {"subnet_id": "0cd4d824-4420-4049-87c3-ed33c3addbf5", "ip_address": "11.170.1.121"}  |
:
:
| ff9a6ed5-9694-45bc-bf71-59565f96d809 | BAT-T0-A2-0-7-tport      | fa:18:3e:62:70:fb | {"subnet_id": "f9ae81ed-3b1a-45a7-96fd-c417ed32

Ainsi, $ 2 dans awk commande2 est "00277225-34fa-48f5-9a2a-ee5f1c5b1dcb". par exemple.

command2 00277225-34fa-48f5-9a2a-ee5f1c5b1dcb

Le but de cette opération est d'exécuter un certain nombre d'instances "commande2" avec des valeurs de paramètre différentes de celles imprimées ci-dessus. par exemple.

command2 00277225-34fa-48f5-9a2a-ee5f1c5b1dcb
command2 ff9a6ed5-9694-45bc-bf71-59565f96d809
:
:

Mais je ne peux pas faire reconnaître les 2 $ comme ci-dessous

command1 |grep -ID|grep -v + | awk "{print "command2" $2}"|bash

Je pense qu'il me manque quelques astuces de syntaxe ici (en tant que débutant).

p.s: Si je copie / colle toute la ligne en ligne de commande, cela fonctionne bien.

Réponses:

1 pour la réponse № 1

Vous semblez chercher

command1 | awk "!/ID/ && !/+/ {print $2}" | xargs -n 1 command2

J'ai refactored le laid inutile greps dans le script Awk; mais le vrai boeuf est ici xargs. Il lit les paramètres de l'entrée standard et les transmet à la commande que vous fournissez dans les paramètres de position.

L'option -n 1 dit de n'accepter qu'un argument supplémentaire à la fois; mais si command2 est une commande Unix standard bien écrite, elle peut probablement accepter un nombre arbitraire d'arguments et va simplement les parcourir en boucle. Dans ce cas, retirer -n 1 sera beaucoup plus efficace.

Incidemment, votre tentative initiale était assez proche. vous devriez avoir ajouté un espace après command2 dans le print déclaration. Mais j'espère que cette solution vous aidera également à voir comment "penser Unix".