寻找一种在Python

时间:2016-10-11 17:44:30

标签: python

我正在编写一个程序来聚合Linux主机上的strace输出行。当strace以“-f”选项运行时,它将混合系统调用行:

close(255 <unfinished ...>
<... rt_sigprocmask resumed> NULL, 8) = 0
<... close resumed> )       = 0
[pid 19199] close(255 <unfinished ...>
[pid 19198] <... rt_sigprocmask resumed> NULL, 8) = 0
[pid 19199] <... close resumed> )       = 0

我想迭代输出并将“未完成”行与“恢复”行组合。所以在输出上面的两行:

close(255 <unfinished ...>
.....
<... close resumed> )       = 0

将合并为:

close(255) = 0

我在考虑将“未完成”的行拆分为“&gt;”并将其放入列表中。如果未来的行包含简历,我将遍历此列表以查看系统调用和pid是否存在。如果他们是我将split()行“&gt;”并将两者结合起来。好奇,如果有更好的方法来做到这一点?

*更新*

感谢您提供的精彩反馈!我想出了以下内容,并希望对代码有所了解:

holding_cell = list()

if len(sys.argv) > 1:
    strace_file =  open(sys.argv[1], "r")
else:
    strace_file = sys.stdin

for line in strace_file.read().splitlines():
    if "clone" in line:
        print line
    if "unfinished" in line:
        holding_cell.append(line.split("<")[0])
    elif "resumed" in line:
        # Get the name of the system call / pid so we  can try 
        # to match this line w/ one in the buffer
        identifier = line.split()[1]
        for cell in holding_cell:
            if identifier in cell:
                print cell + line.split(">")[1]
                holding_cell.remove(cell)
    else:
        print line

有更多的pythonic方式来写这个吗?再次感谢您提供的精彩反馈!

1 个答案:

答案 0 :(得分:0)

某些迭代器(如文件对象)可以嵌套。假设您正在从类似文件的对象中读取它,您可以创建一个内部循环来进行组合。我不确定strace日志的格式规则是什么,但名义上,它可能类似于

def get_logs(filename):
    with open('filename') as log:
        for line in log:
            if "<unfinished " in line:
                preamble = line.split(' ', 1)[0].strip()
                for line in log:
                    if " resumed>" in line:
                        yield "{}) = {}\n".format(preamble,
                            line.split('=')[-1].strip())
                        break
             else:
                 yield line