【问题标题】:write a shell script to search a complex string in a file as well as with the number of occurrences of it [duplicate]编写一个shell脚本来搜索文件中的复杂字符串以及它的出现次数[重复]
【发布时间】:2015-02-22 09:08:57
【问题描述】:

我要搜索
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 计算它在大型日志文件中出现的次数。 那我该怎么做呢?

【问题讨论】:

  • 这不是一种模式。只是一个例子,你要找的其他例子可能会略有不同
  • 不,我需要在文件中找到这个表达式,这不是实际问题中的示例,我只需要找到这个
  • Stephen C 试图解释的是,虽然错误在许多地方可能相同,但可能存在细微差异,例如内存地址。

标签: linux bash shell unix ubuntu


【解决方案1】:

您可以尝试 pcregrep,如下所示:https://stackoverflow.com/a/2686705/2380702

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

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

其中 logfile.txt 是您要扫描的日志,而 testsn-p.txt 包含您的 sn-p,行尾由 \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\)

您可能想用 之类的东西替换内存地址,以捕获不同的地址,但我没有对此进行测试,因为那不是您的问题 :) 上面的示例完全正确你问了什么。

【讨论】:

  • 是的...... grep / fgrep / egrep 的问题在于它们无法处理跨越多行的模式。
  • 添加了完整的工作示例
【解决方案2】:

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

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

【讨论】:

  • 不,我需要计算整个代码在另一个文件中重复的整个块的出现次数,如果我要计算它在一个块中出现 17 次,它只需要计算 1 .
  • 当你在一个块中有 17 个 at 没有没有 at 的行时,它只会被计算一次,这要归功于 boolCount。我的错误是您可能需要在 ^ 和 at:/^ at/ 之间添加一些空格或制表符。该脚本计算在行首用at 标识的块数。
【解决方案3】:
printf "multi\nline\ninput\n" | grep -Pzo "(?s)mul.*put" | wc -l

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

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 2015-09-30
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2015-05-08
    • 2021-08-07
    • 2012-05-10
    相关资源
    最近更新 更多