실행 후 다음과 같은 결과가 출력됩니다 diff
.
< #R1#Number = Gauge32: 258 Name = STRING: "TATA"
---
> #R1#Number = Gauge32: 280 Name = STRING: "TATA"
다음 출력을 얻으려면 쉘 스크립트에서 sed 명령을 구현해야 합니다.
Hostname=R1; old=258 new=280, Name="TATA"
답변1
이 시도:
diff ... | sed -n -e '
/^< / h
/^---/ H
/^> / { H; x; s/\n//g;
s/^< #\([^#][^#]*\)#Number = Gauge32: \([0-9][0-9]*\) .* #\1#Number = Gauge32: \([0-9][0-9]*\) .* Name = STRING: \("[^"]*"\).*/Hostname=\1; old=\2 new=\3, Name=\4/;
p; }'
모든 것을 한 줄에 배치하고 흥미로운 것만 선택하는 것이 아이디어입니다.
상세히:
sed -n
- 기본적으로 아무것도 인쇄하지 않음/^< / h
- 출발선을<
예약된 공간 에 복사하세요./^---/ H
---
- 예약된 공간에 다음으로 시작하는 줄을 추가합니다./^> / { ... }
->
다음으로 시작하는 줄의 경우:H
- 예약된 공간에 행 추가x
- 보유공간과 패턴공간을 교환s/\n//g
- 개행 문자를 제거하면 이제 패턴 공간에 다음 내용이 포함됩니다.< #R1#Number = Gauge32: 258 Name = STRING: "TATA"---> #R1#Number = Gauge32: 280 Name = STRING: "TATA"
s/.../.../
- 형식화된 출력(여기에는 별 내용이 없습니다. 그냥sed
-fu)p
- 인쇄
diff
인접한 행이 변경될 수 있으므로 일반 출력에는 작동하지 않습니다 . 그러나 그것은 당신이 질문한 대로 질문에 대답합니다.
답변2
Perl을 사용해 볼 수도 있습니다.
diff file1 file2 |
perl -lne 'if(/^(.).*?#(.+?)#.*?:\s*(\d+).*(".+?")/){
$1 eq ">" ? print "Hostname=$2; old=$o new=$3, Name=$4" : ( $o=$3 )}'
설명하다
- 각 호출에 개행 문자를 추가하고
-l
지정된 스크립트가 입력 파일의 각 줄에 적용되도록 합니다.print
-n
-e
- 정규식은 첫 번째 문자( ),
^.
사이의 첫 번째 문자열( ), 그 뒤에 0개 이상의 공백과 숫자 집합( ), 줄에서 마지막으로 인용된 문자열( )을 인식합니다. 대괄호를 사용하면 이러한 내용이 저장됩니다.#
#(.+?)#
:
:\s*(\d+)
.*(".+?")
$1
$4
foo ? bar : baz
: 이것은 많은 언어에서 발견되는 C 구문입니다. "foo가 참이면 bar를 하고, 그렇지 않으면 baz를 하십시오."의 약어입니다. 따라서$1
이전 일치 작업으로 저장된 줄의 첫 번째 문자가>
이면 인쇄하고, 그렇지 않으면 일치하는 세 번째 패턴을 로 저장합니다$o
.
또는
diff file1 file2 |
perl -lane '$o = $F[4] if /^</; $F[1]=~s/#(.*)#.*/$1/;
print "Hostname=$F[1]; old=$o new=$F[4], Name=$F[8]" if />/'
설명하다
- 이렇게 하면 Perl이 각 입력 줄을 공백으로 자동 분할하여 배열
-a
에 저장하게 됩니다 .@F
$o = $F[4] if /^</;
: 5번째 필드가$o
해당 줄의 첫 번째 문자인 것처럼 저장됩니다<
.$F[1]=~s/#(.*)#.*/$1/;
: 두 번째 필드($F[1]
0부터 시작하는 배열 번호)에서 호스트 이름을 제외한 모든 항목이 제거됩니다.