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