Need some help on shell scipt (using grep command)

2019-09-11 06:47发布

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}

标签: linux shell sh
2条回答
\"骚年 ilove
2楼-- · 2019-09-11 07:18

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"
查看更多
手持菜刀,她持情操
3楼-- · 2019-09-11 07:22

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.

查看更多
登录 后发表回答