GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo obtener la línea n-th después de una grepped?

No hay nada de malo con las dos respuestas anteriores, pero pensé en hacerle saber que encontrar la tercera línea después de un patrón se puede hacer en un solo sed llamar:

sed -n "/four/ { n; n; p }" SourceData.txt

Debido a que un solo programa hace el trabajo, esto es más eficiente que ejecutar varios filtros. El comando anterior genera la tercera línea después de cada instancia de "cuatro", excepto cuando esto ocurre nuevamente en una de las dos líneas después de una coincidencia (las otras soluciones tampoco manejan este caso de la manera esperada); además, no se genera ningún resultado si el patrón está en la última o penúltima línea del archivo, lo que puede o no ser lo que desea.

Para hacer coincidir solo la primera instancia:

sed -n "/four/ { n; n; p; q }" SourceData.txt

(Tenga en cuenta que esta respuesta es lo más eficiente posible, ya que finaliza el escaneo tan pronto como se encuentra la coincidencia).

Agrego esta solución porque vale la pena conocer sed y, a pesar de su sintaxis bastante desagradable (¡las expresiones regulares ya son bastante malas!), a menudo puede ser extremadamente útil. Este tutorial es una buena introducción.


Esta solución imprime la línea actual si hubo una coincidencia hace dos líneas. Es ligeramente diferente de algunas otras respuestas porque no se perderá otra coincidencia, incluso si ocurre poco después de la coincidencia anterior.

awk -v delay=2 '{for (i=delay; i>=0; i--) t[i]=t[i-1]} /four/ {t[0]="m"} {if (t[delay]) print}'

Siempre que hay una coincidencia, la información se almacena en t[0] . Con cada línea el t matriz se desplaza (incluido el desplazamiento t[-1] a t[0] para restablecer el valor de t[0] ). La línea se imprime si la matriz indica que hubo una coincidencia hace dos líneas.

Puede configurar fácilmente un retraso diferente (por ejemplo, delay=7 ) o use otro patrón (por ejemplo, /sda[[:digit:]]/ )


Puedes usar esta expresión (input.txt ):

grep "four" -A 2 input.txt | tail -n 1

La salida es:

six 6

El grep la opción "-A 2" establece que se emiten dos líneas después de la línea coincidente.
Y el tail la opción "-n 1" establece que solo el último 1 se devuelven líneas de este resultado.


Linux
  1. ¿Cómo mover una línea en un archivo de texto hacia arriba o hacia abajo una línea?

  2. ¿Devolver solo la parte de una línea después de un patrón coincidente?

  3. ¿Cómo obtener la suma Md5 del contenido de un directorio como una sola suma?

  4. ¿Cómo contar el número de líneas en un archivo después de una coincidencia Grep?

  5. ¿Cómo obtener la versión del controlador nvidia desde la línea de comandos?

Cómo obtener el tamaño de un directorio en Linux

Cómo aprovechar al máximo Qmmp 1.0

Cómo obtener el tamaño de tar.gz en un archivo (MB) en python

¿Cómo obtengo el nombre de usuario en un Makefile?

¿Cómo obtengo un equivalente de /dev/one en Linux?

¿Cómo obtener la URL del archivo de Dropbox desde la línea de comando?