我需要两个匹配模式之间的行数

我需要两个匹配模式之间的行数

我的输入如下 -

[11/Jul/2016:13:40:43 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:43 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:47 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:47 +0000] "POST --" 500 - 7
[11/Jul/2016:13:41:48 +0000] "POST --" 200 - 7
[11/Jul/2016:13:41:49 +0000] "POST --" 500 - 7
[11/Jul/2016:13:42:12 +0000] "POST --" 500 - 7

我想要输入 13:40 到 13:41 之间的行数,在本例中计数为 6。

我尝试了以下选项

echo sed -n '/^START_TIME/,/^END_TIME/ p' somelogfile.log | wc -l

echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l

但我总是得到1。

有人可以检查一下并让我知道这里出了什么问题吗?

答案1

echo仅生成一行并wc正在计算这一行。

请注意,结束时间戳不存在13:41:43,并且使用的锚点(^$)限制太多。

删除echo并尝试以下操作:

sed -n '/13:40:43/,/13:41:49/p' somelogfile.log | wc -l

答案2

如果时间顺序与词汇顺序相同,您可以这样做:

awk '$0>="[11/Jul/2016:13:40:00" && $0<="[11/Jul/2016:13:41:59"' file | wc -l

这将检查该值是否大于或等于第一个日期且小于或等于第二个日期。如果awk没有给出命令,awk则仅打印该行。

答案3

我们来回顾一下这个命令:

echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l
  • 考虑一下 的作用echo以及通过管道的内容wc(只需尝试不使用wc)。这就解释了为什么你总是得到一个1.

  • 您编写的正则表达式被锁定到行的开头^和结尾$,但当然这些时间戳并不是行中唯一的内容,因此您应该删除锚点。

  • 结束条件查找示例中不存在的时间戳,因此匹配范围永远不会结束,从第一个匹配开始打印所有内容。

这样的事情可能会满足您的要求(使用3问题中当前显示的输入文件进行输出)

sed -ne '/13:40:47/,/13:41:48/p' somelogfile.log | wc -l

相关内容