1 votes

Analyser la valeur après la balise contenue entre parenthèses.

J'ai les données suivantes dans un fichier que je lis dans $p dans une boucle while. Je fais un greb de la ligne ($p) pour PID, APPLTAG, UOWLOGDA et UOWLOGTI. Lorsque je trouve la balise présente, je veux extraire la valeur entre parenthèses suivant la balise.

AMQ8276: Afficher les détails de la connexion.
   CONN(4C521F5F01501624)
   EXTCONN(414D5143534154322020202020202020)
   TYPE(CONN)
   PID(27948)
   APPLTAG(WebSphere MQ Client for Java)
   UOWLOGDA(2020-07-29)                    UOWLOGTI(11.50.30)

AMQ8276: Afficher les détails de la connexion.
   CONN(4C521F5F9920182E)
   EXTCONN(414D5143534154322020202020202020)
   TYPE(CONN)
   PID(23273)                              APPLTAG(service.core.EnricherMain)
   UOWLOGDA(2020-07-29)                    UOWLOGTI(11.50.46)

1voto

Zanna Points 65764

Eh bien, vous pouvez grep juste les valeurs avec un lookbehind :

$ grep -Po '(?<=PID\(|APPLTAG\(|UOWLOGDA\(|UOWLOGTI\()[^)]+' file
27948
WebSphere MQ Client for Java
2020-07-29
11.50.30
23273
service.core.EnricherMain
2020-07-29
11.50.46
  • -P Regex style Perl
  • -o imprimer le motif correspondant uniquement
  • (?<=choses)chose obtenir la chose après choses (assertion lookbehind)
  • \( le parenthèse ouvrante littérale
  • chose1|chose2 alternance - correspondre à chose1 ou chose2
  • [^)]+ quelques caractères qui ne sont pas la parenthèse fermante

Cette expression fonctionne sur votre exemple, mais il peut être plus fiable de préfixer \b aux motifs de recherche afin qu'ils ne soient capturés que s'ils ont des limites de mots (début de ligne, espace, tabulation, etc.) avant eux, au cas où le même motif pourrait être la partie finale d'un mot. De plus, s'il y a une chance qu'il y ait un mot correspondant suivi d'une parenthèse ouvrante, sans parenthèse fermante, que vous ne voulez pas attraper, vous pouvez explicitement anticiper celle de fermeture en ajoutant (?=\)) ici pour obtenir de manière plus fiable uniquement les caractères entre les parenthèses correspondantes :

grep -Po '(?<=\bPID\(|\bAPPLTAG\(|\bUOWLOGDA\(|\bUOWLOGTI\()[^)]+(?=\))'

Je ne suis pas sûr que cette approche soit adéquate pour votre but, cependant.

Un grand merci à fra-san pour avoir suggéré des améliorations à cette réponse :)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X