Python调用grep提取文件两单词间字符串输出异常如何排查
问题根源
你的代码存在两个核心问题,导致输出不符合预期:
- 正则语法错误:PCRE正则的正向零宽后瞻(匹配指定内容前面的位置)语法为
(?<=匹配规则),你写的(?<(Message))缺少了关键的=,属于非法语法,会导致grep解析正则时出现逻辑偏差,匹配出错乱的内容(你输出里多出来的反引号、开头多余空格都是这个问题导致的)。 - 输出未做转码处理:
subprocess.run在不指定text=True参数时,返回的stdout是字节串(bytes)类型,直接打印会自带b''的类型标记,同时grep输出匹配结果时会自带末尾换行符,和你预期的纯字符串输出不符。
修正方案
按如下两点调整代码即可:
- 修正正则的后瞻语法,把错误的
(?<(Message))改成正确的(?<=Message) - 开启subprocess的自动文本转码,同时对输出结果做首尾空白裁剪,去掉自带的换行符
修正后的可运行代码:
import subprocess result = subprocess.run( ['grep -oP \'(?<=Message).*(?= element)\' /home/ubuntu/varout.txt'], shell=True, capture_output=True, text=True # 自动将字节流转为系统默认编码的字符串 ) reason = result.stdout.strip() # 去除首尾换行、多余空白字符 print(reason)
如果你的Python版本低于3.7(不支持text参数),可以把转码逻辑改成手动解码:
import subprocess result = subprocess.run( ['grep -oP \'(?<=Message).*(?= element)\' /home/ubuntu/varout.txt'], shell=True, capture_output=True ) reason = result.stdout.decode('utf-8').strip() print(reason)
运行上述代码后,输出结果就会和你预期的完全一致:
: unable to locate
补充:如果不想依赖系统grep命令,纯Python实现同样的提取逻辑更稳定,不会出现命令转义、环境兼容问题,示例代码如下:
with open('/home/ubuntu/varout.txt', 'r', encoding='utf-8') as f: content = f.read() start = content.find('Message') + len('Message') end = content.find(' element', start) reason = content[start:end].strip() print(reason)
内容的提问来源于stack exchange,提问作者Oshin aggrawal
相关产品推荐
相关产品推荐

