编写一个 shell 脚本来搜索文件中的复杂字符串及其出现次数

write a shell script to search a complex string in a file as well as with the number of occurrences of it

我要搜索
at java.lang.Object.wait(Native Method) - waiting on <0x17351c50> (a weblogic.rjvm.ResponseImpl) at weblogic.rjvm.ResponseImpl.waitForData(ResponseImpl.java:76) - locked <0x17351c50> (a weblogic.rjvm.ResponseImpl) at weblogic.rjvm.ResponseImpl.getTxContext(ResponseImpl.java:104) at weblogic.rjvm.BasicOutboundRequest.sendReceive(BasicOutboundRequest.java:104) at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:164) at ROIDLookupImpl_WLStub.lookupROIDS(Unknown Source) at weblogic.servlet.internal.HttpServer.lookupROIDS(HttpServer.java:1101) at weblogic.servlet.internal.session.ReplicatedSessionContext.getROIDSFromRemote(ReplicatedSessionContext.java:309) at weblogic.servlet.internal.session.ReplicatedSessionContext.getSessionInternal(ReplicatedSessionContext.java:421) at weblogic.servlet.internal.ServletRequestImpl.getValidSession(ServletRequestImpl.java:2632) at weblogic.servlet.internal.ServletRequestImpl.getSession(ServletRequestImpl.java:2248) at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3742) at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2766) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183) " 在日志文件中使用此模式并计算它在使用 unix 的大型日志文件中出现的次数。 那我该怎么做呢?

您可以尝试 pcregrep,按照以下建议:

这一行应该输出出现的次数:

pcregrep -c -M -f testsnippet.txt logfile.txt

其中 logfile.txt 是您要扫描的日志,testsnippet.txt 包含您的代码段,行尾由 \n 替换,所有点和括号前面都有斜线。也就是说:

at java\.lang\.Object\.wait\(Native Method\)\n    - waiting on <0x17351c50> \(a weblogic\.rjvm\.ResponseImpl\)\n    at weblogic\.rjvm\.ResponseImpl\.waitForData\(ResponseImpl\.java:76\)\n    - locked <0x17351c50> \(a weblogic\.rjvm\.ResponseImpl\)\n    at weblogic\.rjvm\.ResponseImpl\.getTxContext\(ResponseImpl\.java:104\)\n    at weblogic\.rjvm\.BasicOutboundRequest\.sendReceive\(BasicOutboundRequest\.java:104\)\n    at weblogic\.rmi\.internal\.BasicRemoteRef\.invoke\(BasicRemoteRef\.java:164\)\n    at ROIDLookupImpl_WLStub\.lookupROIDS\(Unknown Source\)\n    at weblogic\.servlet\.internal\.HttpServer\.lookupROIDS\(HttpServer\.java:1101\)\n    at weblogic\.servlet\.internal\.session\.ReplicatedSessionContext\.getROIDSFromRemote\(ReplicatedSessionContext\.java:309\)\n    at weblogic\.servlet\.internal\.session\.ReplicatedSessionContext\.getSessionInternal\(ReplicatedSessionContext\.java:421\)\n    at weblogic\.servlet\.internal\.ServletRequestImpl\.getValidSession\(ServletRequestImpl\.java:2632\)\n    at weblogic\.servlet\.internal\.ServletRequestImpl\.getSession\(ServletRequestImpl\.java:2248\)\n    at weblogic\.servlet\.internal\.WebAppServletContext\.invokeServlet\(WebAppServletContext\.java:3742\)\n    at weblogic\.servlet\.internal\.ServletRequestImpl\.execute\(ServletRequestImpl\.java:2766\)\n    at weblogic\.kernel\.ExecuteThread\.execute\(ExecuteThread\.java:224\)\n    at weblogic\.kernel\.ExecuteThread\.run\(ExecuteThread\.java:183\)

你可能想用 <0x[0-9a-f]+> 之类的东西替换内存地址,以捕获不同的地址,但我没有测试过这个,因为那不是你的问题:)上面的例子完全按照你的要求去做。

printf "multi\nline\ninput\n" | grep -Pzo "(?s)mul.*put" | wc -l

您必须将其除以您希望多行模式跨越的行数。

当您在行的开头找到 at 时,添加您的计数并停止计数,直到您看到不以 at 开头的行。

awk 'BEGIN {count=0; boolCount=0}; /^at/ {if (boolCount==0) count++; boolCount=1}; !/^at/ {boolCount=0}; END {print "Found: " count} ' logfile