【问题标题】:How can I parse the timestamp from my log file?如何从我的日志文件中解析时间戳?
【发布时间】:2020-12-29 04:19:49
【问题描述】:

我在 Linux 中有一个日志文件,其中包含此类信息:

20200910:16:59:38 gpbackup:gpadmin:mdw:024273-[INFO]:-Starting backup of database mydb
20200910:16:59:38 gpbackup:gpadmin:mdw:024273-[INFO]:-Backup Timestamp = 20200910165938

我需要获取时间戳值 (20200910165938)。我只需要时间戳、等号和空格之后的任何内容。在日志文件中,这一行只出现了一次。

我怎样才能做到这一点?

【问题讨论】:

    标签: string bash logging extract


    【解决方案1】:

    awk。对于 Timestamp 是倒数第三个字段 (NF-2) 的行,打印最后一个字段 (NF)。

    awk '$(NF-2)=="Timestamp" {print $NF}' file
    

    【讨论】:

      【解决方案2】:

      首先,让我们创建一个测试数据文件。

      cat <<EOF > data.txt
      20200910:16:59:38 gpbackup:gpadmin:mdw:024273-[INFO]:-Starting backup of database mydb
      20200910:16:59:38 gpbackup:gpadmin:mdw:024273-[INFO]:-Backup Timestamp = 20200910165938
      

      现在使用一些常见的 unix 工具来提取时间戳。

      cat data.txt | grep Timestamp | rev | cut -d' ' -f1 | rev
      
      • grep - 找到要处理的正确行。
      • rev - 反转行,以便第一个空格分隔时间戳的结尾。
      • cut - 提取反转的时间戳
      • rev - 将时间戳翻转为正确的顺序。

      【讨论】:

        【解决方案3】:
        perl -lne 'print for /Timestamp\s+=\s+(\d+)/;' logfile
        

        Perl 单行代码使用这些命令行标志:
        -e:告诉 Perl 查找内联代码,而不是在文件中。
        -n:循环输入一行一次,默认将其分配给$_
        -l:在执行内联代码之前剥离输入行分隔符(默认为 *NIX 上的"\n"),并在打印时附加它。

        正则表达式的工作方式如下:
        \s+:1 个或多个空格。
        \d+:1 个或多个数字。
        (\d+):捕获 1 个或多个数字。如果正则表达式匹配,则该“捕获组”(此处为时间戳)由正则表达式作为列表返回,然后打印。如果正则表达式不匹配,则返回一个空列表,并且不打印任何内容。

        另请参阅:

        perldoc perlrun: how to execute the Perl interpreter: command line switches
        perldoc perlre: Perl regular expressions (regexes)
        perldoc perlre: Perl regular expressions (regexes): Quantifiers; Character Classes and other Special Escapes; Assertions; Capture groups

        【讨论】:

          猜你喜欢
          • 2011-10-30
          • 1970-01-01
          • 2020-08-03
          • 1970-01-01
          • 2019-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多