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

只需根据需要调整正则表达式末尾附近的关键字即可。我将这些行存储在一个变量中,当我到达一行时----…----,如果遇到想要的关键字,我会打印该变量的内容,然后清空它并忘记我找到了一个有趣的关键字。我希望这就是你想要的。我想如果需要的话我仍然可以编辑它。

这会将感兴趣的块输出到标准输出;将输出重定向到文件以复制它们。

相关内容