J'ai une ficelle
00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256
et souhaitez extraire le mot qa
qui suit -Dspring.profiles.active
.
J'ai la chaîne sauvegardée dans un fichier text.txt juste pour en faire la démonstration.
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
name__, mais prod
ou dev
name__.
Ce que j'aimerais faire, c'est trouver le mot spring.profiles.active
et after le =
extraire ce mot.
J'aimerais écrire un script ceci parce que j'utilise Word pour configurer d'autres éléments sur le serveur.
Est-ce possible et si oui, comment puis-je le faire.
Vous pouvez utiliser grep
avec PCRE (-P
):
grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
spring.profiles.active=
correspondra littéralement à cette sous-chaîne, \K
ignorera la correspondance.
[^ ]+
sélectionnera la partie désirée, c'est-à-dire la partie après spring.profiles.active=
, jusqu'à l'espace suivant
Pour un fichier:
grep -Po 'spring.profiles.active=\K[^ ]+' file.txt
Exemple:
% grep -Po 'spring.profiles.active=\K[^ ]+' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa
sed
prendrait une logique similaire:
sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'.....string.....'
Exemple:
% sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa
Gestion des erreurs:
Dans votre script, vous souhaiterez peut-être gérer le cas où il n'y a pas de correspondance, c'est-à-dire où votre chaîne d'origine ne contient pas spring.profiles.active=
. Dans l'exemple ci-dessus sed
, vous obtenez la chaîne d'origine complète, ce qui peut créer des problèmes:
% var="$(sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var
00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256
Si vous préférez obtenir la chaîne vide en l'absence de correspondance, ajoutez l'option -n
à la commande sed
et l'option p
à la commande sed
__s
, comme ceci:
% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var
% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256')"
% echo $var
qa
Ensuite, vous pouvez tester si $ var est vide ou non.
Utiliser awk
awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'your_string'
ou
awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' your_file
Exemple
% awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa
Je vais en ajouter un en Perl:
<<<'string' Perl -lane '$F[3]=~s/.*?=//;print($F[3])'
-l
: active le traitement de fin de ligne automatique. Il a deux effets distincts. Premièrement, il chomps automatiquement $/(le séparateur d'enregistrement d'entrée) lorsqu'il est utilisé avec -n ou -p. Deuxièmement, il attribue à $\(le séparateur d'enregistrement de sortie) la valeur d'octnum afin que toutes les instructions d'impression ajoutent ce séparateur. Si octnum est omis, définit $\sur la valeur actuelle de $ /.-a
: active le mode autosplit lorsqu'il est utilisé avec un -n ou -p. Une commande de fractionnement implicite dans le tableau @F est effectuée en premier dans la boucle while implicite produite par -n ou -p.n
: Perl assume la boucle suivante autour de votre programme, ce qui le rend itératif sur les arguments de nom de fichier un peu comme sed -n ou awk:
LINE:
while (<>) {
... # your program goes here
}
-e
: peut être utilisé pour entrer une ligne de programme.% <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256' Perl -lane '$F[3]=~s/.*?=//;print($F[3])'
qa