【问题标题】:An easy way to diff log files, ignoring the time stamps?一种区分日志文件的简单方法,忽略时间戳?
【发布时间】:2010-09-07 19:48:25
【问题描述】:

我需要区分两个日志文件,但忽略每行的时间戳部分(准确地说是前 12 个字符)。有什么好的工具,或者聪明的 awk 命令可以帮助我吗?

【问题讨论】:

    标签: parsing shell diff compare logging


    【解决方案1】:

    根据您使用的 shell,您可以将建议的方法 @Blair 转换为 1-liner

    diff <(cut -b13- file1) <(cut -b13- file2)
    

    (+1 到@Blair 原始建议:-)

    【讨论】:

    【解决方案2】:

    @EbGreen 说

    我只会获取日志文件并从每行的开头剥离时间戳,然后将文件保存到不同的文件中。然后比较这些文件。

    这可能是最好的选择,除非您的差异工具具有特殊能力。 例如,你可以

    cut -b13- file1 > trimmed_file1
    cut -b13- file2 > trimmed_file2
    diff trimmed_file1 trimmed_file2
    

    请参阅@toolkit 的回复,了解一种优化,使其成为单线并消除对额外文件的需求。如果您的外壳支持它。 Bash 3.2.39 至少似乎...

    【讨论】:

    • 如果某人的时间戳也有 ISO 格式的日期,那么使用 -b25-
    【解决方案3】:

    使用cut 的答案很好,但有时将时间戳保持在diff 输出中是可观的。由于 OP 的问题是关于忽略时间戳(不删除它们),我在这里分享我棘手的命令行:

    diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
    
    • sedprocess substitution 中隔离时间戳(# 之前和 \n 之后)
    • diff -I '^#' 忽略具有这些时间戳的行(以# 开头的行)

    示例

    两个内容相同但时间戳不同的日志文件:

    $> for ((i=1;i<11;i++)) do echo "09:0${i::1}:00.000 data $i"; done > 1.log
    $> for ((i=1;i<11;i++)) do echo "11:00:0${i::1}.000 data $i"; done > 2.log
    

    基本diff 命令行表示所有行都不同:

    $> diff 1.log 2.log
    1,10c1,10
    < 09:01:00.000 data 1
    < 09:02:00.000 data 2
    < 09:03:00.000 data 3
    < 09:04:00.000 data 4
    < 09:05:00.000 data 5
    < 09:06:00.000 data 6
    < 09:07:00.000 data 7
    < 09:08:00.000 data 8
    < 09:09:00.000 data 9
    < 09:01:00.000 data 10
    ---
    > 11:00:01.000 data 1
    > 11:00:02.000 data 2
    > 11:00:03.000 data 3
    > 11:00:04.000 data 4
    > 11:00:05.000 data 5
    > 11:00:06.000 data 6
    > 11:00:07.000 data 7
    > 11:00:08.000 data 8
    > 11:00:09.000 data 9
    > 11:00:01.000 data 10
    

    我们棘手的diff -I '^#' 没有显示任何差异(忽略时间戳):

    $> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
    $>
    

    更改2.log(将第6行的data替换为foo)并再次检查:

    $> sed '6s/data/foo/' -i 2.log
    $> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
    11,13c11,13
    11,13c11,13
    < #09:06:00.000
    <  data 6
    < #09:07:00.000
    ---
    > #11:00:06.000
    >  foo 6
    > #11:00:07.000
    

    => 时间戳保存在 diffoutput 中!

    您还可以通过-y--side-by-side 选项使用并排功能:

    $> diff -y -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
    #09:01:00.000                   #11:00:01.000
     data 1                          data 1
    #09:02:00.000                   #11:00:02.000
     data 2                          data 2
    #09:03:00.000                   #11:00:03.000
     data 3                          data 3
    #09:04:00.000                   #11:00:04.000
     data 4                          data 4
    #09:05:00.000                   #11:00:05.000
     data 5                          data 5
    #09:06:00.000                 | #11:00:06.000
     data 6                       |  foo 6
    #09:07:00.000                 | #11:00:07.000
     data 7                          data 7
    #09:08:00.000                   #11:00:08.000
     data 8                          data 8
    #09:09:00.000                   #11:00:09.000
     data 9                          data 9
    #09:01:00.000                   #11:00:01.000
     data 10                         data 10
    

    sed

    如果您的sed 实现不支持-r 选项,您可能需要计算&lt;(sed 's/^\(............\)/#\1\n/' 1.log) 的十二个点或使用您选择的其他模式;)

    【讨论】:

    • 感谢您的巧妙解决方案,这节省了我在 awk 中尝试执行此操作的时间(我可能需要切换到 perl 以保持理智)。
    • 是的!这是一个很好的解决方案!这个问题提出了一些规律,meld 是少数可以做到这一点的工具之一,并且很棒 有一个仅使用标准工具的命令行解决方案!
    【解决方案4】:

    对于图形选项,Meld 可以使用其text filters 功能来完成此操作。

    它允许忽略基于一个或多个 python 正则表达式的行。差异仍然存在,但没有任何其他差异的行不会突出显示。

    【讨论】:

      【解决方案5】:

      使用 Kdiff3 并在 Configure>Diff 中将“Line-Matching Preprocessor command”编辑为:

      sed "s/[ 012][0-9]:[0-5][0-9]:[0-5][0-9]//"

      这将从比较对齐算法中过滤掉时间戳。

      Kdiff3 还可以让你manually align specific lines

      【讨论】:

      • 这些文件在每一行上仍然被标记为不同,但它允许我使用命令 Go to Next / Previous Delta 搜索真正的差异。
      • 直接从命令行执行:kdiff3 --cs LineMatchingPreProcessorCmd="sed \"s/[ 012][0-9]:[0-5][0-9]:[0-5][0-9]//\"" "/path/to/file 1.txt" "/path/to/file 2.txt"
      猜你喜欢
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      相关资源
      最近更新 更多