깨끗한 텍스트 파일을 사용하려고 합니다 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" 두 줄을 각각 읽고 인쇄하세요.