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

时间:2016-09-22 07:24:21

标签: bash aix

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

日志看起来像这样:

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

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

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

2 个答案:

答案 0 :(得分:1)

如果要在FOO-的第一次和最后一次出现之间打印所有行,可以使用以下内容:

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

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

整个文件被绑定到数组a

根据b声明中的2个索引eEND打印想要的行。

答案 1 :(得分:0)

如果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.txt也适用于GNU sed 4.2.2