【问题标题】:get no. of lines printed for a date range得到没有。为日期范围打印的行数
【发布时间】:2017-05-16 15:04:40
【问题描述】:

我正在尝试计算否。为给定日期范围打印的行数。

这是我的输入和输出:

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 命令是否有任何其他方式来获取输入日期范围内的行数。

【问题讨论】:

  • 要获取任何输出的行数,只需将输出通过管道传输到wc -l
  • 我必须从 2012 年 20 月 27 日过滤掉正确的行,然后才能获得计数,我会使用 wc -l

标签: linux bash date awk sed


【解决方案1】:

您可以单独使用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} 子句。

【讨论】:

  • 它应该只打印 4 个,因为只有 4 个日志(2016-12-26 的 2 个日志和 2016-12-27 的 2 个日志)。但它打印的是 10,即没有。输入文件的行数。
  • 感谢您的努力。在上图中,它不应该包含 2016-12-30 的日志,因为我们的结束日期是 2016-12-29。同样,如果 startdate 为 2016-12-19,则仅包含 2016-12-20 的日志。答案非常接近。你能否包括任何边界条件来检查它。谢谢!!!!!!
  • @SantoshSahu:参考我的更新,您上面的 ^ 评论似乎不正确,再次检查日期并观察输出。
  • @Inlan 我已经编辑了 cmets。希望这次您会发现更具可读性:感谢您的努力。在上图中,它不应该包含 2016-12-30 的日志,因为结束日期是 2016-12-29。同样,如果开始日期为 2016-12-19,则仅包含 2016-12-20 的日志,但如果我们提供开始日期为 2016-12-20,则不考虑 2016-12-20 的日志。答案非常接近。你能否包括任何边界条件来检查它。谢谢!!!!!!
  • @SantoshSahu:你指的是哪个日志? 2016-12-30 在我的awk 的输出中不存在,请告诉我哪个命令导致该输出。
【解决方案2】:

您遇到的困难与计算行数无关(这很简单,只需将数据传送到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

或者只是通过管道连接到 wc:

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

【讨论】:

    【解决方案3】:

    当所有行都有日期字符串时,您可以执行类似
    grep -Ec "^2016-12-2" *ActNac*(直到 2016-12-30,不包括 30 日),

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

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多