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 个索引 b
和 e
打印需要的行。
如果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
上对我也适用
所以我需要从日志文件中输出两条几乎完全相同的行之间的每一行。
日志看起来像这样:
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 个索引 b
和 e
打印需要的行。
如果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