我需要比较两个日志文件,但忽略的时间标记的一部分,每个线(第12字符的确切).是否有一个良好工具,或者一个聪明的awk命令,这可能帮帮我吗?

有帮助吗?

解决方案

根据壳使用的,你可以变的方法 @布莱尔 建议成1-衬

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

(+1 @布莱尔 对于原来的建议:-)

其他提示

@EbGreen说

我只是采取日志文件和条的时间戳断开始的每一个线然后将文件保存了不同的文件。然后比较这些文件。

这可能是最好的赌注,除非你比较工具具有的特殊权力。例如,你可以

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

看见@工具包的反应对于优化,使得这一个衬垫,并避免造成需要额外的文件。如果你的贝壳支持它。Bash3.2.39至少似乎...

答案使用 cut 是好的,但有时候保持时间戳内 diff 产出是相当明显。作为运的问题是关于 忽略的时间邮票 (不删除),我在这里分享我的棘手的命令行:

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

改变 2.log (替换 data 通过 foo 在第6行),并再次检查:

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

如果你的 sed 执行不支持 -r 选项,可能需要数十二点 <(sed 's/^\(............\)/#\1\n/' 1.log) 或用另一种模式的选择;)

图形的选择, 可以使用它 文本的过滤器 功能。

它允许忽略了的线基于一个或多个python regex.差异仍然会出现,但是线,没有任何其他的差异不会被强调。

Example configuration

使用 Kdiff3 并在 配置>的比较 编辑"线匹配的预处理器的命令"要是这样的:

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

这将筛选出的时间戳从比较准算法。

Kdiff3也可以让你 手动对准特定行.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top