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