Ibm mq MQSC命令输出是否可以是';无格式?';

Ibm mq MQSC命令输出是否可以是';无格式?';,ibm-mq,Ibm Mq,我正在尝试为IBMMQ编写自动化例程(在IBMi上,这会让生活变得更加困难),并且正在努力处理格式过多的输出 它似乎坚持对所有输出使用两个固定宽度的列,并且由于这些列对于某些值(尤其是SYSTEM.*队列名称)不够宽,每个条目的输出可以在不同的行数上 我希望避免编写解析器只是为了从MQ获取基本值。我可以强制输出一行(长)或指定列宽吗?我有足够的Unix fu来组合成对的行,甚至可以用grep、sed、paste之类的工具删除文本,但是当行数发生变化时,我会感到毛骨悚然。好吧,我成功地驯服了sed

我正在尝试为IBMMQ编写自动化例程(在IBMi上,这会让生活变得更加困难),并且正在努力处理格式过多的输出

它似乎坚持对所有输出使用两个固定宽度的列,并且由于这些列对于某些值(尤其是SYSTEM.*队列名称)不够宽,每个条目的输出可以在不同的行数上


我希望避免编写解析器只是为了从MQ获取基本值。我可以强制输出一行(长)或指定列宽吗?我有足够的Unix fu来组合成对的行,甚至可以用grep、sed、paste之类的工具删除文本,但是当行数发生变化时,我会感到毛骨悚然。

好吧,我成功地驯服了
sed
grep
以获得一个可以处理两行或三行输出的工作解决方案。这种情况非常特殊,但是这些概念可以应用于类似的场景

简而言之,我没有找到影响display命令输出格式的方法,但找到了处理它的方法

下面的QShell命令(使用STRQSH运行)提供了队列、当前深度和最大深度的CSV。然后,我使用CPYFRIMPF将其移动到DB2文件中进行处理

CHGVAR     VAR(&QSH) VALUE('+
echo "dis qlocal(*) curdepth maxdepth"
  | /QSYS.LIB/QMQM.LIB/RUNMQSC.PGM ''' |< &QMGR |< ''' +
  | grep ''[A-Z]\{4,8\}('' +
  | sed -e ''/QUEUE([-A-Za-z0-9._\/]*)$/{N;s/\n//;}'' +
        -e ''/TYPE([-A-Za-z0-9._\/]*)$/{N;s/\n//;}'' +
        -e ''/CURDEPTH([0-9]*)$/{N;s/\n//;}'' +
        -e ''s/^\ \ *//'' +
        -e ''s/\ \ */,/g'' +
        -e ''s/QUEUE[(]\([-A-Za-z0-9._\/]*\)[)]/"\1"/'' +
        -e ''s/TYPE[(][-A-Za-z0-9._\/]*[)],//'' +
        -e ''s/CURDEPTH[(]\([0-9]*\)[)]/\1/'' +
        -e ''s/MAXDEPTH[(]\([0-9]*\)[)]/\1/'' +
  | grep -v ''SYSTEM.'' +
  > /tmp/mqqueuests.csv+
')
CHGVAR(&QSH)值('+
回显“dis qlocal(*)curdepth maxdepth”
|/QSYS.LIB/QMQM.LIB/RUNMQSC.PGM''<&QMGR'<''+
|grep'[A-Z]\{4,8\}(''+
|sed-e'/队列([-A-Za-z0-9.\/]*)$/{N;s/\N/;}”+
-e''/类型([-A-Za-z0-9.\/]*)$/{N;s/\N/;}'+
-e'/CURDEPTH([0-9]*)$/{N;s/\N/;}'+
-e“s/^\\*/”+
-e's/\\*/,/g'+
-e's/队列[(]\([-A-Za-z0-9.\u\/]*\)[)]/“\ 1”/”+
-e“s/类型[(][-A-Za-z0-9.\/][*[)],/”+
-e's/CURDEPTH[(]\([0-9]*\)[)]/\1/'+
-e's/MAXDEPTH[(]\([0-9]*\)[)]/\1/'+
|grep-v“系统”+
>/tmp/mqqueuests.csv+
')
它允许使用字母数字和
-\uu/
字符的队列名称


可变行数问题的根本解决方案在于找到不以
MAXDEPTH()结尾的行
并通过
sed
中的
N
命令删除后续换行符。这会将文件的下一行拉入模式缓冲区,在那里可以剥离换行符。

刚刚遇到同样的问题-希望runmqsc为每个对象输出一行,而不需要额外的消息。我在ay-在AIX上:

echo "DISPLAY CHSTATUS(*) STATUS CHSTATI CHSTADA CURRENT LOCLADDR " | runmqsc MY_MQ_SERVER | sed 's/^[^  ].*$/%/g' | tr -s " " | tr -d "\n" | tr "%" "\n"
因此,首先,我从第一列(第一个sed命令)开始,从不必要的行中创建了一个“分隔符”。然后,所有系列的空格都缩小为一个空格,所有换行符都被删除。然后,使用最后一个tr命令,“分隔符”被转换为换行符,从而每个对象只创建一行输出


--Trifo

如果您希望它不格式化,那么只需使用一个长行。或者更好的是,编写代码并使用PCF命令。这是我的问题-我可以强制它在一个长行上输出每个条目吗?我看不到明显的选项。它每行最多有两个条目。IBM MQ的哪个版本?最新版本是7.1.0.6.7.1.x我们可以转到当前。还要注意,在我对这个问题的回答中“我提供了一个命令,它在AIX上使用
sed
awk
的组合来解析
runmqsc
输出。考虑到QSH似乎是基于的(如果不是从中移植的话)如果需要CSV,只需将输出分隔符更改为逗号即可,例如:
OFS=“,”