【问题标题】:sed conditional merge NEXT line [closed]sed 条件合并 NEXT 行
【发布时间】:2017-03-08 23:53:44
【问题描述】:

我有一个如下的日志

10-26-2016 10:00:00 INFO bla bla bla
10-26-2016 10:00:00 ERROR This is the error
error line 2
error line 3
error line 4
10-26-2016 10:00:00 INFO bla bla bla2

我需要一个 sed 或 python 命令来获取下面的错误行

==========================
his is the error
error line 2
error line 3
error line 4
==========================

这是一个巨大的文件,我无法打开文件。请协助。谢谢

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只会在发布者已经尝试自己解决问题时提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask
  • @Marshall : sed -n '/^err/p' FILENAME
  • 我尝试了类似 sed -n '/10-25-16 10.*ERROR/{N;N;N;N;N;N;N;N;p;}' file | sed -n -e '/ERROR/p' -e '/^[^0-9]/p' 但低于一些恒定的行数不起作用。因为我可能在 INFO 级别下有一些日志,它不以日期值开头,例如 DATA HOUR INFO bla bla bla(next line) bla bla bla
  • 请阅读stackoverflow.com/tourstackoverflow.com/help/how-to-askstackoverflow.com/help/dont-askstackoverflow.com/help/mcve。并且不要试图在 cmets 中解释您的问题,更新您的 Q,这样人们就不必阅读越来越多的 cmets 来理解您的问题。祝你好运。

标签: python regex parsing awk sed


【解决方案1】:

不确定我是否理解您的需求,但这里有一些代码:

with open('long_file.log', 'r') as log_file:
    log = log_file.read().split('\n')
    for line in log:
        if 'error' in line:
            print (line)

输出:

10-26-2016 10:00:00 ERROR This is the error
error line 2
error line 3
error line 4

【讨论】:

  • 对不起,我无法打开文件。它会导致大量内存。我正在以多线程方式读取多个文件。所以我无法打开整个文件
  • 此外,“错误”一词可能不会出现在所有错误行中。但它只出现在第一个像“错误”
  • 哦,我明白了。恐怕我不知道如何帮助你,对不起。
  • 其实看看有没有帮助:stackoverflow.com/a/15644885/7067541
  • @Marshall:“加载文件”和“打开文件”是两个不同的东西。当前脚本不会将整个文件加载到内存中,而是逐行读取。
【解决方案2】:

使用 GNU sed:

sed 's/^[0-9]/\n&/' file | sed -n '/ ERROR/,/^$/{s/^[0-9].* ERROR \(.*\)/\1/;/^$/d;p}'

输出:

这是错误 错误行 2 错误行 3 错误行 4

工作原理:

第一个 sed 命令 (sed 's/^[0-9]/\n&/' file) 在以数字开头的每一行之前插入一个空行。

输出:

2016 年 10 月 26 日 10:00:00 信息 bla bla bla 2016 年 10 月 26 日 10:00:00 错误 这是错误 错误行 2 错误行 3 错误行 4 2016 年 10 月 26 日 10:00:00 信息 bla bla bla2

第二个 sed commnad 仅打印以包含 ERROR 的行开头并以空行结尾的块。花括号中的部分在此块中删除了此处的10-26-2016 10:00:00 ERROR,并删除了此块中的尾随空行(/^$/d)。

如果您希望在不同错误块之间的输出中有一个空行,请删除 ;/^$/d

【讨论】:

  • 酷。有效。请您解释一下命令plz吗?
  • 我已经更新了我的答案。
  • 谢谢。如何在一条线上出局? like 10-26-2016 10:00:00 ERROR 这是错误 错误行 2 错误行 3 错误行 4
  • 我建议开始一个新问题。
猜你喜欢
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多