MQSC命令输出是否可以“未格式化”?'

时间:2017-07-19 03:32:39

标签: ibm-mq

我试图为IBM MQ编写自动化例程(在IBM i上使生活变得更加困难),并努力处理相当过度格式化的输出。

对于所有输出似乎坚持使用两个固定宽度的列,并且因为这些列对于某些值(特别是SYSTEM。*队列名称)而言不够宽,所以每个条目的输出可以在不同的行数上。

我想避免编写解析器只是为了从MQ获取基本值。我可以强制输出到单个(长)行,还是指定列宽?我已经有足够的Unix-fu来组合线条,甚至用grep,sed,paste等文本删除文本,但是当线条数量发生变化时,我会把头发撕掉。

2 个答案:

答案 0 :(得分:1)

好吧,我设法驯服sedgrep足以获得一个可以处理两三行输出的工作解决方案。 非常特定于这种情况,但概念可以应用于类似的场景。

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

以下QShell命令(使用STRQSH运行)给出了队列,当前深度,最大深度的CSV。然后,我使用CPYFRMIMPF将其移动到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+
')

它允许包含字母数字和. - _ /字符的队列名称。

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

答案 1 :(得分:0)

碰到同样的问题-想要 runmqsc 每个对象输出一行,而没有多余的消息。我是这样做的-在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