我有一个非常大的文本文件(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命令行工具实现此目的?
答案 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