2017-07-19 7 views
1

私はIBM MQのオートメーション・ルーチンを書くことを試みています(IBM i上では、少し難しくなりました)、むしろオーバーフォーマット・アウトプットの処理に苦労しています。MQSCコマンドの出力を「フォーマットされていませんか?

すべての出力に対して2つの固定幅の列を使用しているようですが、これらの列は一部の値(SYSTEM。*キュー名など)では十分に幅がないため、エントリごとの出力が異なる行数になる可能性があります。

MQから基本的な値をフェッチするだけでパーサを書くのは避けたいです。出力を単一の(長い)行にするか、列の幅を指定できますか?私は十分なUnix-fuを持っていて、grep、sed、pasteのような行を組み合わせたり、テキストを取り除いたりすることもできますが、行数が変わったときに私は髪を引き裂きます。

+0

フォーマットしない場合は、1つの長い行を使用します。あるいは、コードを書いてPCFコマンドを使うのが良いでしょう。 – Roger

+0

それは私の質問です - 私はそれが1つの長い行に各エントリを出力するように強制することはできますか?私はそのための明白な選択肢を見ない。常に1行に最大2つのエントリがあります。 – zkarj

+0

どのバージョンのIBM MQですか? – JoshMc

答えて

1

まあ、私はsedgrepを十分に管理して、2行または3行の出力を処理できるような解決策を得ることができました。この状況に固有の非常にですが、概念は同様のシナリオに適用できます。つまり、私は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で実行します。これにより、ファイルの次の行がパターン・バッファにプルされ、改行が取り除かれます。

関連する問題