Donc ouvrir un fichier avec cat
, puis utiliser grep
pour obtenir les lignes correspondantes ne me fait avancer que lorsque je travaille avec le jeu de journaux particulier que je traite. Il faut un moyen de faire correspondre les lignes à un motif, mais seulement de renvoyer la partie de la ligne après la correspondance. La partie avant et après le match variera de manière constante. J'ai joué avec using sed
ou awk
, mais je n'ai pas réussi à comprendre comment filtrer la ligne pour supprimer la partie avant le match ou simplement pour renvoyer la partie après le match, cela fonctionnera. Voici un exemple de ligne que je dois 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 "bloquée".
Le contexte derrière ceci est que je peux savoir combien de fois quelque chose cale:
cat messages | grep stalled | wc -l
Ce que je dois faire est de savoir combien de fois un certain nœud a bloqué (indiqué par la partie précédant chaque signe deux-points après "bloqué". Si je ne fais que grep pour cela (c'est-à-dire 20 :), il peut renvoyer les lignes dont le logiciel échoue, mais pas de décrochage, ce qui ne m'aide pas. Je dois filtrer uniquement la partie bloquée afin de pouvoir ensuite rechercher un noeud spécifique parmi ceux qui sont bloqués.
À toutes fins pratiques, il s’agit d’un système freebsd avec les utilitaires standard GNU, mais je ne peux rien installer d’aide supplémentaire.
la source
sed
solution et ne traitez pas les espaces en particulier.Réponses:
L'outil canonique pour cela serait
sed
.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.^.*stalled:
correspond au modèle que vous recherchez, plus tout texte précédent (.*
ce qui signifie n'importe quel texte, avec une initiale^
pour indiquer que la correspondance commence au début de la ligne). Notez que sistalled:
se produit plusieurs fois sur la ligne, cela correspond à la dernière occurrence.stalled:
, est remplacée par la chaîne vide (c'est-à-dire supprimée).p
moyen d'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 remplacement, indiquez ce qui se trouve à 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 motif recherché est plus général qu'une simple chaîne.Parfois, vous voudrez supprimer la partie de la ligne après le match. Vous pouvez l'inclure dans la correspondance en ajoutant
.*$
à la fin du motif (tout texte.*
suivi de la fin de la ligne$
). Sauf si vous placez cette partie dans un groupe que vous avez référencé dans le texte de remplacement, la fin de la ligne ne sera pas dans la sortie.Pour illustrer davantage les groupes et les références arrière, cette commande permute la partie avant le match et la partie après le match.
la source
sed … <messages
, car vous voulez traiter les données d'un fichier. Pour agir sur les données produites par une autre commande, vous utiliseriez un tuyau:somecommand | sed …
.sed 's/^.*stalled//'
car-r
étant spécifique à Linux et ne fonctionnant pas sur d'autres systèmes tels que macOS, vous n'en tirez aucun avantage.L'autre outil canonique que vous utilisez déjà
grep
:Par exemple:
A le même résultat que la deuxième option de Gilles:
Le
-o
drapeau renvoie la--only-matching
partie de l'expression, donc pas la ligne entière qui est - bien sûr - normalement faite par grep.Pour supprimer le "calé:" de la sortie, nous pouvons utiliser un troisième outil canonique, couper:
La
cut
commande utilise le délimiteur:
et imprime le champ 2 jusqu'à la fin. C'est une question de préférence bien sûr, mais lacut
syntaxe est très facile à retenir.la source
-o
option! Je voulais souligner quegrep
ne reconnaît pas le caractère\n
de nouvelle ligne. Votre premier exemple ne correspond donc qu'au premiern
caractère. Par exemple,echo "Hello Anne" | grep -o 'A[^\n]*'
renvoie la chaîneA
. Cependant,echo "Hello Anne" | grep -o 'A.*'
retourne l'attenduAnne
, puisqu'il.
correspond à n'importe quel caractère sauf la nouvelle ligne.cut
délimiteur-d':'
sont supprimés par @poige. Je trouve plus facile de me souvenir avec des citations, par exemple avec-d' '
ou-d';'
.-f 2
aussi. Sérieusement, pourquoi pas?;
plutôt que deux-points:
sera interprété différemment s'il n'est pas cité. Bien sûr, c'est un comportement logique, mais j'aime quand même m'appuyer sur la mémoire musculaire. Je n'aime pas citer le délimiteur une fois mais pas l'autre fois. Juste préférence personnelle, comme je l'ai dit auparavant: plus facile à retenir..*
est nécessaire, a bien fonctionné pour moi:cat filename | grep 'Return only this line xyz text' | grep -o 'xyz.*'
retoursxyz text
Je
ifconfig | grep eth0 | cut -f3- -d:
prenais çaet le faire ressembler à ceci
la source
cat /sys/class/net/*/address
, aucune analyse requise.Encore un autre outil canonique que vous avez considéré
awk
pourrait être utilisé avec la ligne suivante:Explication détaillée:
-F
définit un séparateur pour la ligne, c'est-à-dire "calé". Tout ce qui se trouve avant le séparateur est traité avec$1
et tout ce qui suit est traité avec$2
./reg-ex/
Recherche l'expression régulière correspondante, dans ce cas "stalled".{print $<n>}
- imprime n colonne. Puisque votre séparateur est défini comme bloqué, tout ce qui suit est considéré comme la deuxième colonne.la source