gpt4 book ai didi

linux - 使用 grep 提取日志文件中字符串的计数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:51 24 4
gpt4 key购买 nike

我想在当前日期的错误日志文件中获取异常计数。下面是日志片段

10.01.2017 14:03:15.517 *Error* [10.207.11.183 [1481704390201] POST /bin/flipkart/cart.GetCart.json HTTP/1.1] org.apache.cxf.services.StockServiceService.StockServicePort.StockService Inbound Message at com.day.j2ee.servletengine.HttpListener$Worker.run(HttpListener.java:644)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.NumberFormatException: For input string: "true"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:441)
at java.lang.Long.parseLong(Long.java:483)

10.01.2017 14:03:15.516 *INFO* [10.207.11.183 [1481704390201] POST /bin/flipkart/cart.GetCart.json HTTP/1.1] org.apache.cxf.services.StockServiceService.StockServicePort.StockService Inbound Message at com.day.j2ee.servletengine.HttpListener$Worker.run(HttpListener.java:644)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.NumberFormatException: For input string: "true"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:441)
at java.lang.Long.parseLong(Long.java:483)

09.01.2017 14:03:15.514 *INFO* [10.207.11.183 [1481704390201] POST /bin/flipkart/cart.GetCart.json HTTP/1.1] org.apache.cxf.services.StockServiceService.StockServicePort.StockService Inbound Message at com.day.j2ee.servletengine.HttpListener$Worker.run(HttpListener.java:644)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.NullPointerException: For input string: "true"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:441)
at java.lang.Long.parseLong(Long.java:483)

如果我运行以下 grep 命令,它会给出结果

$ grep -c $(date +"%d.%m.%Y") error.log

但是当我尝试使用“Exception”关键字进一步搜索它时,它不起作用。下面是命令

$ grep -c $(date +"%d.%m.%Y") error.log | grep 'Exception'

其次,我想获取相同异常行的计数,因为我正在使用此命令

$ grep  $(date +"%d.%m.%Y") error.log | sort | uniq -c | sort -r

但在异常(exception)情况下,由于毫秒(14:03:15.517,14:03:15.516)值不同,我在 1 月 10 日的两行中都得到“1”“1”计数。有什么方法可以跳过第二个值并找到行数

输出:-

 1 10.01.2017 14:03:15.517 *Error* [10.207.11.183 [1481704390201] POST /bin/flipkart/cart.GetCart.json HTTP/1.1] org.apache.cxf.services.StockServiceService.StockServicePort.StockService Inbound Message at com.day.j2ee.servletengine.HttpListener$Worker.run(HttpListener.java:644)
1 10.01.2017 14:03:15.516 *Error* [10.207.11.183 [1481704390201] POST /bin/flipkart/cart.GetCart.json HTTP/1.1] org.apache.cxf.services.StockServiceService.StockServicePort.StockService Inbound Message at com.day.j2ee.servletengine.HttpListener$Worker.run(HttpListener.java:644)

预期输出:-

2 10.01.2017 14:03:15 *Error* [10.207.11.183 [1481704390201] POST /bin/flipkart/cart.GetCart.json HTTP/1.1] org.apache.cxf.services.StockServiceService.StockServicePort.StockService Inbound Message at com.day.j2ee.servletengine.HttpListener$Worker.run(HttpListener.java:644)

最佳答案

如果您正在使用 GNU grep,请使用 -A 标志来显示匹配给定模式之后的行,即

grep -A 2 "$(date +"%d.%m.%Y")" file 
10.01.2017 14:03:15.517 *Error* [10.207.11.183 [1481704390201] POST /bin/flipkart/cart.GetCart.json HTTP/1.1] org.apache.cxf.services.StockServiceService.StockServicePort.StockService Inbound Message at com.day.j2ee.servletengine.HttpListener$Worker.run(HttpListener.java:644)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.NumberFormatException: For input string: "true"
--
10.01.2017 14:03:15.516 *INFO* [10.207.11.183 [1481704390201] POST /bin/flipkart/cart.GetCart.json HTTP/1.1] org.apache.cxf.services.StockServiceService.StockServicePort.StockService Inbound Message at com.day.j2ee.servletengine.HttpListener$Worker.run(HttpListener.java:644)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.NumberFormatException: For input string: "true"

上面的命令只显示了 date 之后的两行,现在要获取计数,使用

grep -A 2 "$(date +"%d.%m.%Y")" file | grep -c "Exception"
2

结合使用两个awk

awk -v dateToSearch="$(gdate +"%d.%m.%Y")" '$0 ~ dateToSearch{line[NR+2]}NR in line' file | awk -F'[:.]' '{unique[$4]++}END{for (i in unique) print i, unique[i]}' 
NumberFormatException 2

我将分解 Awk 中使用的逻辑以便更好地理解。

  • 输入行在 awk 中一次一行地解析,要搜索今天的日期,我使用带有 -v 标志的变量(awk 具体),并将其设置为今天的日期。
  • 命令的主体 $0 ~ dateToSearch{line[NR+2]}NR in line 执行以下操作; $0 代表整行,regEx 模式匹配使用 ~ 运算符完成,以匹配包含今天日期的行。一旦匹配,就会执行 {} 中的命令。这只是意味着,在模式匹配后打印第二行(类似于 grep -A 2 ..)。 NRawk 中的一个特殊变量,它在处理文件时跟踪记录号(行号)。因此,当模式匹配时,NR 会设置到该行,因此 NR+2 会在匹配后打印第二行。

  • 流水线awk,即在|之后awk .. 可以避免并组合成一个 awk ,这可能会使命令变得复杂。因此,第二部分基本上所做的是,-F'[:.]' 将输入字段分隔符设置为出现 :,以便可以通过单独的数字访问字段/列(例如 $1$2 等)。

  • 因此,为了跟踪异常的唯一计数,我创建了一个哈希表,它使用一个以异常名称(行中的 $4)作为索引的数组,并递增异常的出现次数异常(exception),正如所见。因此,一旦处理完所有行,该数组就会包含所有异常类型及其计数。

  • awk 中的 END{} 子句在处理完所有行后开始运行,因此使用它来打印计数和唯一异常标识符。

关于linux - 使用 grep 提取日志文件中字符串的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41573277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com