我正在寻找使用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} '
请在这个问题上帮助我。
提前致谢
答案 0 :(得分: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概念,如果你知道你的日志行中有一些常见的东西(一个sessionID,或者某些东西),你可以根据某些条件为它创建一个数组(在这种情况下,日志行包含一个给定的字符串,并且倒数第二列是> 99。然后,当您遇到相同的sessionID时,您可以检查是否存在数组,如果存在,则提取更多信息。
你可能需要/想要在第二个if语句中添加一些东西,所以它只检查你关心的日志行,但老实说,awk是如此之快以至于它可能无关紧要。 (我使用gawk [via brew]作为OSX附带的awk版本有点缺乏,但这段代码基本足以让awk或gawk工作。)
如果您需要更好地解释代码,我会尝试更好地解释。
Ninja编辑:很少退出提示:
请勿使用grep -i
,除非您真的不知道自己正在寻找的案例。不区分大小写会使您的搜索速度变慢
如果您未使用任何类型的正则表达式,请使用fgrep
代替grep
。开箱即用的速度要快得多。
了解如何有效地提问。您的问题非常清楚,但使用标签可以使日志行更具可读性,并记住每个技术问题都应包括: