我需要显示每个 IBM MQ 队列管理器队列及其深度。
我可以使用类似 的命令来执行此操作echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME
。输出类似于以下内容:
5724-H72 (C) Copyright IBM Corp. 1994, 2023.
Starting MQSC for queue manager QMNAME.
1 : DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0)
AMQ8409I: Display Queue details.
QUEUE(QE.QUEUE.NAME1) TYPE(QLOCAL)
CURDEPTH(2)
AMQ8409I: Display Queue details.
QUEUE(QE.QUEUE.NAME2) TYPE(QLOCAL)
CURDEPTH(90)
AMQ8409I: Display Queue details.
QUEUE(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3)
TYPE(QLOCAL) CURDEPTH(1)
AMQ8409I: Display Queue details.
QUEUE(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME4)
TYPE(QLOCAL) CURDEPTH(0)
AMQ8409I: Display Queue details.
QUEUE(QE.QUEUE.NAME5) TYPE(QLOCAL)
CURDEPTH(0)
AMQ8409I: Display Queue details.
QUEUE(QE.QUEUE.NAME.QUEUE.NAME6)
TYPE(QLOCAL) CURDEPTH(0)
AMQ8409I: Display Queue details.
QUEUE(QE.QUEUE.NAME7) TYPE(QLOCAL)
CURDEPTH(0)
One MQSC command read.
No commands have a syntax error.
All valid MQSC commands were processed.
请注意,一些队列具有较大的名称,输出会将“
TYPE
”和“CURDEPTH
”字段向下和向右移动。
我的目标是将这些队列显示为[TYPE] - [QUEUE.NAME] - [DEPTH]
:
QLOCAL - QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3 - 1
因此,我尝试使用sed
或awk
来实现这一点,以下是我的一些尝试:
和awk
awk -F'(QUEUE|TYPE|CURDEPTH)' '/QUEUE\(.*\)/{printf "%s - %s - ", $2, $3}/CURDEPTH/{printf "%s\n", $2}'
$ echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | cat teste | awk -F'(QUEUE|TYPE|CURDEPTH)' '/QUEUE\(.*\)/{printf "%s - %s - ", $2, $3}/CURDEPTH/{printf "%s\n", $2}'
GE 0)
(QE.QUEUE.NAME1) - (QLOCAL) - (0)
(QE.QUEUE.NAME2) - (QLOCAL) - (0)
(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3) - - (QLOCAL)
(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME4) - - (QLOCAL)
(QE.QUEUE.NAME5) - (QLOCAL) - (0)
(QE.QUEUE.NAME.QUEUE.NAME6) - - (QLOCAL)
(QE.QUEUE.NAME7) - (QLOCAL) - (0)
主要问题是当队列名称很大时,输出无法正确显示队列深度。
和sed
sed -rn 's|QUEUE\((.*)\)\s+TYPE\((.*)\)\s+CURDEPTH\((\d+)\)|\2 - \1 - \3|p'
$ echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | sed -rn 's|QUEUE\((.*)\)\s+TYPE\((.*)\)\s+CURDEPTH\((\d+)\)|\2 - \1 - \3|p'
$ echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | sed -rn 's|QUEUE\((.*)\)\s+TYPE\((.*)\)|\2 - \1|p'
QLOCAL - QUEUE.NAME1
QLOCAL - QUEUE.NAME2
QLOCAL - QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3
QLOCAL - QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME4
QLOCAL - QE.QUEUE.NAME5
QLOCAL - QE.QUEUE.NAME.QUEUE.NAME6
QLOCAL - QE.QUEUE.NAME7
sed
当我添加\s+CURDEPTH
表达式时什么都不显示。只有当我删除它时它才会显示队列,但随后我丢失了深度值。
你们能就此给我一些建议吗?
0
最佳答案
1
假设您有 GNU grep 和 awk 命令(例如在 Linux 上),这应该可以工作:
printf "DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0)" | runmqsc QMNAME | grep -o '^\w\+:\|\w\+[(][^)]\+[)]' | awk -F '[()]' 'function printValues() { if ("QUEUE" in p) { printf "%s - %s - %s\n", p["QUEUE"], p["TYPE"], p["CURDEPTH"] } } /^\w+:/ { printValues(); delete p; next } { p[$1] = $2 } END { printValues() }'|column -t
CSV 输出:
printf "DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0)" | runmqsc QMNAME | grep -o '^\w\+:\|\w\+[(][^)]\+[)]' | awk -F '[()]' -v OFS="," 'function printValues() { if ("QUEUE" in p) { print p["QUEUE"], p["TYPE"], p["CURDEPTH"] } } /^\w+:/ { printValues(); delete p; next } { p[$1] = $2 } END { printValues() }'
|
|