【问题标题】:Extracting the lines from a file which shows date more than 30 days从显示日期超过 30 天的文件中提取行
【发布时间】:2022-11-13 11:18:55
【问题描述】:

专家们,

我是脚本世界的新手

我试图保留超过 30 天的线路。 该文件包含以下行

Server1 last patched on Mon Oct 11 09:50:47 2021
Server2 last patched on Fri Jun 3 07:53:36 2022
Server3 last patched on Fri Jun 3 11:58:26 2022
Server4 last patched on Fri Jun 17 12:58:59 2022
Server5 last patched on Fri Marc 17 04:12:51 2022
Server6 last patched on Mon Oct 17 23:08:24 2022

谢谢您的帮助。

希望保留超过 30 天的线路。 我试过这个

awk -v dat="Sun Oct 04 00:00:00 2022" -F':' '$5<dat' list.txt

给出相同的结果

    Server1 last patched on Mon Oct 11 09:50:47 2021
    Server2 last patched on Fri Jun 3 07:53:36 2022
    Server3 last patched on Fri Jun 3 11:58:26 2022
    Server4 last patched on Fri Jun 17 12:58:59 2022
    Server5 last patched on Fri Marc 17 04:12:51 2022
    Server6 last patched on Mon Oct 17 23:08:24 2022

预期结果是

Server1 last patched on Mon Oct 11 09:50:47 2021
Server2 last patched on Fri Jun 3 07:53:36 2022
Server3 last patched on Fri Jun 3 11:58:26 2022
Server4 last patched on Fri Jun 17 12:58:59 2022
Server5 last patched on Fri Marc 17 04:12:51 2022

文件条目是

server1 - Red Hat Enterprise Linux Server release 7.9 (Maipo) - last patched on Tue Sep 20 10:45:56 2022

【问题讨论】:

  • @markp-fuso 更新了预期的结果
  • @ glenn jackman 你是对的,感谢您的纠正 它应该在列表中

标签: linux bash unix awk sed


【解决方案1】:

困难在于必须将时间戳解析为实际时间值:您不能只将它们作为字符串进行比较并期望按时间顺序排列。

这里有一点perl:

perl -MTime::Piece -lane '
    BEGIN {$start = (localtime) - 86400 * 30}
    $t = Time::Piece->strptime("@F[4..8]", "%a %b %d %T %Y");
    print if $t < $start;
' file
Server1 last patched on Mon Oct 11 09:50:47 2021
Server2 last patched on Fri Jun 3 07:53:36 2022
Server3 last patched on Fri Jun 3 11:58:26 2022
Server4 last patched on Fri Jun 17 12:58:59 2022
Server5 last patched on Fri Mar 17 04:12:51 2022

请注意,我必须将 Marc 编辑为 Mar 以满足 strptime 的 %b 月份缩写。


如果它是这种格式。 'server1 - Red Hat Enterprise Linux Server release 7.9 (Maipo) - 最后修补于 2022 年 9 月 20 日星期二 10:45:56'。我需要更改@F[14..18]吗

是的。如果日期之前的字数是可变的,我会使用正则表达式匹配。我将假设“最后一次修补”始终存在:

perl -MTime::Piece -lne '
    BEGIN {$start = (localtime) - 86400 * 30}
    if (/last patched on (.+)/) {
        $t = Time::Piece->strptime($1, "%a %b %d %T %Y");
        print if $t < $start;
    }
' file

我无法重现您的错误:

$ cat file
server1 - Red Hat Enterprise Linux Server release 7.9 (Maipo) - last patched on Tue Sep 20 10:45:56 2022
Server1 last patched on Mon Oct 11 09:50:47 2021
Server2 last patched on Fri Jun 3 07:53:36 2022
Server3 last patched on Fri Jun 3 11:58:26 2022
Server4 last patched on Fri Jun 17 12:58:59 2022
Server5 last patched on Fri Mar 17 04:12:51 2022
Server6 last patched on Mon Oct 17 23:08:24 2022

$ perl -MTime::Piece -lne '
      BEGIN {$start = (localtime) - 86400 * 30}
      if (/last patched on (.+)/) {
          $t = Time::Piece->strptime($1, "%a %b %d %T %Y");
          print if $t < $start;
      }
  ' file
server1 - Red Hat Enterprise Linux Server release 7.9 (Maipo) - last patched on Tue Sep 20 10:45:56 2022
Server1 last patched on Mon Oct 11 09:50:47 2021
Server2 last patched on Fri Jun 3 07:53:36 2022
Server3 last patched on Fri Jun 3 11:58:26 2022
Server4 last patched on Fri Jun 17 12:58:59 2022
Server5 last patched on Fri Mar 17 04:12:51 2022

【讨论】:

  • 如果它是这种格式。 'server1 - Red Hat Enterprise Linux Server release 7.9 (Maipo) - 最后一次修补是在 2022 年 9 月 20 日星期二 10:45:56'。我需要改变@F[14..18]
  • 试过了,我得到了这个错误,没有任何输出'错误解析时间在 /System/Library/Perl/5.30/darwin-thread-multi-2level/Time/Piece.pm 第 597 行,<> 第 1 行。
  • 那就是“马克”。您需要将其修复为“Mar”作为 March 的缩写
  • 我已删除 Marc 已修复,这是一个拼写错误。但是我遇到了相同的解析错误
  • 您的数据文件中的第 1 行是什么?
猜你喜欢
  • 1970-01-01
  • 2011-10-31
  • 2022-07-06
  • 2012-03-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2019-09-19
  • 2023-03-18
相关资源
最近更新 更多