J'ai une chaîne
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256
et je veux extraire le mot qa
qui suit -Dspring.profiles.active
.
J'ai la chaîne de sauvegarde dans un fichier text.txt juste pour faire une démonstration dessus.
Quand je fais
grep -r -o "spring.profiles.active=" text.txt
Le résultat est spring.profiles.active=
Ce mot n'est pas toujours qa
, il pourrait être prod
ou dev
.
Ce que je voudrais faire, c'est trouver le mot spring.profiles.active
et après l' =
extraire ce mot.
Je voudrais décortiquer ce script car j'utilise le mot pour configurer d'autres éléments sur le serveur.
Est-ce possible et si oui, comment le faire.
Réponses:
Vous pouvez utiliser
grep
avec PCRE (-P
):spring.profiles.active=
correspondra littéralement à cette sous-chaîne,\K
supprimera la correspondance[^ ]+
sélectionnera la portion souhaitée, c'est-à-dire la portion suivantespring.profiles.active=
, jusqu'à l'espace suivantPour un fichier:
Exemple:
sed
prendrait une logique similaire:Exemple:
Gestion des erreurs:
Dans votre script, vous voudrez peut-être gérer le cas où il n'y a pas de correspondance, en d'autres termes où votre chaîne d'origine ne contient pas
spring.profiles.active=
. Dans l'sed
exemple ci-dessus , vous obtenez toute la chaîne d'origine, ce qui pourrait créer des problèmes:Si vous préférez obtenir la chaîne vide lorsqu'il n'y a aucune correspondance, ajoutez l'
-n
option à lased
commande et l'p
option à lased
s
commande, comme ceci:Ensuite, vous pouvez tester si $ var est vide ou non.
la source
var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"
remplacezfile.txt
par<<<'...string...'
si l'entrée est une chaîne, pas un fichier .. alors vous pouvez le faireif [ "$var" = 'qa' ]; then do something; else do something; fi
En utilisant
awk
ou
Exemple
la source
Je vais jeter un Perl dans le mélange:
-l
: active le traitement automatique de fin de ligne. Il a deux effets distincts. Tout d'abord, il compile automatiquement $ / (le séparateur d'enregistrement d'entrée) lorsqu'il est utilisé avec -n ou -p. Deuxièmement, il affecte $ \ (le séparateur d'enregistrements de sortie) pour avoir la valeur d'octnum afin que toutes les instructions d'impression aient ce séparateur ajouté à nouveau. Si octnum est omis, définit $ \ à la valeur actuelle de $ /.-a
: active le mode autosplit lorsqu'il est utilisé avec -n ou -p. Une commande de division implicite du tableau @F est effectuée comme première chose à l'intérieur de la boucle while implicite produite par -n ou -p.n
: oblige Perl à assumer la boucle suivante autour de votre programme, ce qui le fait parcourir les arguments de nom de fichier un peu comme sed -n ou awk:-e
: peut être utilisé pour entrer une ligne de programme.la source
perl -nle '/spring.profiles.active=\K([^ ]+)/ && print $1' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'