sed에서 일치하는 항목이 발견되면 두 줄을 건너뜁니다.

sed에서 일치하는 항목이 발견되면 두 줄을 건너뜁니다.

깨끗한 텍스트 파일을 사용하려고 합니다 sed.

ping을 실행하고 텍스트 파일로 출력하는 프로그램이 있습니다. 프로그램에서 ping 출력 뒤에 타임스탬프를 추가하여 언제 실패하는지 알 수 있습니다.

ping 실패와 아래 두 줄, 위 줄을 제외한 모든 항목을 삭제해야 합니다. 제 표현에 맞다 면 sed다음 두 줄을 건너뛸 수 있는 방법이 없을까요 ?

예:

--- 8.8.8.8 ping statistics ---
rtt min/avg/max/mdev = 18.001/21.159/26.006/2.959 ms
Tue 26 Nov 09:39:56 GMT 2019


--- 4.2.2.2 ping statistics ---
10 packets transmitted, 9 received, 10% packet loss, time 18034ms
rtt min/avg/max/mdev = 20.560/34.013/70.076/17.428 ms
Tue 26 Nov 09:40:46 GMT 2019

--- 8.8.8.8 ping statistics ---
rtt min/avg/max/mdev = 17.510/20.543/26.618/2.317 ms
Tue 26 Nov 09:41:04 GMT 2019

다음을 사용하는 경우: sed '/loss/!d' pingFailed.txt > pingFailed1.txt

그러면 내 출력은 다음과 같습니다.

10 packets transmitted, 4 received, 60% packet loss, time 18103ms
10 packets transmitted, 3 received, 70% packet loss, time 18107ms

하지만 출력이 다음과 같아야 합니다.

--- 4.2.2.2 ping statistics ---
10 packets transmitted, 9 received, 10% packet loss, time 18034ms
rtt min/avg/max/mdev = 20.560/34.013/70.076/17.428 ms
Tue 26 Nov 09:40:46 GMT 2019

이 작업을 어떻게 수행할 수 있습니까(바람직하게는 에서 sed)?

답변1

이 방법이 귀하에게 적합한지 알려주세요.

grep -B1 -A2 "loss" pingFailed.txt > pingFailed1.txt

산출:

--- 4.2.2.2 ping statistics ---
10 packets transmitted, 9 received, 10% packet loss, time 18034ms
rtt min/avg/max/mdev = 20.560/34.013/70.076/17.428 ms
Tue 26 Nov 09:40:46 GMT 2019

"손실" 패턴이 있는 행을 찾습니다.

grep "loss"

한 줄을 인쇄하다두번째전에:

-B1

두 줄을 인쇄하다후에:

-A2

답변2

이 작업을 수행할 수 있어야 합니다 sed.

sed -n '/loss/ { x; G; N; N; p; s/.*// }; x' pingFailed.txt > pingFailed1.txt

설명하다:

  • -n: 아무것도 자동으로 인쇄하지 않습니다. 있는 경우에만 인쇄합니다.인쇄 명령.
  • /loss/ { … }: " " 가 포함된 라인 이 보일 때 중괄호 안 의 명령 을 실행 합니다 loss.
  • x: 패턴 공간을 바꾸고 공간을 유지합니다. 패턴 공간에는 방금 읽은 줄이 포함되어 있습니다. 스포일러 경고: 이전 줄을 포함하기 위해 공간이 예약되어 있습니다. 이 명령을 실행한 후 패턴 공간에는 이전 라인이 포함되고 예약된 공간에는 현재 라인이 포함됩니다.
  • G: 예약된 공간의 내용을 가져와 패턴 공간에 추가합니다(그 사이에 줄 바꿈 삽입). 이 명령 다음에는 패턴 공간에 이전 라인과 현재 라인(즉, 이 loss라인과 그 이전 라인)이 포함됩니다.
  • N: 입력에서 다른 줄을 읽고 이를 패턴 공간에 추가합니다(그 사이에 줄 바꿈 삽입).
  • p: 패턴 공간을 인쇄합니다. 이때 패턴 공간에는 한  loss줄, 그 앞 줄, 그 뒤 두 줄이 포함됩니다.
  • s/.*//: 패턴 공간을 지웁니다.
  • x: 패턴 공간을 바꾸고 공간을 유지합니다. 이 명령 은 loss일치 여부에 관계없이 실행됩니다.
    • 일치하는 항목이 있으면 ... 중괄호 (위에 나열된) loss안의 모든 명령을 실행하므로 패턴 공간이 비어 있습니다. 따라서 예약된 공간이 공백으로 설정됩니다. (이건 확실하지 않아요{}진짜꼭 필요한 일이지만 아마도 좋은 생각일 것입니다. )
    • 일치하는 항목이 없으면 loss패턴 공간에 현재 줄이 포함되므로 현재 줄이 예약된 공간에 배치됩니다.

내가 아는 한, 입력이 설명대로라면 완벽하게 작동합니다.

  • 입력의 첫 번째 줄에 가 포함되어 있으면 loss빈 줄과 입력의 처음 세 줄(즉, 해당 loss줄과 그 뒤의 두 줄)이 인쇄됩니다.
  • 입력의 마지막 줄이나 두 번째 줄에 가 포함되어 있으면 loss해당 줄 뒤에 두 줄이 없기 때문에 인쇄되지 않습니다. 파일 끝에 도달하면 명령 시퀀스가 ​​중단되기 loss때문입니다 . 해당 행, 그 앞의 행, 그 뒤의 (단일) 행(있는 경우)을 인쇄하여 이 상황을 처리하려면 다음을 수행하십시오 sed.loss

    sed -n '/loss/ { x; G; p; n; p; n; p; s/.*// }; x' pingFailed.txt > pingFailed1.txt
    

    "after" 두 줄을 각각 읽고 인쇄하세요.

관련 정보