我需要区分两个日志文件,但忽略每行的时间戳部分(前12个字符是准确的).是否有一个好的工具,或一个聪明的awk命令,可以帮助我?
根据您使用的外壳,您可以将@Blair建议的方法转换为1-liner
diff <(cut -b13- file1) <(cut -b13- file2)
(+1给@Blair原始建议:-)
@EbGreen说
我只需要获取日志文件并从每行的开头删除时间戳,然后将文件保存到不同的文件中.然后区分这些文件.
这可能是最好的选择,除非您的差异工具具有特殊的权力.例如,你可以
cut -b13- file1 > trimmed_file1 cut -b13- file2 > trimmed_file2 diff trimmed_file1 trimmed_file2
请参阅@ toolkit的响应以获得优化,使其成为一个单行并且不需要额外的文件.如果你的shell支持它.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
隔离进程替换中的时间戳(#
之前和\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
六号线),并再次检查:
$> 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)
或使用您选择的其他模式;)
对于图形选项,Meld可以使用其文本过滤器功能来实现。
它允许忽略基于一个或多个python regex的行。差异仍然会出现,但是没有其他差异的行将不会突出显示。