GNU/Linux >> Tutoriels Linux >  >> Linux

Renvoyer uniquement la partie d'une ligne après un motif correspondant ?

Donc ouvrir un fichier avec cat puis en utilisant grep obtenir des lignes correspondantes ne m'amène que si loin lorsque je travaille avec l'ensemble de journaux particulier avec lequel je traite. Il a besoin d'un moyen de faire correspondre les lignes à un motif, mais uniquement de renvoyer la partie de la ligne après la correspondance. La portion avant et après le match variera constamment. J'ai joué avec en utilisant sed ou awk , mais je n'ai pas été en mesure de comprendre comment filtrer la ligne pour soit supprimer la partie avant la correspondance, soit simplement renvoyer la partie après la correspondance, l'un ou l'autre fonctionnera.
Ceci est un exemple de ligne dont j'ai besoin pour filtrer :

2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }

La partie dont j'ai besoin est tout après "calé".

Le contexte derrière cela est que je peux savoir à quelle fréquence quelque chose se bloque :

cat messages | grep stalled | wc -l

Ce que je dois faire, c'est savoir combien de fois un certain nœud a calé (indiqué par la partie avant chaque deux-points après "calé". Si je grep juste pour cela (c'est-à-dire 20 :), il peut renvoyer des lignes qui ont des échecs logiciels, mais pas de décrochage, ce qui ne m'aide pas. J'ai besoin de filtrer uniquement la partie bloquée pour pouvoir ensuite grep pour un nœud spécifique parmi ceux qui ont décroché.

À toutes fins utiles, il s'agit d'un système freebsd avec des utilitaires de base GNU standard, mais je ne peux rien installer de plus pour aider.

Réponse acceptée :

L'outil canonique pour cela serait sed .

sed -n -e 's/^.*stalled: //p'

Explication détaillée :

  • -n signifie ne rien imprimer par défaut.
  • -e est suivi d'une commande sed.
  • s est la commande de remplacement de modèle.
  • L'expression régulière ^.*stalled: correspond au modèle que vous recherchez, plus tout texte précédent (.* c'est-à-dire n'importe quel texte, avec un ^ initial pour dire que le match commence au début de la ligne). Notez que si stalled: apparaît plusieurs fois sur la ligne, cela correspondra à la dernière occurrence.
  • Le match, c'est-à-dire tout sur la ligne jusqu'à stalled: , est remplacé par la chaîne vide (c'est-à-dire supprimé).
  • Le dernier p signifie imprimer la ligne transformée.

Si vous souhaitez conserver la partie correspondante, utilisez une référence arrière :1 dans la pièce de rechange désigne ce qui est à l'intérieur d'un groupe (…) dans le motif. Ici, vous pourriez écrire stalled: à nouveau dans la pièce de rechange ; cette fonctionnalité est utile lorsque le modèle que vous recherchez est plus général qu'une simple chaîne.

sed -n -e 's/^.*(stalled: )/1/p'

Parfois, vous voudrez supprimer la partie de la ligne après le match. Vous pouvez l'inclure dans la correspondance en incluant .*$ à la fin du motif (n'importe quel texte .* suivi de la fin de la ligne $ ). À moins que vous ne placiez cette partie dans un groupe auquel vous faites référence dans le texte de remplacement, la fin de la ligne ne figurera pas dans la sortie.

Connexe :Sed :imprimer uniquement la première occurrence d'une correspondance de modèle ?

Pour illustrer davantage les groupes et les références arrière, cette commande permute la partie avant la correspondance et la partie après la correspondance.

sed -n -e 's/^(.*)(stalled: )(.*)$/321/p'

Linux
  1. Ne renvoyer que la chaîne correspondante dans Sed ?

  2. Insérer un fichier dans un autre fichier après la 1ère occurrence d'un motif ?

  3. Remplacer le motif une fois que la nième correspondance est trouvée sur chaque ligne ? ?

  4. Conserver uniquement la première ligne de chaque séquence de lignes consécutives correspondant à un motif ?

  5. Sed :imprimer uniquement la première occurrence d'une correspondance de modèle ?

Trouver uniquement la première occurrence en utilisant uniquement Grep ?

Quel est ce total dans la toute première ligne après ls -l ?

sed à insérer lors de la première correspondance uniquement

Le concept de 'Hold space' et 'Pattern space' dans sed

Comment différencier uniquement la première ligne de deux fichiers?

Ligne de commande pour revenir à l'interface graphique après Ctrl-Alt-F1 ?