관심 있는 다른 패턴 바로 앞 줄의 패턴을 바꿉니다.

관심 있는 다른 패턴 바로 앞 줄의 패턴을 바꿉니다.

다음과 같은 명령문의 인스턴스가 많이 포함된 로그 파일이 있습니다.

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이는 일반 한 줄 버퍼를 두 줄 버퍼로 확장합니다. 마지막 줄을 제외한 각 줄에서 다음 입력 줄을 패턴 공간에 추가합니다. 두 줄 버퍼가 문자열로 끝나면 ###첫 번째 문자열 IDLEEND. 그런 다음 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

관련 정보