在awk语句中计数器

时间:2019-01-03 14:11:05

标签: shell unix awk

我正在尝试获取文件中出现的文本数。为此,我使用了以下命令:

grep FAIL $sPath/FTM.FC*$yesterday* |awk -F ":" '{print $7}' | awk '{print $1}' |awk '{if ($1 == "userNotReachable"){cnt++;} ;{print cnt}  };'

第一部分:

 grep FAIL $sPath/FTM.FC*$yesterday* |awk -F ":" '{print $7}' | awk '{print $1}'

我正在过滤输出以仅获得一列。.然后检查该列是否等于搜索的文本“ userNotReachable ”。如果为true,则增加计数器,稍后我想将计数器的值打印到文本文件中

这是示例源文件内容,它是错误日志:

2019-01-03 19:29:59.923 FAIL RETRY: Failed for request id: 14899507 Cause: userNotReachable Info: <undef> Code: 27,USSD RequestId=14899507 OriginalId=14899507 EventCorrelationId="1211005491|245065451||1546527554000" CreationTime="20190103192959" ResendCount=0 Timestamp=1546527599482 (Thu Jan 03 19:29:59 AFT 2019) State=STATE_SENT SubscriberNumber=708023643 UssdText=Last event was charged 0.04 MB from 1GB Monthly, Remaining data 421.95 MB (Exp 12.01.2019)1500 AFS = 32GB valid 30 Days, Dial *477*32*1#. NumberingPlan=1 Nadi=4 UssdFormat=2

我想统计几种错误原因,例如:

userNotReachable
unknown
equipmentFailure
timeout
userBusy
userNotReachable
userUnavailable 

并将每个错误的计数打印到文本文件中

1 个答案:

答案 0 :(得分:2)

您似乎在这里进行了大量的管道布置。您可以只用一个awk来做到这一点:

sed 's/.*value="\([^"]*\)".*/\1\n/g'

更新后,您可能需要执行以下操作:

awk -F ":" '/FAIL/ && ($6 ~ / *userNotReachable /) {c++}END{print c}' $sPath/FTM.FC*$yesterday*