1
votes

Comment extraire une chaîne JSON d'une chaîne mixte plus longue dans un script shell

Compte tenu de la chaîne suivante:

echo $longString | sed 's/^.*{/{/' | sed 's/}.*$/}/'

Dans un script shell, comment extraire uniquement la partie JSON pour finir comme ceci:

{"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"}

J'ai pu le faire en utilisant deux commandes sed:

arn:aws:secretsmanager:us-east-1:3264873466873:secret:foo/bar 1564681234.974 foo/bar {"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"} 4e397333-3797-4f0b-ad7e-8c1cc0ed041c VERSIONSTAGES AWSCURRENT

mais je me demandais s'il y avait un moyen de le faire en utilisant une seule commande.


1 commentaires

grep -o '{. *}' peut-être?


5 Réponses :


1
votes

Pour extraire les colonnes, utilisez awk:

echo $longString | cut -f 4 -d ' ' 

Ou cut:

echo $longString | awk '{print $4}'

Méfiez-vous si vous avez des espaces dans vos données JSON. Vous feriez peut-être mieux d'utiliser jq pour traiter les résultats de aws secretsmanager list-secrets et similaires.


0 commentaires

0
votes

Vous pouvez utiliser

echo $longString | sed -n 's|.*\({.*}\).*|\1|p'

pour faire correspondre et imprimer le motif souhaité


0 commentaires

0
votes

vous pouvez simplement joindre les commandes sed à une seule commande sed 's /^.*{/{/; s /}.*$/}/'


0 commentaires

3
votes

Pour extraire une partie continue de l'entrée, vous pouvez utiliser grep avec son option -o (si prise en charge sur votre système). Il dit à grep de ne sortir que la partie correspondante.

grep -o '{.*}'


0 commentaires

0
votes

Ce awk devrait faire l'affaire. Je traiterai s'il y a un espace dans la chaîne.

echo $string | awk -F"[{}]" '{print $2}'
"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"


0 commentaires