【发布时间】:2010-09-07 19:48:25
【问题描述】:
我需要区分两个日志文件,但忽略每行的时间戳部分(准确地说是前 12 个字符)。有什么好的工具,或者聪明的 awk 命令可以帮助我吗?
【问题讨论】:
标签: parsing shell diff compare logging
我需要区分两个日志文件,但忽略每行的时间戳部分(准确地说是前 12 个字符)。有什么好的工具,或者聪明的 awk 命令可以帮助我吗?
【问题讨论】:
标签: parsing shell diff compare logging
【讨论】:
@EbGreen 说
我只会获取日志文件并从每行的开头剥离时间戳,然后将文件保存到不同的文件中。然后比较这些文件。
这可能是最好的选择,除非您的差异工具具有特殊能力。 例如,你可以
cut -b13- file1 > trimmed_file1
cut -b13- file2 > trimmed_file2
diff trimmed_file1 trimmed_file2
请参阅@toolkit 的回复,了解一种优化,使其成为单线并消除对额外文件的需求。如果您的外壳支持它。 Bash 3.2.39 至少似乎...
【讨论】:
使用cut 的答案很好,但有时将时间戳保持在diff 输出中是可观的。由于 OP 的问题是关于忽略时间戳(不删除它们),我在这里分享我棘手的命令行:
diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
sed 在process 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 选项,您可能需要计算<(sed 's/^\(............\)/#\1\n/' 1.log) 的十二个点或使用您选择的其他模式;)
【讨论】:
【讨论】:
使用 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。
【讨论】:
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"