我的输入如下 -
[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