2 つのログ ファイルを比較する必要がありますが、各行のタイム スタンプ部分 (正確には最初の 12 文字) は無視します。私を助けることができる良いツール、または賢い awk コマンドはありますか?
5 に答える
@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)
$>
変更( 6 行目の で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
は、12 個のドットを数える<(sed 's/^\(............\)/#\1\n/' 1.log)
か、選択した別のパターンを使用する必要があるかもしれません ;)
グラフィカル オプションの場合、Meldはテキスト フィルター機能を使用してこれを行うことができます。
1 つ以上の python 正規表現に基づく行を無視できます。相違点は引き続き表示されますが、他に相違点がない行は強調表示されません。