uso ultimo sromero salto print numero mostrar mayor linea imprimir filtrar columnas campo básico awk sed grep

awk - ultimo - ¿Cómo mostrar solo la siguiente línea después del emparejado?



mostrar columnas awk (10)

En general, estoy de acuerdo en que está pidiendo mucho grep aquí, y que otra herramienta puede ser la mejor solución. Pero en un entorno incrustado, es posible que no desee tener sed o awk solo para hacer esto. Encontré que la siguiente solución funciona (siempre que no sean coincidencias contiguas):

grep -A1 AT/+CSQ wvdial.out | grep -v AT/+CSQ

Básicamente, combínelos, agregue 1 línea de contexto para cada coincidencia y luego canalícela a través de una coincidencia inversa de su patrón original para eliminarlos. Esto, por supuesto, significa que puede suponer que su patrón no aparece en la "próxima" línea.

grep -A1 ''blah'' logfile

Gracias a este comando para cada línea que tiene ''blah'' en él, 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 ''blah'' y solo mostrar la siguiente línea en la salida.


Hasta la fecha se han dado muchas buenas respuestas a esta pregunta, pero aún echo de menos una con awk no usa getline . Como, en general , no es necesario usar getline , me gustaría:

awk '' f && NR==f+1; /blah/ {f=NR}'' file #all matches after "blah"

o

awk ''/blah/ {f=NR} f && NR==f+1'' file #matches after "blah" not being also "blah"

La lógica siempre consiste en almacenar la línea donde se encuentra "blah" y luego imprimir esas líneas que están una línea después.

Prueba

Archivo de muestra:

$ cat a 0 blah1 1 2 3 blah2 4 5 6 blah3 blah4 7

Obtener todas las líneas después de "bla". Esto imprime otro "bla" si aparece después del primero.

$ awk ''f&&NR==f+1; /blah/ {f=NR}'' a 1 4 blah4 7

Obtenga todas las líneas después de "bla" si no contienen "blah".

$ awk ''/blah/ {f=NR} f && NR==f+1'' a 1 4 7


No sé de ninguna manera para hacer esto con grep, pero es posible usar awk para lograr el mismo resultado:

awk ''/blah/ {getline;print}'' < logfile


Parece que está usando la herramienta incorrecta allí. Grep no es tan sofisticado, creo que quieres pasar 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 ''inútil uso del galardón'';) http://porkmail.org/era/unix/award.html


Piping es tu amigo ...

Usa grep -A1 para mostrar la siguiente línea después de un partido, luego canaliza el resultado hasta la tail y solo toma 1 línea,

cat logs/info.log | grep "term" -A1 | tail -n 1


Si las siguientes líneas nunca contienen ''blah'', puede filtrarlas con:

grep -A1 blah logfile | grep -v blah

El uso de cat logfile | ... cat logfile | ... no es necesario.


Una 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

awk -v lines=7 ''/blah/ {for(i=lines;i;--i)getline; print $0 }'' logfile


puedes probar con awk:

awk ''/blah/{getline; print}'' logfile


si quieres mantenerte en grep:

grep -A1 ''blah'' logfile|grep -v "blah"

o

sed -n ''/blah/{n;p;}'' logfile


Perl alerta de una sola línea

solo por diversión ... imprime solo una línea después del partido

perl -lne ''$next=($.+1)if/match/;$.==$next&&print'' data.txt

aún más divertido ... imprime las siguientes diez líneas después del partido

perl -lne ''push@nexts,(($.+1)..($.+10))if/match/;$.~~@nexts&&print'' data.txt

un poco de trampa, ya que en realidad hay dos comandos