I need to display each IBM MQ Queue Manager queue along with its depth.
I can do this with a command like echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME. The output is similar to this:
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. Note that some queues have large names, and the output moves the "
TYPE" and "CURDEPTH" fields down and to the right.
My goal is to display these queues as [TYPE] - [QUEUE.NAME] - [DEPTH]:
QLOCAL - QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3 - 1 So I'm trying to use either sed or awk to accomplish this, and these are some of my attempts:
With 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) The main issue is that the output does not display the queue depth correctly when its name is large.
With 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 shows nothing when I add the \s+CURDEPTH expression. Only when I remove it does it shows the queues, but then I lose the depth value.
Can you guys give me some recommendations on this?