TSO NETSTAT コマンド出力の構文解析上の考慮事項
コマンドが IPv6 使用可能のスタックから実行されたり、コマンドが IPv4 専用スタックから実行される一方で要求が長形式で表示されるようになっていると、TSO NETSTAT の出力にメッセージ ID は表示されません。TSO 下で Netstat コマンドを出し、メッセージ ID に基づいて出力行を解析する REXX プログラム を開発した場合は、解析する行の形式を判別するために出力行で別のトークンを使用するように、この REXX プログラムを変更する必要があります。
マイグレーションを容易にするためのヒントのいくつかを示します。
- CONN レポートや BYTEINFO レポートなど、いくつかの Netstat レポートは、テーブル項目を表示します。Netstat 出力を長形式で受け取ると、これらのテーブル項目は複数の出力行を占めて います。テーブル項目の最初の行は、常にその行の 1 桁目から始まり、その同じテーブル項目に属する残りの行は、2 桁のオフセット位置 (3 桁目) から始まります。このことを利用すると、どの行がテーブル項目のはじめであり、どれが同じテーブル項目に属する残りの 行であるかを判別することができます。
- テーブル・タイプ以外のレポートの場合は、構文解析するレポートおよび探している情報の種類に応じて、MSGID 以外の LNKNAME または DEVNAME などのトークンを使用して行を個別に識別する必要があります。
小さい REXX プログラムが NETSTAT DEVLINKS レポートを基にして、次の例の出力を作成しました。
Link/Intf name =LOOPBACK Bytes in =12387 Bytes out =12387
Link/Intf name =VIPA1 Bytes in =0 Bytes out =0
Link/Intf name =LINKEE Bytes in =0 Bytes out =0
Link/Intf name =TR1 Bytes in =110614 Bytes out =363744
Link/Intf name =VIPLC0A86501 Bytes in =0 Bytes out =0
Link/Intf name =VIPL092A689F Bytes in =0 Bytes out =0
この出力は、行の識別に MSGID を使用した REXX プログラムで作成したものです。このサンプルの REXX プログラムを以下に示します。
/* REXX */
/* Requires PROFILE MSGID - uses MSGIDs to identify lines */
netstr = 'DEVLINKS'
address TSO "NETSTAT "netstr" STACK"
n = queued()
if n > 0 then do x=1 to n
i = (n-x)+1
pull line.i
end
line.0 = n
do x=1 to line.0
parse upper var line.x msgid t1 t2 t3 t4 .
if msgid = 'EZZ2761I' then do /* MSGID EZZ2761I */
interface = t2
end
if msgid = 'EZZ2820I' then do /* MSGID EZZ2820I */
bytesin = t2
bytesout = t4
st1 = 'Link/Intf name ='||substr(interface,1,18)
st1 = st1||' Bytes in ='||substr(bytesin,1,10)
st1 = st1||' Bytes out ='||substr(bytesout,1,10)
say st1
end
end
exit
MSGID を使用せずに、Netstat レポートの特定のトークンを使用するように変更された REXX プログラム
でも同じ出力を作成することができます。次の例で、必要な変更は、parse ステートメントと if ステートメント
のみです。
/* REXX */
/* Does not require MSGIDs, uses tokens to identify lines */
/* This REXX works with z/OS V1R10 */
netstr = 'DEVLINKS'
address TSO "NETSTAT "netstr" STACK"
n = queued()
if n > 0 then do x=1 to n
i = (n-x)+1
pull line.i
end
line.0 = n
do x =1 to line.0
parse upper var line.x t1 t2 t3 t4 .
if t1 = 'LNKNAME:' | t1 = 'INTFNAME:' then do
interface = t2
end
if t1 = 'BYTESIN' then do
bytesin = t3
end
if t1 = 'BYTESOUT' then do
bytesout = t3
st1 = 'Link/Intf name = '||substr(interface,1,18)
st1 = st1||' Bytes in = '||substr(bytesin,1,10)
st1 = st1||' Bytes out = '||substr(bytesout,1,10)
say st1
end
end
exit