编写一个 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
我要搜索
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