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 sistalled:
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.
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'