web-dev-qa-db-fra.com

Extraire le mot d'une chaîne en utilisant grep / sed / awk

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 qaqui 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 qaname__, mais prodou devname__.

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.

12
Gman

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.

17
heemayl

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
1
A.B.

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
1
kos