如何用Python正则表达式提取strace输出中的系统调用及返回值
解决方案
核心实现思路
不用分开多次运行正则匹配,直接用单条正则一次性捕获三个目标分组,处理效率最高,规则也更严谨。
正则规则
^(\w+)\((.*)\)\s*=\s*(-?\d+)$
各分组含义:
- 第一个分组
(\w+):匹配括号前的系统调用名称,仅匹配字母、数字、下划线,规避无关特殊字符 - 第二个分组
(.*):贪婪匹配左右括号之间的所有参数内容,适配参数内部含括号、引号的场景(strace输出格式固定,参数结束的右括号后必然跟等号,贪婪匹配不会出现误判) - 第三个分组
(-?\d+):匹配等号后的返回值,兼容负号开头的错误返回值 - 中间的
\s*自动适配strace输出中为了对齐添加的任意数量空格
Python 示例代码
import re # 预编译正则,处理大体积日志时效率更高 strace_pattern = re.compile(r'^(\w+)\((.*)\)\s*=\s*(-?\d+)$') # 逐行处理strace输出 with open("strace.log", "r", encoding="utf-8") as f: for line in f: line = line.strip() if not line: continue match_res = strace_pattern.match(line) if match_res: syscall_name = match_res.group(1) args_str = match_res.group(2) return_value = int(match_res.group(3)) # 此处可自行添加字段存储、过滤逻辑 print(f"调用名:{syscall_name},参数:{args_str},返回值:{return_value}")
可选:参数拆分
如果需要把提取到的参数字符串拆分为单个参数,可以用Python内置shlex模块自动处理引号、转义符,避免误拆分引号内的逗号:
import shlex # 把参数字符串转为单个参数的列表 args_list = shlex.split(args_str.replace(',', ' '))
内容的提问来源于stack exchange,提问作者acebelowzero
相关产品推荐
相关产品推荐

