file - txt - ¿Cómo puedo hacer que ''grep'' muestre una sola línea cinco líneas sobre la línea grepped?
shell script leer fichero y extraer lineas (4)
He visto algunos ejemplos de líneas de grepping antes y después, pero me gustaría ignorar las líneas medias. Entonces, me gustaría la línea cinco líneas antes, pero nada más. Se puede hacer esto?
Así es más fácil para mí:
grep --no-group-separator -B5 "pattern" file | sed -n 1~5p
Este grapado 5 líneas antes e incluyendo el patrón, desactiva el --- separador de grupo, luego imprime cada 5a línea.
Esta es la opción -B
-B NUM, --before-context=NUM Print NUM lines of leading context before matching lines. Places a line containing -- between contiguous groups of matches.
Ok, creo que esto hará lo que buscas. Buscará un patrón y extraerá la quinta línea antes de cada partido.
grep -B5 "pattern" filename | awk -F ''/n'' ''ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }''
básicamente, cómo funciona esto es que toma la primera línea, la imprime y luego espera hasta que vea ^--$
(el separador de coincidencias usado por grep), y comienza de nuevo.
Si solo quieres tener la quinta línea antes del partido, puedes hacer esto:
grep -B 5 pattern file | head -1
Editar:
Si puedes tener más de una coincidencia, puedes intentar esto (intercambiar pattern
con tu patrón real):
sed -n ''/pattern/!{H;x;s/^.*/n/(.*/n.*/n.*/n.*/n.*/)$//1/;x};/pattern/{x;s/^/([^/n]*/).*$//1/;p}'' file
Tomé esto de un tutorial de Sed , sección: Manteniendo más de una línea en el búfer de espera , ejemplo 2 y lo adapté un poco.