Linux 获取为日期范围打印的行数

Linux 获取为日期范围打印的行数,linux,bash,date,awk,sed,Linux,Bash,Date,Awk,Sed,我正在尝试获取给定日期范围内打印的行数 以下是我的输入和输出: grep -inr "\[HSM \]Handle Identity Request. Send Identity Response. timeout: 1550s" *ActNac* ActNacd.txt:47:2017-01-02 09:10:13 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s old_ActNacd_2016-1

我正在尝试获取给定日期范围内打印的行数

以下是我的输入和输出:

grep -inr "\[HSM \]Handle Identity Request. Send Identity Response. timeout: 1550s" *ActNac*
ActNacd.txt:47:2017-01-02 09:10:13 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s
old_ActNacd_2016-12-20_20-39-18.txt:171:2016-12-19 13:23:48 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s
old_ActNacd_2016-12-20_20-39-18.txt:217:2016-12-19 14:27:26 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s
old_ActNacd_2016-12-26_09-44-47.txt:47:2016-12-25 19:26:13 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s
old_ActNacd_2016-12-26_09-44-47.txt:91:2016-12-25 20:30:38 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s
old_ActNacd_2016-12-27_07-32-25.txt:47:2016-12-26 11:08:28 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s
old_ActNacd_2016-12-27_18-06-29.txt:47:2016-12-27 07:35:55 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s
old_ActNacd_2016-12-30_08-22-16.txt:48:2016-12-28 18:04:19 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s
old_ActNacd_2017-01-02_06-56-52.txt:47:2016-12-30 08:24:19 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s
old_ActNacd_2017-01-02_09-07-23.txt:47:2017-01-02 06:59:33 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s
我想查找从2017-12-20到2017-12-30打印的行数

开始日期和结束日期都没有确认,所以如果我使用sed命令

grep -inr "\[HSM \]Handle Identity Request. Send Identity Response. timeout: 1550s" *ActNac* | sed -n '/2016-12-20/,/2017-12-27/p'"
但如果我提供如下输入:

grep -inr "\[HSM \]Handle Identity Request. Send Identity Response. timeout: 1550s" *ActNac* | sed -n '/2016-12-19/,/2017-12-27/p'"
它不提供任何输出,因为开始日期与作为输入日期的任何行都不匹配。没有日期为2016-12-19的日志文件


使用sed/awk/grep命令是否还有其他方法可以获取输入日期范围内的行数。

您可以单独使用
awk

为了让伯爵一个人

awk -F'[: ]' '$3 >= "2016-12-16" && $3 <= "2016-12-26 && NR>1"{count++;}END{print count}' newfile
5
awk-F'[:]'$3>=“2016-12-16”和&$3=“2016-12-22”和&$31”新文件
旧的ActNacd_2016-12-26_09-44-47.txt:47:2016-12-25 19:26:13-[HSM]处理身份请求。发送标识响应。超时:1550s
old_ActNacd_2016-12-26_09-44-47.txt:91:2016-12-25 20:30:38-[HSM]处理身份请求。发送标识响应。超时:1550s
old_ActNacd_2016-12-27_07-32-25.txt:47:2016-12-26 11:08:28-[HSM]处理身份请求。发送标识响应。超时:1550s
旧的ActNacd_2016-12-27_18-06-29.txt:47:2016-12-27 07:35:55-[HSM]处理身份请求。发送标识响应。超时:1550s
old_ActNacd_2016-12-30_08-22-16.txt:48:2016-12-28 18:04:19-[HSM]处理身份请求。发送标识响应。超时:1550s

要获得计数,请在第一个命令中使用
{count++;}END{print count}
子句。

您遇到的困难与计数行无关(这很简单,只需将数据传输到
wc-l
),而是比较日期。如果要比较日期,最简单的方法是将日期转换为合理的表示形式,这样比较就容易了。大纪元。使用perl执行此操作的一种简单方法:

perl -mTime::Piece -ne 'm/[^:]*:[^:]*:([-0-9]*) /; 
    $t=Time::Piece->strptime($1, "%Y-%m-%d"); print if $t > 1482192000;' input
这将打印日期超过1482192000(12月20日格林威治标准时间午夜)的行。要计算它们,请在perl中计算它们:

perl -mTime::Piece -nE 'm/[^:]*:[^:]*:([-0-9]*) /; 
    $t=Time::Piece->strptime($1, "%Y-%m-%d"); $v++ if $t > 1482192000;
    END{say $v}' input
或者只是通过管道连接到厕所:

perl -mTime::Piece -ne 'm/[^:]*:[^:]*:([-0-9]*) /; 
    $t=Time::Piece->strptime($1, "%Y-%m-%d"); print if $t > 1482192000;' input | 
wc -l

当所有行都有一个日期字符串时,您可以执行类似于
grep-Ec“^2016-12-2”*ActNac*
(截至2016-12-30,不包括第30天)


因为只有4个日志(2016-12-26的2个日志和2016-12-27的2个日志),所以应该只打印4个日志。但它正在打印10行,即输入文件的行数。谢谢你的努力。谢谢你的努力。上图中不应包括2016-12-30的日志,因为我们确定的截止日期为2016-12-29。同样,如果起始日期为2016-12-19,则仅包括2016-12-20的日志。答案非常接近。你能提供一些边界条件来检查它吗。谢谢@Santossahu:请参考我的更新,您的^1以上评论似乎不正确,请重新检查日期并观察输出。@Inlan我已编辑了评论。希望这次你能发现更多的可读性:谢谢你的努力。上图中不应包括2016-12-30的日志,因为截止日期为2016-12-29。同样,如果起始日期为2016-12-19,则仅包括2016-12-20的日志,但如果我们提供的起始日期为2016-12-20,则不考虑2016-12-20的日志。答案非常接近。你能提供一些边界条件来检查它吗。谢谢要获得任何输出的行数,只需通过管道将输出传输到
wc-l
。我必须从20-27/12中筛选出合适的行,然后使用wc-l获得计数
perl -mTime::Piece -ne 'm/[^:]*:[^:]*:([-0-9]*) /; 
    $t=Time::Piece->strptime($1, "%Y-%m-%d"); print if $t > 1482192000;' input | 
wc -l
grep -Ec "^2016-12-(2|30)" *ActNac*