sed:仅当一行与第三个单词或任何模式匹配时,在两个单词之间打印行

时间:2011-06-08 23:29:45

标签: linux sed awk

我知道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

4 个答案:

答案 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