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.