sed를 사용하여 출력 정렬

sed를 사용하여 출력 정렬

실행 후 다음과 같은 결과가 출력됩니다 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부터 시작하는 배열 번호)에서 호스트 이름을 제외한 모든 항목이 제거됩니다.

관련 정보