所以我需要从日志文件中输出两条几乎和可能相同的行之间的每一行。
日志看起来像这样:
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 。
行号可能会有所不同,行的开头始终保持不变。
如果可能,请留下解决方案的解释。
答案 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个索引e
和END
打印想要的行。
答案 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