unix 调用grep inside awk命令时遇到问题

qacovj5a  于 7个月前  发布在  Unix
关注(0)|答案(1)|浏览(67)

我正在寻找使用awk从日志中提取一些信息,并根据返回的信息,我想grep整个文件,并从gerp和awk写所有输出到一个文件。我能够提取awk形式的一些信息,但同时使用grep awk内我无法提取信息。请找到如下日志。

2014-04-10 13:55:59,837 [WebContainer : 4] [com.cisco.ata.service.AtAService] WARN  - AtAService::AtAServiceRequest DetailMessage - module=ataservice;service=ataservicerequest;APP_ID=CDCSDSATAUser.gen;VIEW_NAME=/EntitlementView[CCOID="frhocevar"]REQUEST_ID_STRING=-105411838, took 100 milliseconds.

字符串
根据REQUEST_ID_STRING,我必须获取usecaseID。

2014-04-10 13:55:59,800 [Thread-66] [com.cisco.ata.cla.CLAManager] INFO  - CLAManager.getAttributeFromCLAMapping() took 6 ms, for useCaseID - UC41, condition= (CCOID=frhocevar), requestID= -105411838


我正在使用awk提取REQUEST_ID_STRING,但无法使用grep提取“useCaseID”。
下面是我使用的命令。

grep -i -r 'AtAService::AtAServiceRequest DetailMessage - module=ataservice;service=ataservicerequest'  /opt/httpd/logs/apps/atasvc/prod1/was70/*/*.log* |
awk 'BEGIN{count=0;}{if($14>1000){print $0}}' |
awk 'BEGIN{ FS=";"} 
{a = substr($3,8)} 
{b = substr($4,index($4,"/")+1,index($4,"]R")-index($4,"/"))} 
{c = substr($4,index($4,"G=")+2,index($4,", took")-index($4,"G=")-2);}
{d = substr($1,0,index($1,":")-1)} 
{e=grep command which will extract usecaseid from $d having file name} 
{ print a","b","c","d","e} '

ttisahbt

ttisahbt1#

这使用了一些基本的“尴尬”,使一些相当不错的样板出发点的很多东西。

AirBoxOmega:~ d$ cat log
2014-04-10 13:55:59,837 [WebContainer : 4] [com.cisco.ata.service.AtAService] WARN - AtAService::AtAServiceRequest DetailMessage - module=ataservice;service=ataservicerequest;APP_ID=CDCSDSATAUser.gen;VIEW_NAME=/EntitlementView[CCOID="frhocevar"]REQUEST_ID_STRING=-105411838, took 100 milliseconds.
2014-04-10 13:55:59,800 [Thread-66] [com.cisco.ata.cla.CLAManager] INFO - CLAManager.getAttributeFromCLAMapping() took 6 ms, for useCaseID - UC41, condition= (CCOID=frhocevar), requestID= -105411838
AirBoxOmega:~ d$ cat stackHelp.awk

     {
        if ($0 ~ /AtAService::AtAServiceRequest DetailMessage/ && $(NF - 1) > 99) {
            split($0, tmp, "[-,]")
            slow[tmp[7]]++
    }
        if (slow[substr($NF,2)]) {
            split($0, tmp, "[-,]")
            print $NF tmp[8]
    }
}

AirBoxOmega:~ d$ gawk -f stackHelp.awk log
-105411838 UC41

字符串
这使用了一个非常基本的awk概念,如果您知道日志行中有一些公共的东西,(sessionID,或类似的东西),您可以根据某些条件创建一个数组(在本例中,日志行包含给定的字符串,并且倒数第二列> 99)。然后,当您遇到相同的sessionID时,您可以检查是否存在数组,如果是的话,再找出更多的信息
你可能需要/想在第二个if语句中添加一些东西,这样它就只检查你关心的日志行了,但老实说,awk太快了,这可能没什么关系。(我使用gawk [via brew]是因为OSX附带的awk版本有点不足,但这段代码足够基本,awk或gawk应该可以工作。)
如果您需要更好的代码解释,我将尝试更好地解释。
忍者编辑:一些退出提示:

  • 不要使用grep -i,除非你真的不知道你要找的大小写。大小写不敏感会让你的搜索慢很多
  • 如果你不使用任何类型的正则表达式,使用fgrep代替grep。它开箱即用要快得多。

相关问题