没有。 为date范围打印的线条

我正在努力得到没有。 为给定的date范围打印的线条。

这是我的input和输出:

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 

我想find没有。 自2017年12月20日至2017年12月30日

开始date和结束date不确认,所以如果我使用sed命令

 grep -inr "\[HSM \]Handle Identity Request. Send Identity Response. timeout: 1550s" *ActNac* | sed -n '/2016-12-20/,/2017-12-27/p'" 

但是如果我提供像这样的input:

 grep -inr "\[HSM \]Handle Identity Request. Send Identity Response. timeout: 1550s" *ActNac* | sed -n '/2016-12-19/,/2017-12-27/p'" 

它没有给出任何输出,因为开始date与inputdate中的任何行不匹配。 有没有date2016-12-19日志文件。

有没有其他方式与sed / awk / grep命令来获取inputdate范围内的行数。

你可以单独使用awk来做到这一点。

为了单独计数,

 awk -F'[: ]' '$3 >= "2016-12-16" && $3 <= "2016-12-26 && NR>1"{count++;}END{print count}' newfile 5 

为了得到实际的日志,我使用了日志中实际不存在的日期,

 awk -F'[: ]' '$3 >= "2016-12-22" && $3 <= "2016-12-29" && NR>1' newfile 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 

要获得计数,请在第一个命令中使用{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 

这将打印日期为148​​2192000(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 

或只是管道到WC:

 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日),

要么

 grep -Ec "^2016-12-(2|30)" *ActNac*