Grep por bloco de texto\linhas

Grep por bloco de texto\linhas

Eu tenho o texto, que contém algumas linhas. Então, preciso fazer o GREP de várias linhas. Por exemplo, tenho texto repetido e devo obter linhas do GREP que contenham essas palavras-chave repetidas.

grep -o "test|test2" textfile

Meu 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

Eu deveria ter:

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

Funciona, mas não funciona como eu quero. Ele pesquisa no texto todas as palavras "teste" e "teste2". Mas eu quero obter blocos de texto, como algum padrão, onde somente depois de "teste" vem "teste2". Você tem alguma ideia?

Responder1

Breve script de shell usando sed. Faz uma lista de números de linha para o segundo caso e compara com os números de linha para o primeiro caso. Imprime pares correspondentes. Usa o primeiro argumento como nome do arquivo. Poderia ser facilmente estendido para considerar o segundo e o terceiro argumentos como padrões correspondentes. Poderia salvar como findnext.sh e executar:

$ sh findnext.sh testfile

Deve ser rápido, pois envolve apenas duas passagens no arquivo e tem a vantagem de ser totalmente 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

Responder2

Você pode tentar grep -E ou egrep. Por favor, tente assim

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

Se você quiser mostrar a linha que tem test e test2 como este test|test2 faça isso

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

Responder3

awkpode ser sua ferramenta para isso:

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

a forma geral é:

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

Mas como o padrão do bloco de comando é imprimir, apenas os padrões de início e fim resolvem.

Confira man awkou oGuia do usuário do Gnu AwkparacaminhoMais detalhes.

Responder4

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

No manual do grep

-A NUMImprime NUM linhas de contexto final após as linhas correspondentes.

-B NUMImprima NUM linhas de contexto inicial antes das linhas correspondentes.

O comando grep -Pzo ".*test$\n.*test2$" in.txttambém funciona, mas no manual está "Isso é altamente experimental e grep -P pode alertar sobre recursos não implementados."

informação relacionada