grep -A1 'blah' logfile

Gracias a este comando para cada línea que ha ‘bla’ en ella, me da la salida de la línea que contiene ‘bla’ y la siguiente línea que se sigue en el archivo de registro. Podría ser una simple, pero no puedo encontrar una manera de omitir la línea que ha ‘bla’ y sólo mostrar siguiente línea en la salida.

  • Creo que muchas personas vienen aquí en busca de la -A1 opción
  • Entonces yo uso esto para obtener mi IP pública. 🙂 curl whatismyip.org | grep -A1 'Your IP Address'
  • Del Mismo Modo -B1-B2-B3-A1, -A2-A3 . . .
  • curl icanhazip.com (no grep es necesario) 🙂
InformationsquelleAutor facha | 2011-09-16

10 Comentarios

  1. 173

    puedes probar con awk:

    awk '/blah/{getline; print}' logfile
    • Para cualquier persona que realmente quería un grep -A2 equivalente (que es lo que yo necesitaba), getline sólo come la línea y pasa a la siguiente. Así que lo que funcionó para mí fue, literalmente, acaba de awk '/blah/{getline; getline; print}' logfile
  2. 138

    si quieres seguir a grep:

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

    o

    sed -n '/blah/{n;p;}' logfile
    • gracias por la sugerencia. Desde mi punto de VISTA, aunque, grep es mucho más legible y fácil de entender en comparación con sed o el awk respuesta marcada como la mejor respuesta….pero es sólo a mí tal vez 🙂
    • sed es la mejor respuesta. awk w/ getline en general funciona, pero es la herramienta equivocada y puede morder inesperadamente, http://awk.info/?tip/getline
    • Para aquellos curiosos acerca de lo que -v: de-v-invertir-partido de Invertir el sentido de la coincidencia, para seleccionar la no-coincidencia de líneas. (-v se especifica por POSIX.)
    • Me gusta mucho esta respuesta, pero no funciona si tiene dos líneas en una fila que contiene «bla» y desea obtener la segunda (porque es «la siguiente línea después de la que corresponde»). No puedo pensar en ningún caso de uso para que la parte superior de mi cabeza, pero vale la pena señalar.
    • La mejor solución es simplemente «aceptar». Si la segunda línea pasa a tener «blah» en ella, vas a tener un verdadero lío en sus manos.
  3. 29

    De tuberías es tu amigo…

    Uso grep -A1 para mostrar la siguiente línea después de un partido, luego de la tubería el resultado a tail y sólo agarrar 1 línea,

    cat logs/info.log | grep "term" -A1 | tail -n 1
    • No funcionará si usted tiene más de un partido.
    • Si el «término» es en la última línea, este volverá a la línea que contiene «término» en lugar de la nada, lo que quiere.
  4. 13

    Gran respuesta de raim, fue muy útil para mí. Es trivial para ampliar esta para imprimir por ejemplo, la línea 7, después de que el patrón

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

    Si que las siguientes líneas no contienen ‘bla’, puede filtrar con:

    grep -A1 blah logfile | grep -v blah

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

  6. 5

    En general, estoy de acuerdo en que estamos pidiendo mucho de grep aquí, y que otra herramienta puede ser la mejor solución. Pero en un entorno integrado, yo no quiero tener sed o awk sólo para hacer esto. He encontrado la siguiente solución funciona (siempre y cuando no sean contiguos de los partidos):

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

    Básicamente, coinciden con ellos, anexando 1 línea de contexto para cada partido, y luego de la tubería a través de una coincidencia inversa de su patrón original a la franja de aquellos. Por supuesto, esto significa que usted puede suponer que el patrón no se muestran en la «próxima» de la línea.

  7. 5

    Muchas buenas respuestas han sido dadas a esta pregunta tan lejos, pero todavía me falta uno con awk no usar getline. Desde entonces, en general, no es necesario el uso de getline, yo iría por:

    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 el almacenamiento de la línea donde «bla» que se encuentra y, a continuación, imprimir las líneas que son una línea después.

    De prueba

    Archivo de ejemplo:

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

    Obtener todas las líneas después de «blah». Esto imprime otro «bla» si aparece después de la primera.

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

    Obtener todas las líneas después de «bla» si no contienen «blah» a sí mismos.

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

    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
    • No hay ninguna diferencia. Como se puede ver a partir de las marcas que están a sólo minutos de distancia, parece que he contestado a la misma hora.
    • Mi mal, estás en lo correcto. Lo siento por eso.
  9. 4

    perl de una línea de alerta

    sólo por diversión… imprimir sólo una línea después del partido

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

    aún más divertido… imprimir los próximos diez líneas después del partido

    perl -lne '[email protected],(($.+1)..($.+10))if/match/;[email protected]&&print' data.txt

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

    • Se puede explicar de $.==$a continuación? Claramente es más que una comparación numérica del número de línea actual con $próxima, pero no entiendo cómo y por qué funciona.
    • No es más que eso. $. == $next && print es el mismo que print if $. == $next
    • Ah, ya veo. Thx! De las 2 partes, cada una es verdadera y se ejecuta por separado, adyacente iteraciones del bucle. Supongo que si el punto era para imprimir cualquier línea después de cualquier partido que se desea invertir el orden (que se comporten más como grep -A1). Si desea imprimir sólo las siguientes líneas, pero nunca una línea con un partido, entonces se puede mantener de esta orden. (notando cómo $próxima sería una paliza para los partidos de forma consecutiva)
  10. 3

    Parece que usted está usando la herramienta equivocada allí. Grep ¿no es sofisticado, creo que quiere a paso hasta awk como la herramienta para el trabajo:

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

    Si usted recibe algún problema avísame, yo creo que bien vale la pena aprender un poco de awk, es una gran herramienta 🙂

    p.s. Este ejemplo no ganar una «inútil el uso de cat premio’ 😉
    http://porkmail.org/era/unix/award.html

    • Por CIERTO, puede omitir «$0» en la impresión.

Dejar respuesta

Please enter your comment!
Please enter your name here