grep出力に基づいてテキストブロックを抽出する

grep出力に基づいてテキストブロックを抽出する

現在、次のテキストブロックを含むテキストファイルで作業しています。

--------------------------------------
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
--------------------------------------

目的はegrepが特定のキーワードを検出できるようにすることです。だから私は現在、以下を検索しています。

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

else
        echo "No words found!"
fi

sed(たとえば)を使用して、単語が見つかったテキストブロックをコピーするために後続の操作を追加する方法があるかどうか疑問に思います。

この例で予想される出力は次のとおりです。

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

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

「レポート」ファイルにはこれらのブロックが数十個含まれていますが、すべてキーワードがあるわけではありません。私はこのようなことをする人々に従いたいだけです。(上記の例に示すように)

答え1

魔法命令はとても簡単ですawk

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

次のように予想される出力が得られます。

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

答え2

たぶん、次のように何かをすることができます:

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

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

必要に応じて正規表現の末尾でキーワードを調整するだけです。私は行を変数に保存し、行に到達したときに希望のキーワードに出会ったら、変数----…----の内容を印刷してから、変数を空にして興味深いキーワードを見つけたことを忘れます。これがあなたが望むものであることを願っています。必要であれば、まだ編集できると思います。

これにより、関心のあるブロックが標準出力に出力されます。出力をファイルにリダイレクトしてコピーします。

関連情報