有一段日志,需要提取括号中的一些值,组成新文件.
spawn runmqsc dcllf.mqm display queue('q_*') curdepth end 5724-H72 (C) Copyright IBM Corp. 1994, 2005. ALL RIGHTS RESERVED. 启动队列管理器 dcllf.mqm 的 MQSC。 1 : display queue('q_*') curdepth AMQ8409: 显示队列细节。 QUEUE(q_act_shell_act) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_act_shell_control) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_act_shell_module) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mms_mo_log) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mms_mt_act_1) TYPE(QLOCAL) CURDEPTH(11) AMQ8409: 显示队列细节。 QUEUE(q_mms_mt_act_2) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mms_mt_act_3) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mms_mt_batch_1) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mms_mt_log) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mms_report) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mo_act) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mo_old_mms) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mo_old_sms) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mo_route) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mo_tp) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mo_tp_provision) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_mt_tp_msgid) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_performance_test) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_sms_mo_log) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_sms_mt_act_1) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_sms_mt_act_2) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_sms_mt_act_3) TYPE(QLOCAL) CURDEPTH(0) AMQ8409: 显示队列细节。 QUEUE(q_sms_mt_log) TYPE(QLOCAL) CURDEPTH(6) AMQ8409: 显示队列细节。 QUEUE(q_sms_report) TYPE(QLOCAL) CURDEPTH(51) 2 : end 读取一个 MQSC 命令。 所有命令均无语法错误。 已处理所有的有效 MQSC 命令。
有人提供了这样一种办法
我觉得不优雅,应该有更好的办法,于是想到用正则. 主要涉及反向引用,非贪婪模式和多行匹配模式.
#!/usr/bin/env python3 import re data = open('mqwatch.txt', 'r').read() b = re.findall('QUEUE\((.*?)\).*?CURDEPTH\((\d+)\)', data, re.S) x = ';'.join(['%s,%s' % (i[0], i[1]) for i in b]) print(x)