使用日期时间搜索日志文件

2024-04-01

我正在读取日志文件,并希望选择将搜索限制在特定日期范围内。日志文件中的行采用以下格式May 27 09:33:33。我已经将日志文件每一行中的日期与其余文本分开。我只是希望能够写出这样的声明

if(the date falls between June 10th and June 20th)

举个例子,我试图获取当前时间

use DateTime;

my $dt   = DateTime->now;
my $date = $dt->md;  
my $time = $dt->hms;   

但这不是把它变成mm-dd的格式吗?


您应该使用时间戳/纪元进行比较。这是一个例子:

#!/usr/bin/env perl                                                                         

use DateTime::Format::Strptime;
use DateTime;

my $year = DateTime->now->year;

my $date_parser = DateTime::Format::Strptime->new(
    pattern => '%Y %B %d', # YYYY Month DD
);

my $start_date = 'June 10';
my $end_date   = 'June 20';
my $start_epoch = $date_parser->parse_datetime("$year $start_date")
                              ->epoch();
my $end_epoch   = $date_parser->parse_datetime("$year $end_date")
                              ->add( days => 1 )
                              ->epoch(); # Add one to get next day                                                                

my $parser = DateTime::Format::Strptime->new(
    pattern => '%Y %b %d %T', # YYYY Mon DD HH:MM:SS                                        
);

print "Start Epoch : $start_epoch [ $start_date ]\n";
print "End   Epoch : $end_epoch [ $end_date ]\n";

for my $log_date ('May 27 09:33:33',
                  'Jun 05 09:33:33',
                  'Jun 10 09:33:33',
                  'Jun 20 09:33:33',
                  'Jun 30 09:33:33',) {
    my $epoch = $parser->parse_datetime("$year $log_date")->epoch();
    print "Log   Epoch : $epoch [ $log_date ]\n";
    if ( $start_epoch <= $epoch and $epoch < $end_epoch) {
        # Less than end_epoch (midnight) to match previous day                              
        print "==> Log Epoch is in range\n";
    }
}

输出以下内容:

Start Epoch : 1433894400 [ June 10 ]
End   Epoch : 1434844800 [ June 20 ]
Log   Epoch : 1432719213 [ May 27 09:33:33 ]
Log   Epoch : 1433496813 [ Jun 05 09:33:33 ]
Log   Epoch : 1433928813 [ Jun 10 09:33:33 ]
==> Log Epoch is in range
Log   Epoch : 1434792813 [ Jun 20 09:33:33 ]
==> Log Epoch is in range
Log   Epoch : 1435656813 [ Jun 30 09:33:33 ]

在不使用核心库的情况下计算纪元日期是不明智的,因为现在您需要担心自 UNIX 诞生日期(1970 年 1 月 1 日)以来的天数、闰日、闰秒,并且您将有很多边缘情况试图破坏您的乐趣。有很多方法会导致这个错误。然而还有一个替代方案:

如果由于某种原因,您反对使用核心库模块,您可以通过将日期转换为规范形式,然后仅选择属于该范围的日期来搜索日志文件。

这是相同的示例,但没有使用任何模块,而是使用标准化(规范)日期:

#!/usr/bin/env perl

use strict;
use warnings;

my %months = ( jan => 1, feb => 2,  mar => 3,  apr => 4,
               may => 5, jun => 6,  jul => 7,  aug => 8,
               sep => 9, oct => 10, nov => 11, dec => 12 );

my $year = 2015; # TODO: what year is it? Need to worry about Dec/Jan rollover

my @log_dates = (
    'May 27 09:33:33',
    'Jun 05 09:33:33',
    'Jun 10 09:33:33',
    'Jun 20 09:33:33',
    'Jun 30 09:33:33',
);

my $start_date = 'June 10';
my $end_date   = 'June 20';
my $start_canonical = canonical_date_for_mmmdd_hhmmss("$year $start_date 00:00:00");
my $end_canonical   = canonical_date_for_mmmdd_hhmmss("$year $end_date 23:59:59");

for my $log_date (@log_dates) {
    my $canonical_date = canonical_date_for_mmmdd_hhmmss("$year $log_date");
    print "Log Canonical Date : $canonical_date [ $log_date ]\n";
    if ($start_canonical <= $canonical_date and
        $canonical_date  <= $end_canonical) {
        print "===> Date in range\n";
    }
}

sub canonical_date_for_mmmdd_hhmmss {
    my ($datestr) = @_;
    my ($year, $mon, $day, $hr, $min, $sec) =
        $datestr =~ m|^(\d+)\s+(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)$|; # YYYY Month DD HH:MM:SS
    $year > 1900
        or die "Unable to handle year '$year'";
    my $month_first_three = lc( substr($mon,0,3) );
    my $month_num = $months{$month_first_three};
    defined $month_num
        or die "Unable to handle month '$mon'";
    (1 <= $day and $day <= 31)
        or die "Unable to handle day '$day'";
    (0 <= $hr and $hr <= 23)
        or die "Unable to handle hour '$hr'";
    (0 <= $min and $min <= 59)
        or die "Unable to handle minute '$min'";
    (0 <= $sec and $sec <= 59)
        or die "Unable to handle second '$sec'";
    my $fmt = "%04d%02d%02d%02d%02d%02d"; # YYYYMMDDHHMMSS
    return sprintf($fmt, $year, $month_num, $day, $hr, $min, $sec);
}

其输出如下:

Log Canonical Date : 20150527093333 [ May 27 09:33:33 ]
Log Canonical Date : 20150605093333 [ Jun 05 09:33:33 ]
Log Canonical Date : 20150610093333 [ Jun 10 09:33:33 ]
===> Date in range
Log Canonical Date : 20150620093333 [ Jun 20 09:33:33 ]
===> Date in range
Log Canonical Date : 20150630093333 [ Jun 30 09:33:33 ]

也可以看看ISO 8601 https://en.wikipedia.org/wiki/ISO_8601 (数据元素和交换格式)了解使用规范化/规范时间戳的其他属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用日期时间搜索日志文件 的相关文章

  • 使用 -T 开关运行时 $ENV{ENV} 不安全

    当我尝试最后一个例子时perlfaq5 如何计算文件中的行数 http perldoc perl org perlfaq5 html How do I count the number of lines in a file 我收到一条错误消
  • Perl:HTTP::微小删除留下损坏的锚标记

    我编写了一个脚本 该脚本收集从数据库读取的缓冲区内的所有 URL 检查该页面是否仍然存在 并使用 HTTP Tiny 从缓冲区中删除 URL 如果该 URL 无法访问或返回无效 问题是 HTTP Tiny 删除左锚标记 例如此处无效的文本
  • 检查一个数字是 int 还是 float

    在perl中 我想检查给定变量是否包含浮点数 为了检查我正在使用的 my Var 0 02 Floating point number if int Var Var floating point number 但上面的代码对于 0 0 不起
  • 为什么从 Pandas 1.0 中删除了日期时间?

    我在 pandas 中处理大量数据分析并每天使用 pandas datetime 最近我收到警告 FutureWarning pandas datetime 类已弃用 并将在未来版本中从 pandas 中删除 改为从 datetime 模块
  • `SystemTime::now` 是否受夏令时影响?

    在时间 T 我调用SystemTime now duration since UNIX EPOCH 在时间 T 10 当夏令时开始时 我调用相同的调用 我可以预期这两个实例之间会出现任何奇怪的行为吗 SystemTime本身完全独立于时区
  • 客户端浏览器关闭时服务器端 Perl CGI 脚本中断

    我已经尝试解决一个小问题很长一段时间了 但似乎我无法解决 我编写了一个 HTML 页面 它在提交表单时调用 perl CGI 脚本 该 CGI 在服务器端执行一定数量的任务 我让脚本将这些任务的步骤打印到 HTML 页面上的 iframe
  • 仅从日期计算夏令时

    我正在使用 Arduino 和实时时钟芯片 该芯片补偿了闰年等 因此它始终具有正确的日期 但我认为由于区域复杂性 它不处理夏令时 时钟可以给出日 月 年 从 1 开始 以及星期几 星期日 0 到星期六 6 因为我需要与用户输入的日期和时间进
  • 如何在 Perl 中使用原始套接字?

    你怎样才能得到一个rawPerl 中的套接字 那么构建与其一起使用的数据包的最佳方法是什么 与在 C 中执行的操作相同 通过在创建套接字时设置套接字类型 在示例中CPAN http search cpan org rgarcia perl
  • 使用 Python 在 Django 中将 Unix 时间戳转换为人类格式

    我想将字符串中的 unix 时间戳 例如 1277722499 82 转换为更人性化的格式 hh mm ss 或类似格式 有没有一种简单的方法可以在 python 中为 django 应用程序执行此操作 这是在模板之外 在我想要执行此操作的
  • 日期 (yyyy/MM/dd) 或年份 (yyyy) 的正则表达式验证器

    我想要正则验证表达式来验证仅输入年份 yyyy 或日期 yyyy MM dd 它不得接受 21 23323 它应该接受任何四位整数值 例如 2012 并且还应该仅接受年份 yyyy MM dd 格式 您不需要为此使用正则表达式 我会用Dat
  • 使用 DateTime 类计算日期差异时出错

    我正在尝试使用 DateTime 类 php gt 5 3 来计算 2 个日期的差异 手册中的示例简单明了 我尝试了该示例并且效果很好 但如果改变开始和结束日期 就会出现问题 this gt start date 2011 03 01 th
  • MySQL 正在将我的时间戳值转换为 0000-00-00

    我是 PHP 新手 目前仍在学习中 我认为我的注册表有问题 username password email全部成功插入MySQL registered and last seen不要 我以为我正在使用getTimestamp 错了 但它呼应
  • 什么是“日期时间”?而不是 C# 中的 DateTime? [复制]

    这个问题在这里已经有答案了 和有什么区别DateTime and a DateTime 不带问号 在 C 中 值类型后面的问号是该值的简写符号Nullable
  • 打包/解包 - 小端 - 64 位 - 问题

    usr bin env perl use warnings use 5 012 my var 1 lt lt 31 say unpack B pack N var 10000000000000000000000000000000 我怎样才能
  • 从具有多行记录的文件中提取数据,将每个范围保存到单独的文件中

    我有一个看起来像这样的文件 TRANSACTION STARTED 020t CARD INSERTED 020tCARD 5845 DATE 01 02 16 TIME 05 45 52 05 46 26 GENAC 1 ARQC EXT
  • 如何使用“子例程引用”作为哈希键

    在 Perl 中 我正在学习如何取消引用 子例程引用 但我似乎无法使用子例程引用作为哈希 键 在下面的示例代码中 我可以创建对子例程 subref 的引用 然后取消引用它以运行子例程 subref 我可以使用引用作为哈希 值 然后轻松取消引
  • 获取给定日期时间集的每月第一个星期一

    我需要什么 我有一个特定的日期时间列表 我想获取每个日期时间的第一个星期一 例如 假设给定的日期时间是 2013 07 05 2013 08 05 2013 09 13 etc 我想获得所有这些日期时间的第一个星期一 以便输出结果 2013
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • 何时计划 (SELECT) 查询?

    在 PostgreSQL 中 什么时候计划 SELECT 查询 Is it 在报表准备时 或者 在处理 SELECT 开始时 或者 别的东西 我问的原因是 Stackoverflow 上有一个问题 相同的查询 两种不同的方式 性能截然不同
  • 将带有时区的 Joda-Time `DateTime` 转换为没有时区的 DateTime?

    Given a DateTime http www joda org joda time apidocs org joda time DateTime html例如2015 07 09T05 10 00 02 00 using 乔达时间 h

随机推荐

  • 将 Android 应用程序连接到远程数据

    谢什谈论的信息有限 我正在尝试让我的 Android 应用程序连接到在线数据库以访问信息 有相当多的信息 包括地理标签 这些信息将映射到我的应用程序上 开发者网站有非常丰富的信息 您可以使用网络 如果可用 在您自己的基于 Web 的服务上存
  • 将 PDF 表单数据接收到 PHP 中

    所以我在网上寻找了几个小时 我认为这是一个非常简单的答案 但我似乎找不到它 我试图了解 PDF 表单数据提交的工作原理 我的目标是读取从我设置到 PHP 脚本中的 PDF 表单提交的表单数据 我希望我的 PHP 脚本能够解析表单数据并将其插
  • Django 管理错误“WSGIRequest”对象没有属性“用户”

    我正在练习 Django 当我尝试去http localhost admin http localhost admin 我收到以下错误 我已检查 settings py 并且 MIDDLEWARE CLASSES 确实存在 是否还有其他原因
  • Apache NiFi 用于将数据从 RDMBS 导入到 HDFS - 与 SQOOP 的性能比较

    我们正在探索 Apache NiFi 作为满足我们企业需求的通用数据摄取工具 一种典型的数据摄取要求是从 RDBMS 移动数据 系统到 HDFS 我能够使用 NiFi 提供的GenerateTableFetch 和 ExecuteSQL 处
  • 混洗两个 __m128i 的 64 位部分的最佳方法

    我有两个 m128is a and b 我想进行洗牌 以便高 64 位a落在低 64 位dst和低 64 位b落在上64dst i e dst 0 63 a 64 127 dst 64 127 b 0 63 相当于 m128i dst mm
  • 使用 SPI 接口初始化 microSD 卡

    我正在使用一个microSD http en wikipedia org wiki Secure Digital Physical size卡采用嵌入式设计 该卡使用 SPI 接口连接到微控制器 它适用于我以前使用过的所有卡 但现在我的新卡
  • 具有负载平衡的高负载服务器,使用 WCF 和 MSMQ

    目前我正在开发一个空间数据处理服务器 以下是要求 服务器必须能够每秒接收和处理大约 150 200 条小消息 GPS 修复 一些附加数据 它必须是可扩展的 例如在多台机器上运行并平衡负载本身 没有nlb 目前我已经测试了这种架构 传入消息服
  • HTML 预处理器?

    是否有一个 HTML 预处理器可以进行类似的简单页面处理服务器端包括 http en wikipedia org wiki Server Side Includes 但是生成一组静态 HTML 页面 我认为它们被称为预处理器 http ht
  • ng-focus 和 ng-blur 不适用于选择 DOM

    首先 我创建一个简单的示例来查看 ng focus 和 ng blur 是否在 select 上拖动 然后是我的实际代码 我找不到为什么第二个不起作用 div div
  • 使用“灵活”类型参数与泛型类型进行模式匹配

    match value with list lt SomeType gt as l gt l Is it possible to match any list of a type derived from SomeType gt failw
  • 将 system.windows.forms 与 XNA 结合使用

    我正在制作一个使用 XNA 的游戏 我想向游戏添加一些内容 例如按钮 文本框 标签 工具提示文本以及 system windows forms 附带的其他内容 如何将 system windows forms 与 XNA 合并 我可以实现任
  • ubuntu 找不到系统 Java 编译器。确保您已安装 JDK(不仅仅是 JRE)

    在ubuntu 12上 我尝试运行fuse jna的示例程序 我收到以下错误消息 syed ubuntu Downloads fuse jna master examples hellofs sh hellofs compileJava F
  • .NET 应用程序内存使用量 - 未使用的 .NET 和非托管内存和碎片较多

    我正在使用 ANTS 内存分析器来诊断我的 NET 2 0 应用程序之一中遇到的内存泄漏增加情况 我在 7 5 小时内拍摄了该过程的 7 个快照 以下是所获得数据的表格表示形式 G1代表1代尺寸 G2代表2代尺寸 除了非托管空间和私有字节之
  • PHP 中的 zipArchive 打开错误

    无法在 PHP 中创建 zip 存档 总是返回Ziparchive ER MULTIDISK fileName SERVER DOCUMENT ROOT temp temp zip zip new ZipArchive err zip gt
  • Jquery - 遍历所有选中的单选按钮

    我有一个类似于下面的表格
  • 如何通过 Telegraf 监控目录的大小

    我们需要监控一个目录的大小 例如InfluxDB的数据目录 以便在Grafana中设置警报 正如这里提到的 如何配置 telegraf 将文件夹大小发送到 influxDB https stackoverflow com q 4427343
  • Dart:pub get 与 pub Upgrade

    根据pub get docs http pub dartlang org doc pub get html之间的主要区别pub get and pub upgrade is 如果锁定文件已存在 则 pub get 使用锁定在其中的依赖项版本
  • setMaxForRoute 在 ThreadSafeClientConnManager 中不起作用

    我一直在尝试使用 Apache HttpClient 4 1 3 实现连接池并且ThreadSafeClientConnManager 当我尝试设置路由的最大连接数时 我遇到了一个问题 基本上我遵循的例子hc apache org http
  • 缺少具体实现“getter Equatable”/道具问题

    我正在使用 flutter 完成许多关于 bloc 的教程 但遇到了一些不一致的情况 我正在使用 Android studio 并使用 Intellij v1 6 0 的插件创建块代码 对于 bloc event 我继续看到类似这样的示例
  • 使用日期时间搜索日志文件

    我正在读取日志文件 并希望选择将搜索限制在特定日期范围内 日志文件中的行采用以下格式May 27 09 33 33 我已经将日志文件每一行中的日期与其余文本分开 我只是希望能够写出这样的声明 if the date falls betwee