AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1166875
Accepted
markfree
markfree
Asked: 2024-10-21 21:15:57 +0800 CST2024-10-21 21:15:57 +0800 CST 2024-10-21 21:15:57 +0800 CST

格式化和过滤 ibm-mq 队列

  • 772

我需要显示每个 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表达式时什么都不显示。只有当我删除它时它才会显示队列,但随后我丢失了深度值。


你们能就此给我一些建议吗?

sed
  • 2 2 个回答
  • 144 Views

2 个回答

  • Voted
  1. JoshMc
    2024-10-22T00:19:19+08:002024-10-22T00:19:19+08:00

    假设您有 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() }'

    • 0
  2. Best Answer
    markfree
    2025-03-27T20:52:43+08:002025-03-27T20:52:43+08:00

    我最终只查询了队列名称和深度,并将其输出为 CSV。

    命令如下。

    echo 'DISPLAY QLOCAL(Q*) WHERE(CURDEPTH GE 0)' | runmqsc {$MQSERIES.QM.NAME} | (echo "QUEUE_NAME,CUR_DEPTH"; sed -n -E 's/\s+QUEUE\(([^)]+)\).*/\1/p; s/.*\s+CURDEPTH\(([^)]+)\)/\1/p' | awk 'NR%2{printf "%s,",$1; next}1')
    

    输出看起来像这样。

    QUEUE_NAME,CUR_DEPTH
    QD.QMLOGPR019,0
    QE.QUEUE.NAME1,0
    QE.QUEUE.NAME2,0
    QE.QUEUE.NAME3,0
    QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME4,126
    QE.QUEUE.NAME.QUEUE.NAME5,273
    QE.QUEUE.NAME6,0
    QE.QUEUE.NAME7,506
    QI.QUEUE,0
    

    我已经使用 Zabbix 自动执行了查询,目前速度非常快。请注意,Zabbix 要求您转义双引号。

    我感谢所有的反馈。

    • 0

相关问题

  • Linux可以做条件判断在Linux的某行插入内容吗

  • SED 查找和替换 w\ 正则表达式

  • 在从 linux 生成的电子邮件中获取正确的换行符

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve