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