BASH - 输出两条相同/几乎相同的线之间(包括)的所有线

BASH - Output all Lines between (and including) two identical / almost identical Lines

所以我需要从日志文件中输出两条几乎完全相同的行之间的每一行。

日志看起来像这样:

Sat Sep 17 13:03:53
FOOBAR
this is FOO
Sun Sep 18 12:04:12
FOO-1543 Test
FOO-1543 BAR
FOO-1543 Test
FOO-1543 BAR
FOO-1543 Test
Mon Sep 19 00:00:01
FOO-1543 BAR
FOO-1543 Test
Tue Sep 20 16:13:37
FOO-1543 BAR
FOO-1543 Test

以此类推

我已经尝试使用

sed -n '/FOO-1543/,/FOO-1543/p' ${input} >> ${output}
sed -n '/^\FOO-1543/,/^\FOO-1543/p' ${input} >> ${output}
awk '/FOO-1543/,/FOO-1543/' ${input} >> ${output}
awk '/^\FOO-1543/,/^\FOO-1543/' ${input} >> ${output}

我从这些得到的输出:

FOO-1543 Test
FOO-1543 BAR
FOO-1543 Test
FOO-1543 BAR
FOO-1543 Test
FOO-1543 BAR
FOO-1543 Test
FOO-1543 BAR
FOO-1543 Test

我想要的输出:

FOO-1543 Test
FOO-1543 BAR
FOO-1543 Test
FOO-1543 BAR
FOO-1543 Test
Mon Sep 19 00:00:01
FOO-1543 BAR
FOO-1543 Test
Tue Sep 20 16:13:37
FOO-1543 BAR
FOO-1543 Test

我需要输出从第一个 FOO-1543 开始直到它最后一次出现在文档中的每一行 包括不包含 FOO-1543 但介于两者之间的行第一行和最后一行包含 FOO-1543

行号可能会有所不同,行的开头始终保持不变。

如果可能,请留下解决方案的解释。

如果要打印第一个和最后一个 FOO- 之间的所有行,可以使用以下命令:

awk '/^FOO-/{if(!b)b=NR;e=NR} {a[NR]=[=10=]} END{for(i=b;i<=e;i++) print a[i]}' file

这是设置索引为 b 的起始行和索引为 e 的结束行。

整个文件被复制到一个数组中a

根据 END 语句中的 2 个索引 be 打印需要的行。

如果perl解决方案没问题:

$ perl -ne 'print if /^FOO-1543/.../^FOO-1543/' ip.txt 
FOO-1543 Test
FOO-1543 BAR
FOO-1543 Test
FOO-1543 BAR
FOO-1543 Test
Mon Sep 19 00:00:01
FOO-1543 BAR
FOO-1543 Test
Tue Sep 20 16:13:37
FOO-1543 BAR
FOO-1543 Test

在这种情况下需要 range operator... 版本

sed -n '/^FOO-1543/,/^FOO-1543/p' ip.txtGNU sed 4.2.2

上对我也适用