grep -A1 'blah' logfile
Grâce à cette commande pour chaque ligne contenant 'blah', j'obtiens la sortie de la ligne qui contient 'blah' et la ligne suivante qui suit dans le fichier journal. Cela peut être simple, mais je ne trouve pas de moyen d'omettre la ligne qui a «bla» et d' afficher uniquement la ligne suivante dans la sortie.
-A1
optioncurl whatismyip.org | grep -A1 'Your IP Address'
-A1
. Merci!Réponses:
vous pouvez essayer avec awk:
la source
awk '/blah/{getline; getline; print}' logfile
si vous voulez vous en tenir à grep:
ou
la source
La tuyauterie est votre amie ...
Utilisez
grep -A1
pour afficher la ligne suivante après une correspondance, puis dirigez le résultat verstail
et ne saisissez qu'une seule ligne,la source
Grande réponse de raim, m'a été très utile. Il est trivial de l'étendre pour imprimer par exemple la ligne 7 après le motif
la source
Si les lignes suivantes ne contiennent jamais 'blah', vous pouvez les filtrer avec:
L'utilisation de
cat logfile | ...
n'est pas nécessaire.la source
En général, je suis d'accord que vous demandez beaucoup de grep ici, et qu'un autre outil peut être la meilleure solution. Mais dans un environnement intégré, je ne veux peut-être pas
sed
ouawk
simplement le faire. J'ai trouvé que la solution suivante fonctionne (tant qu'il ne s'agit pas de correspondances contiguës):Fondamentalement, faites-les correspondre, en ajoutant 1 ligne de contexte pour chaque correspondance, puis redirigez-la via une correspondance inverse de votre modèle d'origine pour les supprimer. Cela signifie bien sûr que vous pouvez supposer que votre modèle n'apparaît pas dans la ligne "suivante".
la source
Jusqu'à présent, de nombreuses bonnes réponses ont été apportées à cette question, mais il me manque encore une question de
awk
ne pas l'utilisergetline
. Puisque, en général , il n'est pas nécessaire d'utilisergetline
, j'irais pour:ou
La logique consiste toujours à stocker la ligne où se trouve "blah" puis à imprimer les lignes qui se trouvent une ligne après.
Tester
Exemple de fichier:
Obtenez toutes les lignes après "bla". Cela imprime un autre "bla" s'il apparaît après le premier.
Obtenez toutes les lignes après "bla" si elles ne contiennent pas "bla" elles-mêmes.
la source
Je ne connais aucun moyen de le faire avec grep, mais il est possible d'utiliser awk pour obtenir le même résultat:
la source
alerte perl one-liner
juste pour le plaisir ... n'imprimer qu'une seule ligne après le match
encore plus de plaisir ... imprimez les dix lignes suivantes après le match
un peu tricher cependant car il y a en fait deux commandes
la source
$. == $next && print
est le même queprint if $. == $next
grep -A1
). Si vous souhaitez imprimer uniquement les lignes suivantes mais jamais une ligne avec une correspondance, vous devez conserver cet ordre. (juste en notant comment $ next serait encombré pour des matchs consécutifs)Il semble que vous n'utilisiez pas le bon outil. Grep n'est pas si sophistiqué, je pense que vous voulez passer à awk comme outil pour le travail:
awk '/blah/ { getline; print $0 }' logfile
Si vous rencontrez des problèmes, faites-le moi savoir, je pense que cela vaut la peine d'apprendre un peu de awk, c'est un excellent outil :)
ps Cet exemple ne remporte pas une 'utilisation inutile du prix du chat';) http://porkmail.org/era/unix/award.html
la source
grep / Motif / | queue -n 2 | tête -n 1
Queue les 2 premiers, puis tête le dernier pour obtenir exactement la première ligne après le match.
la source