Jagannath Das
Jagannath Das

Reputation: 25

Need some help on shell scipt (using grep command)

I have a log file and I am trying to write a shell script to find multiple strings in a file on multiple lines.

For example if I see the phrases "class=com.comcast.parker.GetCurrentAudioLanguageResponse" and "status:OK" together in the logs, I should print getAudioLanguage SUCCESSFUL else getAudioLanguage FAILED. So my shell script goes like this:

Scriptfile:

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

In the logs, I get status as GENERAL_ERROR, so it should print FAILED, but the output shows as getAudioLanguage SUCCESSFUL ..

Any help regarding this?

Logfile:

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}

Upvotes: 0

Views: 68

Answers (2)

Tom Fenech
Tom Fenech

Reputation: 74695

Assuming that your search patterns are written correctly, then you could use something like this:

if grep pattern_one file | grep -q pattern_two; then
    echo "getAudioLanguage SUCCESSFUL"
fi

This filters the output on the first pattern and uses grep -q, whose exit status indicates whether the second pattern also matches.

That said, it kinda looks like you're attempting to parse JSON. It'd be better to use something like jq for this if possible.

Upvotes: 1

anubhava
anubhava

Reputation: 786011

Rather than multiple grep you can use a single awk to do this:

awk '/{"class":"com\.comcast\.parker\.GetCurrentAudioLanguageResponse"/{
   exit ($0 !~ /"status":"GENERAL_ERROR"/)}' file && echo "getAudioLanguage FAILED"

awk '/{"class":"com\.comcast\.parker\.GetCurrentAudioLanguageResponse"/{
   exit ($0 !~ /"status":"OK"/)}' file && echo "getAudioLanguage SUCCESSFUL"

Upvotes: 0

Related Questions