타임스탬프를 무시하고 로그 파일을 비교하는 쉬운 방법은 무엇입니까?

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

문제

두 개의 로그 파일을 비교해야 하지만 각 줄의 타임스탬프 부분(정확히는 처음 12자)을 무시합니다.나에게 도움이 될 수 있는 좋은 도구나 영리한 awk 명령이 있습니까?

도움이 되었습니까?

해결책

사용 중인 쉘에 따라 접근 방식을 바꿀 수 있습니다. @블레어 1 라이너로 제안

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

(+1 ~ @블레어 원래 제안에 대해 :-)

다른 팁

@EbGreen이 말했습니다.

로그 파일을 가져와 각 줄의 시작 부분에서 타임스탬프를 제거한 다음 파일을 다른 파일에 저장합니다.그런 다음 해당 파일을 비교하십시오.

당신의 diffing 도구가 특별한 능력을 가지고 있지 않는 한, 아마도 그것이 최선의 선택일 것입니다.예를 들어 다음과 같이 할 수 있습니다.

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 '^#' 이러한 타임스탬프가 있는 줄을 무시합니다(다음으로 시작하는 줄). #)

내용은 동일하지만 타임스탬프가 다른 두 개의 로그 파일:

$> 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) 또는 원하는 다른 패턴을 사용하세요. ;)

그래픽 옵션의 경우 융합 그것을 사용하여 이것을 할 수 있습니다 텍스트 필터 특징.

하나 이상의 Python 정규식을 기반으로 행을 무시할 수 있습니다.차이점은 여전히 ​​나타나지만 다른 차이점이 없는 줄은 강조 표시되지 않습니다.

Example configuration

사용 Kdiff3 그리고 에 구성>차이 편집하다 "라인 일치 전처리기 명령"는 다음과 같습니다.

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

그러면 비교 정렬 알고리즘에서 타임스탬프가 필터링됩니다.

Kdiff3에서는 또한 다음을 수행할 수 있습니다. 특정 줄을 수동으로 정렬.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top