Extraindo blocos de texto com base na saída do grep

1

Atualmente, estou trabalhando com um arquivo de texto que contém os seguintes blocos de texto:

--------------------------------------
Beginning of block
Text
Random Text
keywordA
Text
End of block
--------------------------------------

--------------------------------------
Beginning of block
Text
Random Text
keywordA
Text
End of block
--------------------------------------

--------------------------------------
Beginning of block
Text
Random Text
keywordD
Text
End of block
--------------------------------------

--------------------------------------
Beginning of block
Text
Random Text
keywordd
Text
End of block
--------------------------------------

O objetivo é fazer com que o egrep detecte determinadas palavras-chave e, se essas palavras existirem, eu gostaria de copiar o bloco para outro arquivo. Atualmente, estou pesquisando com:

if egrep -wi 'keywordA|KeywordB|keywordC' Report
then
        echo "Words found!"

else
        echo "No words found!"
fi

Eu queria saber se há alguma maneira de adicionar uma ação de acompanhamento para usar sed (por exemplo) para copiar o bloco de texto onde as palavras foram encontradas.

A saída esperada, neste exemplo, seria:

--------------------------------------
Beginning of block
Text
Random Text
keywordA
Text
End of block
--------------------------------------

--------------------------------------
Beginning of block
Text
Random Text
keywordA
Text
End of block
--------------------------------------

O arquivo "Report" contém dezenas de blocos como este, mas nem todos eles têm a palavra-chave. Eu gostaria de copiar apenas os que (como demonstrado no exemplo acima) .

Espero que isso faça sentido!

Agradecemos antecipadamente por qualquer ajuda ou ponteiros!

    
por t988GF 04.06.2017 / 16:01

2 respostas

2

é tão fácil para o comando magic awk :

awk -v RS="--------------------------------------"
       '/keywordA/||/keywordB/||/keywordC/' RS='' infile.txt

Você receberá a saída como abaixo do esperado:

--------------------------------------
Beginning of block
Text
Random Text
keywordA
Text
End of block
--------------------------------------
--------------------------------------
Beginning of block
Text
Random Text
keywordA
Text
End of block
--------------------------------------
    
por 29.07.2017 / 15:41
1

Talvez algo ao longo dessas linhas funcione:

awk '
    {
        if(/--------------------------------------/) {
            if(found)
                printf buffer
            buffer = ""
            found = 0
        } else
            buffer = buffer $0 "\n"
    }

    /keyworda|keywordb|whateveryouwant/ {
        found = 1
    }
' input_file.txt

Basta ajustar as palavras-chave no regexp perto do final, de acordo com o que você precisa. Eu armazeno as linhas em uma variável, e quando eu alcanço uma linha ----…---- , se eu encontrar uma palavra-chave desejada, imprimo o conteúdo dessa variável, depois esvazio e esqueço que encontrei uma palavra-chave interessante. Espero que seja o que você quer. Eu ainda posso editá-lo, se necessário, eu acho.

Isso produz blocos interessantes para a saída padrão; redirecionar a saída para um arquivo para copiá-los.

    
por 29.07.2017 / 15:30