쉘 스크립트의 grep 명령

쉘 스크립트의 grep 명령

로그 파일이 있고 파일의 여러 줄에 걸쳐 여러 문자열을 찾는 셸 스크립트를 작성하려고 합니다.

예를 들어 로그에 and 라는 문구가 있으면 "class=com.comcast.parker.GetCurrentAudioLanguageResponse"else를 인쇄해야 합니다. 내 쉘 스크립트는 다음과 같습니다."status:OK"getAudioLanguage SUCCESSFULgetAudioLanguage FAILED

logfile=$1

if grep "{\"class\":\"com.comcast.parker.GetCurrentAudioLanguageResponse\"" jags.txt | grep "{\"status\":\"OK\"" | wc -l ; then
    echo "getAudioLanguage SUCCESSFUL"
fi
if grep "{\"class\":\"com.comcast.parker.GetCurrentAudioLanguageResponse\"" $logfile | grep -q "GENERAL_ERROR" | wc -l ; then
    echo "getAudioLanguage FAILED"
fi

로그에는 GENERAL_ERROR인쇄해야 하는 상태가 표시되지만 FAILED출력은 ..로 표시됩니다 getAudioLanguage SUCCESSFUL.

로그 파일:

160125-11:11:28.442500 [mod=SYS, lvl=INFO] [tid=2332] ======= Message is onRPCCall ======>
160125-11:11:28.442614 [mod=SYS, lvl=INFO] [tid=2332] Entering onRPCCallEvent for request ---> getAudioLanguage
160125-11:11:28.442845 [mod=SYS, lvl=INFO] [tid=2332] Received json request = {"event":1,"handler":1,"name":"onRPCCall","params":{"callGUID":"d75a5bab-6b29-4ab4-9f7e-3cf32d4a05b1","callParams":[{"getAudioLanguage":{}}],"class":"com.comcast.xre.events.XRERPCCallInfo","destinationSessionGUID":"ab00ebea-5f63-4619-9877-273a2bceea1d","method":"getAudioLanguage","sourceSessionGUID":"ab00ebea-5f63-4619-9877-273a2bceea1d"},"phase":"STANDARD","source":1}

160125-11:11:28.442920 [mod=SYS, lvl=INFO] [tid=2332] GetCurrentAudioLanguage : Entered
160125-11:11:28.442968 [mod=SYS, lvl=INFO] [tid=2332] pMainPlayer is NULL.
160125-11:11:28.443012 [mod=SYS, lvl=INFO] [tid=2332] getAudioLanguage: Get Audio Language returned ��v`>       T�=     T0~�t
160125-11:11:28.443676 [mod=SYS, lvl=INFO] [tid=2332] ====== Response sending is {"appId":1,"command":"CALL","commandIndex":5,"method":"generateAppEvent","params":[{"class":"com.comcast.xre.events.XREOutgoingEvent","name":"onRPCReturn","params":{"callGUID":"d75a5bab-6b29-4ab4-9f7e-3cf32d4a05b1","class":"com.comcast.xre.events.XRERPCReturnInfo","destinationSessionGUID":"ab00ebea-5f63-4619-9877-273a2bceea1d","method":"getAudioLanguage","returnVal":{"class":"com.comcast.parker.GetCurrentAudioLanguageResponse","status":"GENERAL_ERROR","statusMessage":"Getting Current Audio Language was unsuccessful."},"sourceSessionGUID":"ab00ebea-5f63-4619-9877-273a2bceea1d"}},"ab00ebea-5f63-4619-9877-273a2bceea1d"],"targetId":1,"targetPath":"","timestamp":0}

답변1

AWK를 사용하는 것이 더 쉬울 수 있습니다.

awk '/GetCurrentAudioLanguageResponse/ && /status\"\:\"GENERAL_ERROR/{ print "FAIL" } /GetCurrentAudioLanguageResponse/ && /status\":\"OK/ {print "SUCCESS"}  ' log.txt

이 코드에서는 두 패턴을 일치시키고 패턴이 일치하면 중괄호 안에 있는 내용을 실행합니다. 의 경우 GetCurrentAudioLanguageResponse" status":"GENERAL_ERROR실패"를 인쇄하고 모드의 경우 "성공"을 인쇄합니다 GetCurrentAudioLanguageResponse.status\":\"OK

답변2

grep 명령의 반환 상태를 확인해야 합니다. 예를 들어, 내 파일에 --

  a.b.c.d status:FAILED

명령 실행

  [[ $(grep "a.b.c.d" log | grep "FAIL") ]] && echo  "FAILED"

 FAILED

답변3

나는 당신에게 기꺼이 제공할 의향이 있습니다sed로그 파일을 구문 분석합니다.

sed -n '
/{"class":"com.comcast.parker.GetCurrentAudioLanguageResponse"/{
    /"GENERAL_ERROR"/{
        c\getAudioLanguage FAILED
        p
        q
    }
    /"status":"OK"/{
        c\getAudioLanguage SUCCESSFUL
        h
    }
}
${
g
/SUCCESSFUL/p
}
' logfile

관련 정보