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

问题描述 投票:0回答:1

我正在寻找使用 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.

根据 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} '
unix awk grep
1个回答
2
投票

这使用了一些基本的“awkisms”,为很多东西提供了一些非常好的样板起点。

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 概念,如果您知道日志行之间有一些共同点(会话 ID 或类似的东西),您可以根据某些条件为其创建一个数组(在这种情况下,日志行包含给定的字符串并且倒数第二列是 > 99)。然后,当您遇到相同的 sessionID 时,您可以检查它是否存在数组,如果存在,则提取更多信息。

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

如果您需要更好地解释代码,我会尽力解释得更好。

忍者编辑:一些退出技巧:

  • 不要使用

    grep -i
    ,除非您确实不知道您要查找的案例。不区分大小写会让你的搜索速度变慢

  • 如果您不使用任何类型的正则表达式,请使用

    fgrep
    而不是
    grep
    。开箱即用的速度要快得多。

© www.soinside.com 2019 - 2024. All rights reserved.