gpt4 book ai didi

linux - 仅当所有模式在同一订单上匹配时才提取多行

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:04 24 4
gpt4 key购买 nike

我遇到了类似的问题 here .

我的 Linux 日志文件 ( sample log file) 包含如下条目,我想 grep 行 'Total Action Failed :' 和 'Total Action Processed:' 仅当这两行后跟包含字符串 '> Processing file: R' 的行时。

INF----BusinessLog:08/06/19 20:44:33 > Processing file:  R1111111.R222222222.TEST0107, and creates the reports.
Line2
Line3
Line4
INF----BusinessLog:08/06/19 20:44:33 > Data
=========
Overview:
Total Action : 100
Total Action Failed : 0
Total Action Processed: 100

INF----BusinessLog:08/06/19 20:44:35 > Processing file: R333333333.R222222222.TEST0107, and creates the reports.
Line2
Line3
Line4
INF----BusinessLog:08/06/19 20:44:35 > Data
=========
Overview:
Total Action : 50
Total Action Failed : 0
Total Action Processed: 50

使用 pcregrep 给出的解决方案尝试如下:

/opt/pdag/bin/pcregrep -M  '> Processing file:  R.*(\n|.)*Total Action Failed   :.*(\n|.)*Total Action Processed:'" $log_path/LogFile.log

我有以下两个问题:

(1) 以上命令返回所有 存在于模式行之间的行——这不是必需的

(2) 如果日志文件包含如下条目 (> Processing file: Z) 而不是 (> Processing file: R) 那么上面的 pcregrep 命令不会'给出准确的结果。

INF----BusinessLog:08/06/19 20:44:33 > Processing file:  R1111111.R222222222.TEST0107, and creates the reports.
Line2
Line3
Line4
INF----BusinessLog:08/06/19 20:44:33 > Data
=========
Overview:
Total Action : 100
Total Action Failed : 0
Total Action Processed: 100

INF----BusinessLog:08/06/19 20:44:35 > Processing file: Z333333333.R222222222.TEST0107, and creates the reports.
Line2
Line3
Line4
INF----BusinessLog:08/06/19 20:44:35 > Data
=========
Overview:
Total Action : 50
Total Action Failed : 0
Total Action Processed: 50
INF----BusinessLog:08/06/19 20:44:45 > Processing file: R555555555.R222222222.TEST0107, and creates the reports.
Line2
Line3
Line4
INF----BusinessLog:08/06/19 20:44:54 > Data
=========
Overview:
Total Action : 300
Total Action Failed : 45
Total Action Processed: 300

有人可以帮我找到解决这个问题的方法吗?

当所有模式以相同顺序匹配时,我只需要如下三行;此外,第一个模式 > Processing file: R 和第二个模式 Total Action Failed : 之间的行数不同,它不会总是 3 行。

INF----BusinessLog:08/06/19 20:44:33 > Processing file:  R1111111.R222222222.TEST0107, and creates the reports.
Total Action Failed : 0
Total Action Processed: 50
INF----BusinessLog:08/06/19 20:44:45 > Processing file: R555555555.R222222222.TEST0107
Total Action Failed : 45
Total Action Processed: 300

最佳答案

我认为您会挂断尝试创建一个满足您要求的正则表达式,而实际上您真正想要做的就是品脱每个 block 的第一行和最后两行,该行以一行开头,包括> 处理文件:R。鉴于此,在每个 UNIX 机器上的任何 shell 中使用任何 awk:

$ awk -v OFS='\n' '
/> Processing file:[[:space:]]*R/ { if (h) print h, y, z; h=$0 }
NF { y=z; z=$0 }
END { print h, y, z }
' file
INF----BusinessLog:08/06/19 20:44:33 > Processing file: R1111111.R222222222.TEST0107, and creates the reports.
Total Action Failed : 0
Total Action Processed: 50
INF----BusinessLog:08/06/19 20:44:45 > Processing file: R555555555.R222222222.TEST0107, and creates the reports.
Total Action Failed : 45
Total Action Processed: 300

如果这不是您想要的,请更新您的问题以阐明您的要求,并提供一个上面不适用的示例,我们可以发布简单的、可移植的 awk 解决方案来代替它。

关于linux - 仅当所有模式在同一订单上匹配时才提取多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56508045/

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