我需要显示每个 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

因此,我尝试使用sedawk来实现这一点,以下是我的一些尝试:

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() }'