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.
5 Réponses :
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.
Vous pouvez utiliser
echo $longString | sed -n 's|.*\({.*}\).*|\1|p'
pour faire correspondre et imprimer le motif souhaité
vous pouvez simplement joindre les commandes sed à une seule commande
sed 's /^.*{/{/; s /}.*$/}/'
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 '{.*}'
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"
grep -o '{. *}'
peut-être?