2017-09-12 7 views
0

J'essaie d'utiliser chaque clé, valeur d'une sortie et de la rediriger vers une autre commande. Voici ce que je suis en train d'utiliser:clé jq, valeur pour chaque script shell

INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id) 
aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" 

Avec la commande ci-dessus, j'ai la sortie suivante:

{ 
"Tags": [ 
    { 
     "ResourceType": "instance", 
     "ResourceId": "i-0342a609edf80001a", 
     "Value": "A-VALUE", 
     "Key": "A-KEY" 
    }, 
    { 
     "ResourceType": "instance", 
     "ResourceId": "i-0342a609edf80001a", 
     "Value": "B-VALUE", 
     "Key": "B-KEY" 
    }, 
    { 
     "ResourceType": "instance", 
     "ResourceId": "i-0342a609edf80001a", 
     "Value": "C-VALUE", 
     "Key": "C-KEY" 
    }, 
    { 
     "ResourceType": "instance", 
     "ResourceId": "i-0342a609edf80001a", 
     "Value": "D-VALUE", 
     "Key": "D-KEY" 
    }, 
    { 
     "ResourceType": "instance", 
     "ResourceId": "i-0342a609edf80001a", 
     "Value": "E-VALUE", 
     "Key": "E-KEY" 
    }, 
    { 
     "ResourceType": "instance", 
     "ResourceId": "i-0342a609edf80001a", 
     "Value": "F-VALUE", 
     "Key": "G-KEY" 
    }, 
    { 

Maintenant, je veux tuyau chaque clé, la valeur de la commande suivante:

aws ec2 create-tags --resources XXXXX --tags Key=H-KEY,Value=H-VALUE 

Lorsque la quantité et les valeurs de Key, Value sont variables. Donc je crois que j'ai besoin d'un "pour chacun".

Pourriez-vous m'aider?

Il est comme: Pour chaque touche, la valeur, faire:

aws ec2 create-tags --resources XXXXX --tags Key=A-KEY,Value=A-VALUE 
aws ec2 create-tags --resources XXXXX --tags Key=B-KEY,Value=B-VALUE 
aws ec2 create-tags --resources XXXXX --tags Key=C-KEY,Value=C-VALUE 
aws ec2 create-tags --resources XXXXX --tags Key=N...-KEY,Value=N...-VALUE 
+0

Avec cela, je reçois la clé, Valeurs: aws EC2 describe-tags « Name = ressource-id, Valeurs = $ INSTANCE_ID "--region $ REGION | jq -r '.Tags [] | "\ (. Key) \ (. Value)" ' Maintenant, je dois boucler, non? – Thiago

Répondre

4

a une @sh directive aux valeurs de sortie correctement cité pour la coque:

aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" \ 
| jq -r '.Tags[] | @sh "aws ec2 create-tags --resources XXXXX --tags Key=\(.Key),Value=\(.Value)"' 

Compte tenu de votre entrée, cette commande affiche

aws ec2 create-tags --resources XXXXX --tags Key='A-KEY',Value='A-VALUE' 
aws ec2 create-tags --resources XXXXX --tags Key='B-KEY',Value='B-VALUE' 
aws ec2 create-tags --resources XXXXX --tags Key='C-KEY',Value='C-VALUE' 
aws ec2 create-tags --resources XXXXX --tags Key='D-KEY',Value='D-VALUE' 
aws ec2 create-tags --resources XXXXX --tags Key='E-KEY',Value='E-VALUE' 
aws ec2 create-tags --resources XXXXX --tags Key='G-KEY',Value='F-VALUE' 

Pour exécuter ces commandes, entrez sh:

aws ec2 describe-tags ... | jq -r ... | sh 

JQ est toute une aventure. Vous devez ajouter un « sélectionner » filtre pour supprimer les clés qui commencent par « aws: »

jq -r ' 
    .Tags[] | 
    select(.Key | test("^aws:") | not) | 
    @sh "aws ... --tags Key=\(.Key),Value=\(.Value)" 
' 
+0

Ça a marché! Merci beaucoup! Cependant, j'ai besoin d'un dernier détail: Est-il possible d'ignorer les touches qui commencent par "Key": "aws: ***"? – Thiago