grep -A1 'blah' logfile
Gracias a este comando para cada línea que tiene 'blah', obtengo el resultado de la línea que contiene 'blah' y la siguiente línea que sigue en el archivo de registro. Puede ser simple, pero no puedo encontrar una manera de omitir la línea que tiene 'bla' y solo mostrar la siguiente línea en la salida.
-A1
opcióncurl whatismyip.org | grep -A1 'Your IP Address'
-A1
. ¡Gracias!Respuestas:
puedes probar con awk:
fuente
awk '/blah/{getline; getline; print}' logfile
si quieres apegarte a grep:
o
fuente
Piping es tu amigo ...
Use
grep -A1
para mostrar la siguiente línea después de una coincidencia, luego canalice el resultadotail
y solo tome 1 línea,fuente
Gran respuesta de Raim, fue muy útil para mí. Es trivial extender esto para imprimir, por ejemplo, la línea 7 después del patrón
fuente
Si las siguientes líneas nunca contienen 'bla', puede filtrarlas con:
El uso de
cat logfile | ...
no es necesario.fuente
En general, estoy de acuerdo en que estás pidiendo mucha información aquí, y que otra herramienta puede ser la mejor solución. Pero en un entorno incrustado, es posible que no quiera tener
sed
oawk
simplemente hacer esto. Encontré que la siguiente solución funciona (siempre que no sean coincidencias contiguas):Básicamente, combínelos, agregando 1 línea de contexto para cada coincidencia, y luego canalice eso a través de una coincidencia inversa de su patrón original para eliminarlos. Por supuesto, esto significa que puede asumir que su patrón no aparece en la línea "siguiente".
fuente
Muchas buenas respuestas se han dado a esta pregunta hasta ahora, pero aún extraño una con
awk
no usarlagetline
. Como, en general , no es necesario usarlogetline
, elegiría:o
La lógica siempre consiste en almacenar la línea donde se encuentra "bla" y luego imprimir las líneas que están una línea después.
Prueba
Archivo de muestra:
Obtenga todas las líneas después de "bla". Esto imprime otro "bla" si aparece después del primero.
Obtenga todas las líneas después de "bla" si no contienen "bla".
fuente
No conozco ninguna forma de hacer esto con grep, pero es posible usar awk para lograr el mismo resultado:
fuente
alerta perl one-liner
solo por diversión ... imprima solo una línea después del partido
aún más divertido ... imprime las siguientes diez líneas después del partido
un poco trampa ya que en realidad hay dos comandos
fuente
$. == $next && print
es lo mismo queprint if $. == $next
grep -A1
). Si desea imprimir solo las siguientes líneas pero nunca una línea con una coincidencia, entonces debería mantener este orden. (solo señalando cómo $ next sería golpeado por partidos consecutivos)Parece que estás usando la herramienta incorrecta allí. Grep no es tan sofisticado, creo que quieres avanzar a awk como la herramienta para el trabajo:
awk '/blah/ { getline; print $0 }' logfile
Si tienes algún problema, házmelo saber, creo que vale la pena aprender un poco de awk, es una gran herramienta :)
ps Este ejemplo no gana un 'premio de uso inútil del gato';) http://porkmail.org/era/unix/award.html
fuente
grep / Patrón / | cola -n 2 | cabeza -n 1
Sigue los primeros 2 y luego el último para obtener exactamente la primera línea después del partido.
fuente