Sé que con grep puedo usar los campos -A
y -B
extraer líneas anteriores y siguientes de un partido.
Sin embargo, tiran de todas las líneas entre la coincidencia en función de la cantidad de líneas especificadas.
grep -r -i -B 5 -A 5 "match"
Me gustaría recibir solo la 5ª línea antes de un partido y la 5ª línea después del partido además de la línea coincidente y no obtener las líneas intermedias.
¿Hay alguna manera de hacer esto con el grep
?
command-line
grep
awk
chollida
fuente
fuente
grep -r -i -B 5 -A 5 "match" | sed -e 1b -e '$!d'
Respuestas:
La herramienta que desea usar se llama tamizar. Esto es básicamente un grep en esteroides. Grep en paralelo. Sift tiene una gran cantidad de opciones para hacer exactamente lo que desea, específicamente para devolver una línea particular en relación con una (s) coincidencia (s) que puede / no puede ser seguida / precedida por algún texto.
Me sorprende que sift no sea un gnu convencional, ya que fue escrito en el lenguaje go, pero se instala en Linux perfectamente. IT busca en paralelo utilizando todas las grandes cantidades de texto de cpus donde grep solo lleva semanas para hacer lo mismo.
Sitio web de Sift - ver ejemplos
fuente
Si:
Entonces:
fuente
/match/ {matched[NR]}
? Nunca he visto una matriz o variable como un comando completo. ¿Está poniendo el número de registro actual de cada línea coincidente en la matriz.key in array
. Lo que estoy haciendo es recordar los números de línea donde aparece el patrónEsta es básicamente la solución de Glenn, pero implementada con Bash, Grep y sed.
Tenga en cuenta que los números de línea menores que 1 generarán un error de sed, y los números de línea mayores que el número de líneas en el archivo harán que no imprima nada.
Esto es solo el mínimo indispensable. Hacer que funcione de manera recursiva y manejar los casos de números de línea anteriores requeriría algo de trabajo.
fuente
No se puede hacer solo con eso
grep
. Sied
es una opción:El script básicamente dice: por cada coincidencia de / match /, imprima la línea 5 líneas antes de eso, luego 5 líneas después de eso, luego 5 líneas después de eso.
fuente
ed
siempre es una respuesta, porqueed
es el editor de texto estándar.grep
respuesta, la respuesta de "No puedes hacerlo con X, pero puedes hacerlo con Y, así es cómo" sigue siendo una respuesta válida ya que no solo respondes la pregunta de OP sino que también ofreces una alternativa eso funcionaria. Este es un tipo válido de respuesta aquí.Aquí estamos usando la función de awk para llamar a un comando externo para imprimir las líneas que awk coinciden con el patrón con las 5ª líneas antes y después del partido.
system(command)
sed
match
La sintaxis es fácil, solo necesita colocar el comando externo dentro de comillas dobles y sus interruptores y escapar de las cosas que desea pasar exactamente al comando, todo lo demás relacionado con las
awk
opciones en sí debe estar fuera de las comillas. Entonces el siguiente sed :traducir en:
NR
es el número de línea que coincide con el patrónmatch
yFILENAME
es el nombre de archivo de procesamiento actual que pasaawk
.fuente
usando el archivo de texto de ejemplo de @ glenn y usando perl en lugar de awk:
dará los mismos resultados, pero se ejecutará más rápido:
fuente