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

Tef*_*Ted 38 shell diff logging parsing compare

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

too*_*kit 43

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

diff <(cut -b13- file1) <(cut -b13- file2)
Run Code Online (Sandbox Code Playgroud)

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

  • 如果有人想在输出中保留时间戳但又想忽略时间戳本身的差异,有什么建议吗?http://stackoverflow.com/questions/14326476/how-to-diff-parts-of-lines#comment19909398_14326476 (2认同)

Bla*_*rad 19

@EbGreen说

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

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

cut -b13- file1 > trimmed_file1
cut -b13- file2 > trimmed_file2
diff trimmed_file1 trimmed_file2
Run Code Online (Sandbox Code Playgroud)

请参阅@ toolkit的响应以获得优化,使其成为一个单行并且不需要额外的文件.如果你的shell支持它.Bash 3.2.39至少似乎......


oli*_*bre 11

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

diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
Run Code Online (Sandbox Code Playgroud)
  • 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
Run Code Online (Sandbox Code Playgroud)

基本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
Run Code Online (Sandbox Code Playgroud)

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

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

更改2.log(更换datafoo六号线),并再次检查:

$> 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
Run Code Online (Sandbox Code Playgroud)

=>时间戳保留在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
Run Code Online (Sandbox Code Playgroud)

sed

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

  • 感谢您的巧妙解决方案,这为我节省了尝试以awk方式进行操作的时间(而且我可能需要切换到perl来保持理智)。 (2认同)

Dav*_*sen 6

对于图形选项,Meld可以使用其文本过滤器功能来实现。

它允许忽略基于一个或多个python regex的行。差异仍然会出现,但是没有其他差异的行将不会突出显示。

配置示例