剪切os.system输出的一行并将其写入文件

时间:2019-07-08 19:09:36

标签: python

当我在终端中执行objdump命令时,我得到类似

$ objdump -d -M intel -S -z machine3.o

machine3.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
void main() {
   0:   55                      push   rbp
   1:   48 89 e5                mov    rbp,rsp
   4:   00 00                   add    BYTE PTR [rax],al
   6:   00 00                   add    BYTE PTR [rax],al

然后继续。

我想使用os.system("...")在python脚本中执行该命令,然后提取始终以4:开头的行并将其打印到txt文件中。我怎样才能做到这一点?我可以告诉python剪切输出的第11行吗?还是在行首搜索4:开头?

2 个答案:

答案 0 :(得分:2)

大多数Linux系统没有使用Python处理此问题,而是提供了一些有用的文本字符串处理工具。实际上,大多数这些工具通常用于在内容流中搜索有用的模式。

使用4:打印行

为此,我们可以使用grep [wiki]

objdump -d -M intel -S -z test.o | grep '^\s*4:'

如果我们只对第一个比赛感兴趣,则可以使用-m标志,例如:

objdump -d -M intel -S -z test.o | grep '^\s*4:' -m 1

最多打印4:(并包括)的行

您可以使用sed [wiki]。通过编写sed '/pattern/q',您将打印内容,直到(包括)pattern匹配的行为止。

因此,您可以运行以下命令:

objdump -d -M intel -S -z machine3.o | sed '/\s*4:/q'

答案 1 :(得分:2)

我们可以使用子进程的Popen方法提取输出并验证该行包含“ 4:”,然后将该行写入我们的文本文件,这可以解决问题:)。

示例

import subprocess

def main():

    """ Popen containining our objdump command """
    process = subprocess.Popen(['objdump', '-d', '-M', 'intel', '-S', '-z', 'machine3.o'], stdout=subprocess.PIPE)

    """ Retrieve output or errors """
    out, err = process.communicate()

    """ Loop through our output """
    for line in out.splitlines():

        """ Check line contains our line-break 4: """
        if '4:' in line:

            """ Write line to our file """
            with open('somefile.txt', 'a') as the_file:
                the_file.write(line)

            """ End our for loop """
            break

if __name__ == '__main__':
    main()