Unix 在awk命令内调用grep时遇到问题

Unix 在awk命令内调用grep时遇到问题,unix,awk,grep,Unix,Awk,Grep,我正在寻找使用awk从日志中提取一些信息,根据返回的信息,我希望对整个文件进行grep,并将gerp和awk的所有输出写入一个文件。我能够从awk中提取一些信息,但在awk中使用grep时,我无法提取信息。请查找以下日志 2014-04-10 13:55:59,837 [WebContainer : 4] [com.cisco.ata.service.AtAService] WARN - AtAService::AtAServiceRequest DetailMessage - module=

我正在寻找使用awk从日志中提取一些信息,根据返回的信息,我希望对整个文件进行grep,并将gerp和awk的所有输出写入一个文件。我能够从awk中提取一些信息,但在awk中使用grep时,我无法提取信息。请查找以下日志

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.
根据请求ID字符串,我必须获得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提取请求ID字符串,但无法使用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} '
请帮我解决这个问题


提前感谢

我非常累,所以这可能不是最好的解决方案,但它使用了一些基本的“awkims”,为很多东西提供了非常好的样板起点

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时,您可以检查是否存在该sessionID的数组,如果存在,则可以提取更多信息

您可能需要/想要在第二个if语句中添加一些内容,以便它只检查您关心的日志行,但老实说,awk太快了,它可能不重要。(我使用的是gawk[via brew],因为OSX附带的awk版本有些欠缺,但这段代码足够基本,awk或gawk应该可以工作。)

如果您需要更好地解释代码,我将尝试更好地解释

忍者编辑:几个退出提示:

  • 不要使用
    grep-i
    ,除非你真的不知道你要找的案例。不区分大小写会使搜索速度大大降低

  • 如果不使用任何类型的正则表达式,请使用
    fgrep
    而不是
    grep
    。开箱要快得多

  • 学习如何有效地提问。您的问题非常清楚,但请使用标记使日志行更具可读性,并记住每个技术问题都应包括:

    • 你的意见是什么
    • 您的输出应该是什么
    • 你试过什么
    • 你期望的是什么
    • 你有什么
  • 擅长awk。世界正在慢慢远离以命令行为中心的东西,人们可能会说这不值得,但一旦您理解了awk中的基本概念,就很容易将它们应用到其他地方,无论是python、日志实用程序,还是仅仅从数据聚合的角度考虑
我认为没有必要在这里嵌入grep cmd。基本上,
awk
是超级类固醇的grep。你不必对regexp很可爱。试试
e=$0;sub(/.*REQUEST\u ID\u STRING=/,“”,e);子(/*$/,“”,e);e=“RequestID=”e。此外,停止使用逗号分隔输出值。使用制表符或
|
字符可以避免(99.999%的情况下)在数据中嵌入“,”字符的整个类错误。祝你好运。你似乎让这件事对你自己来说比实际情况要困难得多。发布几行示例输入和预期输出,并澄清输入在哪些文件中,以及您在每个文件中搜索的确切内容。