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

Parsing 一种简单的区分日志文件的方法,忽略时间戳?,parsing,shell,diff,compare,logging,Parsing,Shell,Diff,Compare,Logging,我需要区分两个日志文件,但忽略每行的时间戳部分(准确地说是前12个字符)。EbGreen说:“有没有一个好的工具,或者一个聪明的awk命令可以帮助我?” 我只需要获取日志文件,去掉每行开头的时间戳,然后将文件保存到不同的文件中。然后区分这些文件 这可能是最好的选择,除非你的微分工具有特殊的能力。 例如,你可以 cut -b13- file1 > trimmed_file1 cut -b13- file2 > trimmed_file2 diff trimmed_file1 trimm

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

我只需要获取日志文件,去掉每行开头的时间戳,然后将文件保存到不同的文件中。然后区分这些文件

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

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

请参阅@toolkit的响应,以获得一个优化,该优化使其成为一行程序,并消除了对额外文件的需要。如果您的shell支持它。Bash 3.2.39至少看起来…

根据您使用的shell,您可以将建议的方法转换为一行程序

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

diff使用
cut
的答案很好,但有时将时间戳保持在
diff
输出范围内是值得注意的。由于OP的问题是关于忽略时间戳(而不是删除时间戳),我在这里分享我棘手的命令行:

diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 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
更改
2.记录
(将
数据
替换为第6行的
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

旧的
sed
如果您的
sed
实现不支持
-r
选项,您可能需要为图形选项计算12个点
,您可以使用其功能完成此操作

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


使用Kdiff3并在配置>差异中编辑“行匹配预处理器命令”,如下所示:

sed“s/[012][0-9]:[0-5][0-9]:[0-5][0-9]/”

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


Kdiff3还允许您。

如果希望在输出中保留时间戳,但希望忽略时间戳本身的差异,有什么建议吗?如果某人的时间戳也有ISO格式的日期,那么使用-b25谢谢你的巧妙解决方案,这节省了我在awk中尝试这样做的时间(我可能需要切换到perl以保持理智)。是的!这是一个伟大的解决方案!这个问题有一定的规律性,meld是为数不多的能够做到这一点的工具之一,并且拥有一个只使用标准工具的命令行解决方案非常好!文件在每一行上仍然被标记为不同,但它允许我使用命令Go to Next/Previous Delta来搜索真正的差异。并且直接从命令行执行此操作:
kdiff3--cs LineMatchingPreProcessorCmd=“sed\”s/[012][0-9]:[0-5][0-9]/\”“/path/to/file 1.txt”“/path/to/file 2.txt”
$> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
$>
$> 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 -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