获取具有特定文本或条件的行(以及之前和之后的一些行)

时间:2019-03-28 13:02:50

标签: python grep

我正在分析过程中的某些日志数据,并且具有各种列,例如id,日期,时间,日志代码,日志文本。 产品编号是唯一的 日期和时间是捕获日志的时间部分。 日志代码是特定于日志文本的代码 日志文本是描述过程的256个字符的文本

例如

ID  Date             time   log id          log text
A   01/10/18    9:00:00 bbb process begin
A   01/10/18    9:00:00 yyy dimensions not specified
A   01/10/18    9:00:30 fff failure
A   01/10/18    9:00:30 ddd dispatched
A   01/10/18    9:00:30 sss process success
B   01/10/18    9:01:01 bbb process begin
B   01/10/18    9:01:50 mmm moved to stage2
B   01/10/18    9:02:50 aaa space not allocated
B   01/10/18    9:02:50 fff failure

我想在满足以下条件(可以更改)的csv或xls输出中grep(或更确切地说创建一个子集)-

    在日志文本=失败的行上方
  1. 2行
  2. 日志ID为sss的所有行

所以我的预期输出是-

ID  Date            time    log id  log text
A   01/10/18    9:00:00 bbb process begin
A   01/10/18    9:00:00 yyy dimensions not specified
A   01/10/18    9:00:30 fff failure
B   01/10/18    9:01:50 mmm moved to stage2
B   01/10/18    9:02:50 aaa space not allocated
B   01/10/18    9:02:50 fff failure
A   01/10/18    9:00:30 sss process success

使用以下线程中的讨论: Grep for a word, and if found print 10 lines before and 10 lines after the pattern match

我尝试了一些代码来获得下面的代码- 导入子进程

filename = "filename.csv"    
string_to_search = "failure"    
extract = (subprocess.getstatusoutput("grep -C 2 '%s' %s"%(string_to_search, filename)))[1]
print(extract)

1 个答案:

答案 0 :(得分:2)

您可以使用以下代码:

with open("text.txt", "r") as f:
    output = open("output.txt", "w")
    count = 0
    lines = f.readlines()
    for line in lines:
        if "sss" in line:
            output.write(line)
        elif "failure" in line:
            output.write(lines[lines.index(line) - 2])
            output.write(lines[lines.index(line) - 1])
            output.write(line)