选择由某些字符分隔的完整文本块

时间:2016-04-28 12:53:25

标签: bash awk sed grep

我有一个非常大的文本文件(40GB gzip),其中数据块由//分隔。

如何选择某条线符合某条标准的数据块?也就是说,我可以grep一个模式并将选择扩展到//分隔符的两个方向吗?我不能假设块的大小和线的位置。

not interesting 1
not interesting 2
//
get the whole block 1
MATCH THIS LINE
get the whole block 2
get the whole block 3
//
not interesting 1
not interesting 2
//

我想用MATCH THIS LINE选择数据块:

get the whole block 1
MATCH THIS LINE
get the whole block 2
get the whole block 3

我尝试了sed,但无法理解模式定义。例如,这应该从//MATCH THIS LINE匹配:

sed -n -e '/\/\//,/MATCH THIS LINE/ p' file.txt

但它未能匹配//

是否可以使用GNU命令行工具实现此目的?

1 个答案:

答案 0 :(得分:5)

使用GNU awk(由于多字符RS),您可以将记录分隔符设置为//,以便每条记录都是// - 分隔的字符集:

$ awk -v RS="//" '/MATCH THIS LINE/' file

get the whole block 1
MATCH THIS LINE
get the whole block 2
get the whole block 3

请注意,这会在上方和下方留下一条空行,因为它会在//之后捕获新行并将其打印回来,以及//结尾之前的最后一行。要删除它们,您可以输入awk 'NF'

要在数据块之间打印分隔符(感谢123):

awk -v RS="//" '/MATCH THIS LINE/{print RT $0 RT}' file