这将与任何 UNIX 系统上的任何 awk 一起稳健地工作:
awk -v RS= '$1=="BUF"' file
如果您可以在输入中有多个“BUF”块,那么您可能希望输出中的空白行与输入中的空白行相同,因此您可以使用:
awk -v RS= -v ORS='\n\n' '$1=="BUF"' file
到目前为止,上述答案与任何其他答案之间的主要区别在于,由于它对每条记录中的第一个非空白字符串进行精确的字符串比较,因此无论行上 BUF 前面的空格如何,它都可以工作,甚至可以工作如果类似的文本(例如 BUFFER)出现在其他行上,并且即使 BUF 出现在文件其他部分的错误位置(例如在 cmets 中?)也会起作用。
以这个输入文件为例:
$ cat file
INV i0 (.I(a0), # not BUF here
.O(b0));
BUF i1 (.I(a1),
.O(b1));
BUFFER i1 (.I(a1),
.O(b1));
以下是目前所有提议的解决方案的行为方式:
$ awk -v RS= '$1=="BUF"' file
BUF i1 (.I(a1),
.O(b1));
$
$ sed -n '/^BUF/{N;p}' file
BUFFER i1 (.I(a1),
.O(b1));
$
$ awk 'BEGIN {RS=""} /BUF/' file
INV i0 (.I(a0), # not BUF here
.O(b0));
BUF i1 (.I(a1),
.O(b1));
BUFFER i1 (.I(a1),
.O(b1));
$
$ grep -Poz 'BUF[^;]+;' file
BUF here
.O(b0));BUF i1 (.I(a1),
.O(b1));BUFFER i1 (.I(a1),
.O(b1));$
$
$ grep "BUF " -A1 file
INV i0 (.I(a0), # not BUF here
.O(b0));
--
BUF i1 (.I(a1),
.O(b1));
$