다음과 같은 명령문의 인스턴스가 많이 포함된 로그 파일이 있습니다.
14 Aug 19 16:30:11.506: <DATA> |POS|IDLE|1|01131844090|5950|$hostIp|$size |$data
20 Aug 19 16:30:12.439: <DATA> |POS|IDLE|1|01131844090|5950|$hostIp|$size |$data
21 ###############################################################################
IDLE
아까 #########..
말씀드린 내용을 대체 END
하고 다른 상황을 유지하고 싶습니다 IDLE
.
어떻게 구현할 수 있나요?
편집: 실제 파일과 다를 수도 있습니다. 이 질문에 대한 대답은 목표에 미치지 못합니다. 자세한 발췌 내용과 요구 사항은 다음과 같습니다.
22 Aug 19 16:47:33.159: <DATA> |POS|RINGING|1|1126710938|5950|$hostIp|$size |$data
23 Aug 19 16:47:33.453: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
24 Aug 19 16:47:33.484: <DATA> |POS|TRAINING|1|1126710938|5950|$hostIp|$size |$data
25 Aug 19 16:48:05.824: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
26 Aug 19 16:48:05.916: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
27 Aug 19 16:48:05.947: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
28 Aug 19 16:48:23.792: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
29 Aug 19 16:48:23.853: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
30 Aug 19 16:48:23.884: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
31 ##############################################################################
위 인스턴스에서 작업을 수행한 후 결과는 다음과 같아야 합니다. ( IDLE
이전 ####
행은 으로 변경됩니다 END
. 이러한 유형의 이벤트 인스턴스가 많이 있다는 점에 유의하십시오. 실제로 필요한 것은 RINGING
두 인스턴스 사이의 시간 차이를 찾는 것입니다.IDLE - aka END)
22 Aug 19 16:47:33.159: <DATA> |POS|RINGING|1|1126710938|5950|$hostIp|$size |$data
23 Aug 19 16:47:33.453: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
24 Aug 19 16:47:33.484: <DATA> |POS|TRAINING|1|1126710938|5950|$hostIp|$size |$data
25 Aug 19 16:48:05.824: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
26 Aug 19 16:48:05.916: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
27 Aug 19 16:48:05.947: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
28 Aug 19 16:48:23.792: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
29 Aug 19 16:48:23.853: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
30 Aug 19 16:48:23.884: <DATA> |POS|END|1|1126710938|5950|$hostIp|$size |$data
31 ##############################################################################
답변1
고쳐 쓰다: ex
명령 모드는 일치하는 첫 번째 줄에만 유효합니다. Perl 예제에서는 모든 행을 패턴으로 바꾸지만 원본 파일을 편집하지 않고 출력만 제공하므로 출력을 새 파일로 리디렉션해야 합니다. YOUR-LOGFILE은 수정하려는 파일의 위치로 대체되어야 합니다.
perl -0pe 's/IDLE(.*\n.*###)/END\1/g' 로그 파일 > 새 파일
그러면 패턴이 포함된 줄 위의 줄이 바뀌고 종료됩니다.
ex -s +'/######/-1 s/idle/end/ x' 로그 파일
답변2
노력하다:
$ awk '!/^#+$/ {print l; l=$0; next} {gsub("IDLE","END",l); print l; l=$0} END {print $0}' < log.txt
이것은 만든다:
Aug 19 16:30:11.506: <DATA> |POS|IDLE|1|01131844090|5950|$hostIp|$size |$data
Aug 19 16:30:12.439: <DATA> |POS|END|1|01131844090|5950|$hostIp|$size |$data
###############################################################################
답변3
sed '$!N;/###$/s/IDLE/END/;P;D
' <<\DATA
22 Aug 19 16:47:33.159: <DATA> |POS|RINGING|1|1126710938|5950|$hostIp|$size |$data
23 Aug 19 16:47:33.453: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
24 Aug 19 16:47:33.484: <DATA> |POS|TRAINING|1|1126710938|5950|$hostIp|$size |$data
25 Aug 19 16:48:05.824: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
26 Aug 19 16:48:05.916: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
27 Aug 19 16:48:05.947: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
28 Aug 19 16:48:23.792: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
29 Aug 19 16:48:23.853: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
30 Aug 19 16:48:23.884: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
31 ##############################################################################
DATA
sed
이는 일반 한 줄 버퍼를 두 줄 버퍼로 확장합니다. 마지막 줄을 제외한 각 줄에서 다음 입력 줄을 패턴 공간에 추가합니다. 두 줄 버퍼가 문자열로 끝나면 ###
첫 번째 문자열 IDLE
이 END
. 그런 다음 P
버퍼에서 처음으로 나타나는 개행 문자를 인쇄하고 D
나머지 부분으로 다시 시작하기 전에 동일한 내용을 제거합니다. 이것은 문제에 대한 매우 간단하고 휴대 가능하며 매우 빠른 솔루션입니다.
산출
22 Aug 19 16:47:33.159: <DATA> |POS|RINGING|1|1126710938|5950|$hostIp|$size |$data
23 Aug 19 16:47:33.453: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
24 Aug 19 16:47:33.484: <DATA> |POS|TRAINING|1|1126710938|5950|$hostIp|$size |$data
25 Aug 19 16:48:05.824: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
26 Aug 19 16:48:05.916: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
27 Aug 19 16:48:05.947: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
28 Aug 19 16:48:23.792: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
29 Aug 19 16:48:23.853: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
30 Aug 19 16:48:23.884: <DATA> |POS|END|1|1126710938|5950|$hostIp|$size |$data
31 ##############################################################################
파일을 그 자리에서 편집하려면 다음을 수행할 수 있습니다.
sed '$!N;/###$/s/IDLE/END/;P;D
' <<FILE >file
$(cat file)
FILE
또는 GNU를 사용하면 sed
최소한 다음과 같이 할 수 있습니다.
sed -i '$!N;/###$/s/IDLE/END/;P;D' file