Grep por bloque de texto\líneas

Grep por bloque de texto\líneas

Tengo el texto, que contiene algunas líneas. Entonces, necesito hacer GREP de varias líneas. Por ejemplo, tengo texto repetido y debo obtener líneas GREP que tengan palabras clave repetidas.

grep -o "test|test2" textfile

Mi texto:

123|never for your|test
123421|never for your|test2
123412|never for your|test3
12341|never for your|test4
12311|never for your|test2
123312312|never for your|test
123321312|never for your|test2

Yo debería:

123|never for your|test
123421|never for your|test2
123312312|never for your|test
123321312|never for your|test2

Funciona, pero no funciona como quiero. Busca en texto, todas las palabras "prueba" y "prueba2". Pero quiero obtener bloques de texto, como algún patrón, donde sólo después de "prueba" viene "prueba2". Tienes algunas ideas ?

Respuesta1

Breve script de shell usando sed. Crea una lista de números de línea para el segundo caso y la compara con los números de línea del primer caso. Imprime pares coincidentes. Utiliza el primer argumento como nombre de archivo. Podría ampliarse fácilmente para tomar el segundo y tercer argumento como patrones que coincidan. Podría guardarlo como findnext.sh y ejecutar:

$ sh findnext.sh testfile

Debería ser rápido, ya que sólo implica dos pasadas por el archivo y tiene la ventaja de ser completamente portátil.

#!/bin/sh 
# Line numbers matching test1
mt2=$(sed -ne '/test1/=' < $1 | tr '\n' '/')

for l in $(sed -ne '/test/=' < $1); do
    nextline=$(expr $l + 1)
    [ "${mt2#*$nextline/}" != "$mt2" ] && sed -ne $l,${nextline}p <$1
done

Respuesta2

Puedes probar grep -E o egrep. Por favor inténtalo así

#this will show lines that have test or test2
    grep -E "test|test2" file

Si desea mostrar una línea que tiene prueba y prueba2 como esta prueba|prueba2 haga esto

# This will show lines that has test|test2
    grep "test\|test2" file

Respuesta3

awkpuede ser tu herramienta para esto:

awk '/test$/, /test2$/' < block-text-lines.txt 

la forma general es:

awk '/start-pattern/, /end-pattern/{command}'

Pero dado que el bloque de comando se imprime de forma predeterminada, solo los patrones de inicio y fin funcionan.

Consulte man awko elGuía del usuario de Gnu Awkparaformamas detalle.

Respuesta4

grep -A 1 "test$" in.txt | grep -B 1 "test2$"

en el manual de preparación

-A NUMImprima NUM líneas de contexto final después de las líneas coincidentes.

-B NUMImprima NUM líneas de contexto inicial antes de las líneas coincidentes.

El comando grep -Pzo ".*test$\n.*test2$" in.txttambién funciona, pero en el manual dice "Esto es altamente experimental y grep -P puede advertir sobre características no implementadas".

información relacionada