我当前正在使用包含以下文本块的文本文件:
--------------------------------------
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
只需根据需要调整正则表达式末尾附近的关键字即可。我将这些行存储在一个变量中,当我到达一行时----…----
,如果遇到想要的关键字,我会打印该变量的内容,然后清空它并忘记我找到了一个有趣的关键字。我希望这就是你想要的。我想如果需要的话我仍然可以编辑它。
这会将感兴趣的块输出到标准输出;将输出重定向到文件以复制它们。