当我在终端中执行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:
开头?
答案 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()