1
1

(分析2)grep等でRPGソース分析

Last updated at Posted at 2024-09-13

■概略

オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
オープンソースではソース分析によく使うgrepとUNIXコマンドのパイプ連結を、
RPG3のソース分析に使い見通しをよくします

■特定の文字列を含むファイルを特定する(grep)

RPGソースをIFSにコピーする方法は後述
IFS上にRPGソースがある状態で、例えばGMBKAFというテーブル(ファイル)を修正する
必要が出た場合に、影響するプログラムの一覧を求めたい
FGMBKAF とファイル指定しているRPGをgrepコマンドで抜き出す

$ grep FGMBKAF *|more
CKB103.rpg:     FGMBKAF  IF  E           K        DISK
CKB103R.rpg:     FGMBKAF  IF  E           K        DISK
…

IBMiでは多くの場合ファイルとフィールドはシステムで一意になっているので
grepは有効!
次のUNIXコマンドとパイプの考え方を学んだらいろいろな分析ができるようになる

■RPGソースをIFSにコピーする

◯CPYTOSTMFはソース毎に指定!

IBMiネイティブファイルにあるRPG3/RPGLEソースをIFSにCPYTOSTMFで
ソースメンバー名を1つづつ指定してコピーする!
多分数千あるであろうソースメンバー名から転送スクリプトを生成する方法を考えた
UNIXコマンドとパイプの使い方サンプルになっている

以下のbashスクリプトを作成する
ls_{ライブラリ名}_QRPGSRC.bash

#!/bin/bash
system "DSPFD FILE({ライブラリ名}/QRPGSRC) TYPE(*MBRLIST)"

実行すると下記になる

5770SS1 V7R4M0  190621                 ファイル記述の表示                                    24/09/xx   8:42:17      s゚ーニ゙    1
    ファイル. . . . . . . . . : QRPGSRC
      ライブラリー. . . . . . : {ライブラリ名}
    情報のタイプ. . . . . . . : *MBRLIST
    ファイル属性. . . . . . . : *ALL
    システム. . . . . . . . . : *LCL
…
   メンバー       ナbヌ゙        jbポ  日付    日付   時刻    ロテーn゙数  ロテーn゙数
   #CDZZAN               16384 RPG    09/04/07 24/07/31 10:15:29         72          0
     mgヌn:  指定年月日前日残高セット
   #CMMI                  8192 RPG    09/04/07 24/07/31 10:15:29         35          0
     mgヌn:  指定月セット         (ナボモーk] aメ)   SBMMI
   #CMTZAN               16384 RPG    09/04/07 24/07/31 10:15:29         69          0
…


ここからソースメンバー名だけを抜き出す
grepでRPGとある行を抜き出し、grep -vでQRPGSRCとある行を除外するよう
ls_{ライブラリ名}_QRPGSRC.bashを修正する
| のパイプで処理を連結する

#!/bin/bash
system "DSPFD FILE({ライブラリ名}/QRPGSRC) TYPE(*MBRLIST)"|grep RPG|grep -v QRPGSRC
   #CDZZAN               16384 RPG    09/04/07 24/07/31 10:15:29         72          0
   #CMMI                  8192 RPG    09/04/07 24/07/31 10:15:29         35          0
…


awkでファイル名だけを抜き出し、cpytostmf命令に整形する

#!/bin/bash
system "DSPFD FILE(PMLIB/QRPGSRC) TYPE(*MBRLIST)"|grep RPG|grep -v QRPGSRC \
|awk '{print "system \"CPYTOSTMF FROMMBR(\047\${from}"$1".MBR\047) TOSTMF(\047\${to}"$1".rpg\047) \$opt\""}'      
system "CPYTOSTMF FROMMBR('${from}#CDZZAN.MBR') TOSTMF('${to}#CDZZAN.rpg') $opt"
system "CPYTOSTMF FROMMBR('${from}#CMMI.MBR') TOSTMF('${to}#CMMI.rpg') $opt"
…


リダイレクト(>)でファイルに書出し、先頭に変数などを設定する

$ ./ls_{ライブラリ名}_QRPGSRC.bash > cp2IFS_{ライブラリ名}_QRPGSRC.bash

cp2IFS_{ライブラリ名}_QRPGSRC.bash

#!/bin/bash

opt="STMFOPT(*REPLACE) STMFCCSID(1208)"
from='/QSYS.LIB/PMLIB.LIB/QRPGSRC.FILE/'
to='./'
### ここまでの行を追加する

system "CPYTOSTMF FROMMBR('${from}#CDZZAN.MBR') TOSTMF('${to}#CDZZAN.rpg') $opt"
system "CPYTOSTMF FROMMBR('${from}#CMMI.MBR') TOSTMF('${to}#CMMI.rpg') $opt"
…


cp2IFS_{ライブラリ名}_QRPGSRC.bashを実行しIFSにRPGソースをコピーする

$ ./cp2IFS_{ライブラリ名}_QRPGSRC.bash


以下のようにIFSに*.rpgソースができる

total 93272
-rwx------ 1 {ユーザ} 0   3356 Jul 31 11:16 #CDZZAN.rpg
-rwx------ 1 {ユーザ} 0   1860 Jul 31 11:16 #CMMI.rpg
…
1
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1