一种简单的方法来区分日志文件,忽略时间戳?

An easy way to diff log files, ignoring the time stamps?

提问人:Teflon Ted 提问时间:9/4/2008 最后编辑:lillqTeflon Ted 更新时间:8/11/2022 访问量:26306

问:

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

解析 shell diff compare logging

评论


答:

26赞 Blair Conrad 9/4/2008 #1

@EbGreen 他说

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

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

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

请参阅 @toolkit 的回复,了解优化,使它成为单行代码并避免了对额外文件的需求。如果你的 shell 支持它。Bash 3.2.39 至少看起来......

评论

0赞 Brian B 10/18/2013
如果某人的时间戳也有 ISO 格式的日期,请使用 -b25-
56赞 toolkit 9/4/2008 #2

根据您使用的外壳,您可以将建议的方法@Blair转换为 1 行

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

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

评论

2赞 Noel Yap 1/15/2013
如果想在输出中保留时间戳,但又想忽略时间戳本身的差异,有什么建议吗?stackoverflow.com/questions/14326476/......
0赞 d-b 6/12/2023
当我使用它来区分两个目录中的文件时,输出中会省略文件的名称(如果我只是这样做,则包含名称)。为什么?这个问题可以解决吗?diff dir1 dir2
20赞 oHo 11/22/2013 #3

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

diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
  • sed隔离进程替换中的时间戳(之前和之后)#\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)
$>

更改(替换为第 6 行)并再次检查:2.logdatafoo

$> 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

=> 时间戳保留在 diff输出中!

您还可以使用 或 选项使用并排功能:-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

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

评论

2赞 ack 5/5/2015
感谢您的巧妙解决方案,这为我节省了数小时尝试在 awk 中执行此操作的时间(我可能需要切换到 perl 以保持理智)。
0赞 Matt Hellige 9/18/2019
是的!这是一个很好的解决方案!这个问题有一些规律性,meld 是为数不多的可以做到这一点的工具之一,并且仅使用标准工具的命令行解决方案真是太好了
16赞 Dave Andersen 6/3/2015 #4

对于图形选项,Meld 可以使用其文本过滤器功能来做到这一点。

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

Example configuration

3赞 Pedro Reis 10/19/2015 #5

使用 Kdiff3 并在 Configure>Diff 中将“行匹配预处理器命令”编辑为类似以下内容:

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

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

Kdiff3 还允许您手动对齐特定线条。

评论

1赞 Melebius 4/24/2017
文件在每一行上仍然标记为不同,但它允许我使用命令“转到下一个/上一个增量”搜索真正的差异。
0赞 Colin 6/4/2019
要直接从命令行执行此操作: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"
1赞 vlad2135 8/11/2022 #6

我想为 Visual Studio Code 提出一个解决方案:

  1. 安装此扩展 - https://marketplace.visualstudio.com/items?itemName=ryu1kn.partial-diff
  2. 像这样配置 - https://github.com/ryu1kn/vscode-partial-diff/issues/49#issuecomment-608299085
  3. 运行扩展命令“切换比较前文本规范化规则”并启用在步骤#2中添加的规则
  4. 使用扩展(这是对它的 UI 怪癖的解释 - https://github.com/ryu1kn/vscode-partial-diff/issues/11)

评论

1赞 sls 8/24/2023
不错的扩展!遗憾的是,显示的差异显示规范化文本(规范化规则执行的替换结果),而不是显示原始文本(并且仅忽略其中的一部分以生成差异突出显示)。相比之下,Meld 的文本过滤器仅适用于生成差异。