
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
awk
puede 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 awk
o 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 NUM
Imprima NUM líneas de contexto final después de las líneas coincidentes.
-B NUM
Imprima NUM líneas de contexto inicial antes de las líneas coincidentes.
El comando grep -Pzo ".*test$\n.*test2$" in.txt
también funciona, pero en el manual dice "Esto es altamente experimental y grep -P puede advertir sobre características no implementadas".