タイムスタンプを無視してログファイルを比較する簡単な方法はありますか?

StackOverflow https://stackoverflow.com/questions/44019

質問

2 つのログ ファイルの差分を比較する必要がありますが、各行のタイムスタンプ部分 (正確には最初の 12 文字) は無視します。私を助けてくれる良いツールや賢い awk コマンドはありますか?

役に立ちましたか?

解決

使用しているシェルに応じて、アプローチを変えることができます @ブレア ワンライナーで提案

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

(+1 に @ブレア 元の提案について:-)

他のヒント

@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 タイムスタンプを分離します (# 前と \n 後)以内に プロセスの置換
  • diff -I '^#' これらのタイムスタンプを持つ行 (で始まる行) は無視されます。 #)

同じ内容だがタイムスタンプが異なる 2 つのログ ファイル:

$> 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 オプションで、12 個の点を数える必要があるかもしれません <(sed 's/^\(............\)/#\1\n/' 1.log) または、選択した別のパターンを使用します ;)

グラフィックオプションの場合は、 メルド それを使用してこれを行うことができます テキストフィルター 特徴。

1 つ以上の Python 正規表現に基づいて行を無視することができます。違いは引き続き表示されますが、他に違いがない行は強調表示されません。

Example configuration

使用 Kdiff3 そしてで 「設定」>「差分」 編集 "ライン マッチング プリプロセッサ コマンド" のようなものに:

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

これにより、比較調整アルゴリズムからタイムスタンプが除外されます。

Kdiff3 では次のこともできます 特定の行を手動で揃える.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top