我知道sed使用以下命令从test.txt打印单词FOO和BAR之间的行
sed -n '/FOO/,/BAR/p' test.txt
但是,只有当其中一条线具有匹配的图案时,如何使sed打印FOO和BAR之间的线
例如,文件text.txt包含以下行:
Error- Undefined port
line1
line2
Undefined port in ALU1
line3
Error- Undefined port
line4
line5
Undefined port in LSU
line6
Error- Undefined port
line7
line8
Undefined port in FGU
line9
Error- Undefined port
line10
line11
Undefined port in ALU2
line12
我想在两次连续出现之间打印出行 仅当其中一行包含单词“ALU”时,单词“Error”。
所以我只想打印出以下错误消息:
Error- Undefined port
line1
line2
Undefined port in ALU1
line3
Error- Undefined port
line10
line11
Undefined port in ALU2
line12
答案 0 :(得分:4)
要实现这一点,您需要在sed脚本中进行分支并保留缓冲区。
该脚本使用两个缓冲区:模式缓冲区(它是sed存储当前处理的行的缓冲区,用于模式匹配测试的缓冲区)和保持缓冲区(用于存储前一行的缓冲区)。我们的想法是存储上一个/Error/
模式匹配的所有行,并在下一个/ALU/
匹配或流结束时检查/Error/
出现的时间。
sed -n '
# if /Error/ pattern occured, jump to /ALU/ check
/Error/ b alu_check
# else append current line to the hold buffer
H
# if the current line is the last one, jump to /ALU/ check
$ b alu_check
# otherwise jump to end of script (= finish processing of this line)
b
# alu_check:
:alu_check
# exchange current pattern buffer with hols buffer context
x
# print previous record if /ALU/ occured
/ALU/ p
'
x
命令用保持缓冲区上下文(从上次记住的内容)交换模式缓冲区上下文(当前行) - 注意它将当前行/ Error / pattern存储到保持缓冲区以供下一次使用时间
H
将当前行上下文附加到保持缓冲区
答案 1 :(得分:2)
awk变体:
awk 'BEGIN{RS=ORS="\n\n";FS="\n"}/^Error.+ALU/' file
RS
(记录分隔符)强制在空行
FS
(字段分隔符)
ORS
(输出记录分隔符)在输出的空白行上设置(如果您不需要,请将其删除)
/^Error.+ALU/
如果记录(文本块)以Error
开头且包含ALU
- >打印块。
答案 2 :(得分:2)
awk -v RS = -v ORS =“\ n \ n”'/ ALU /'file
答案 3 :(得分:0)
遗产:
awk '{FS="\n";RS=""} $0 ~ /ALU/ {print $0"\n"}' file