如何遍历字符串并提取MQ队列指定字段的技术求助
从MQSC输出提取指定字段的脚本实现
以下是针对你提供的MQSC输出,提取QUEUE名称、CURDEPTH、CURFSIZE等字段的几种实用脚本方案:
原始MQSC输出
5724-H72 (C) Copyright IBM Corp. 1994, 2022. Starting MQSC for queue manager TESTQMGR. 1 : dis qs(SYSTEM.RETAINED.PUB.QUEUE) AMQ8450I: Display queue status details. QUEUE(SYSTEM.RETAINED.PUB.QUEUE) TYPE(QUEUE) CURDEPTH(56) CURFSIZE(1) CURMAXFS(2088960) IPPROCS(0) LGETDATE(2023-03-09) LGETTIME(09.44.40) LPUTDATE(2023-03-09) LPUTTIME(09.44.40) MEDIALOG( ) MONQ(MEDIUM) MSGAGE(3620167) OPPROCS(0) QTIME(1578, 1578)
方法1:使用awk(Shell脚本首选)
awk可直接解析键值对格式内容,精准提取指定字段:
# 假设输出内容存在文件mqsc_output.txt中,或通过管道传递内容 awk '{ for (i=1; i<=NF; i++) { if ($i ~ /^QUEUE\(/ ) { sub(/QUEUE\(|)/,"",$i); print "QUEUE: " $i } if ($i ~ /^CURDEPTH\(/ ) { sub(/CURDEPTH\(|)/,"",$i); print "CURDEPTH: " $i } if ($i ~ /^CURFSIZE\(/ ) { sub(/CURFSIZE\(|)/,"",$i); print "CURFSIZE: " $i } } }' mqsc_output.txt
执行后输出:
QUEUE: SYSTEM.RETAINED.PUB.QUEUE CURDEPTH: 56 CURFSIZE: 1
方法2:使用grep+sed组合(轻量Shell方案)
通过grep匹配目标字段,再用sed去除格式符号:
# 单独提取每个字段 grep -o "QUEUE([^)]*)" mqsc_output.txt | sed 's/QUEUE(\(.*\))/\1/' grep -o "CURDEPTH([^)]*)" mqsc_output.txt | sed 's/CURDEPTH(\(.*\))/\1/' grep -o "CURFSIZE([^)]*)" mqsc_output.txt | sed 's/CURFSIZE(\(.*\))/\1/' # 一次性输出所有字段 echo "QUEUE: $(grep -o "QUEUE([^)]*)" mqsc_output.txt | sed 's/QUEUE(\(.*\))/\1/')" echo "CURDEPTH: $(grep -o "CURDEPTH([^)]*)" mqsc_output.txt | sed 's/CURDEPTH(\(.*\))/\1/')" echo "CURFSIZE: $(grep -o "CURFSIZE([^)]*)" mqsc_output.txt | sed 's/CURFSIZE(\(.*\))/\1/')"
方法3:使用Python脚本(适合复杂场景)
若需将提取结果存入变量或做后续逻辑处理,Python正则表达式更灵活:
import re mqsc_output = """5724-H72 (C) Copyright IBM Corp. 1994, 2022. Starting MQSC for queue manager TESTQMGR. 1 : dis qs(SYSTEM.RETAINED.PUB.QUEUE) AMQ8450I: Display queue status details. QUEUE(SYSTEM.RETAINED.PUB.QUEUE) TYPE(QUEUE) CURDEPTH(56) CURFSIZE(1) CURMAXFS(2088960) IPPROCS(0) LGETDATE(2023-03-09) LGETTIME(09.44.40) LPUTDATE(2023-03-09) LPUTTIME(09.44.40) MEDIALOG( ) MONQ(MEDIUM) MSGAGE(3620167) OPPROCS(0) QTIME(1578, 1578)""" # 定义要提取的字段列表 target_fields = ["QUEUE", "CURDEPTH", "CURFSIZE"] extracted_result = {} for field in target_fields: match = re.search(rf"{field}\(([^)]+)\)", mqsc_output) if match: extracted_result[field] = match.group(1).strip() # 打印提取结果 for key, value in extracted_result.items(): print(f"{key}: {value}")
运行后输出:
QUEUE: SYSTEM.RETAINED.PUB.QUEUE CURDEPTH: 56 CURFSIZE: 1
内容的提问来源于stack exchange,提问作者KhalDrogo
相关产品推荐
相关产品推荐

