土曜日, 3月 29, 2008

拒絶ログソーティングスクリプトを改良

 拒絶ログソーティングスクリプトを改良した。変更点は以下のとおりである。

■単独のアクセス記録の表示を抑止するスイッチ
 リトライしなかった単独のアクセスの記録を抑止してリトライシーケンスだけを表示したい場合のために、コードの改造方法を説明していた。しかし、そのように改造すると、最後に表示するアクセス数と推定メッセージ数が、リトライシーケンスのアクセスについてのみのカウントになってしまい、全体のアクセスについてのデータがわからなくなってしまっていた。
 そこで、単独のアクセスの記録を抑止してもアクセス数と推定メッセージ数のカウントが変わらないように改良した。
 その際、単独のアクセス記録の抑止をオン・オフするスイッチの変数を設け、その初期値を書き換えるだけで済むようにした。単独のアクセス記録を抑止するには、最後のプロセスのGAWKスクリプトで

Suppress_single_access_records=0

という行を

Suppress_single_access_records=1

と書き換えればよい。

■sortコマンドで-kオプションを使用
 sortコマンドでソートキーを指定するために、今まで

sort +POS1 -POS2

という形式を使っていたが、もう一つの指定方法である

sort -k POS1,POS2

という形式に変更した。BBSで、システムによっては前者の形式が使えなくなっているという情報をいただいたからである。
 レコードの5、6、7番目のフィールドであるクライアントIPアドレス、送信者アドレス、受信者アドレスをキーとしてソートするには、前者の形式では

sort +4 -7

と書く。「+4」はキーの開始フィールドで、0から数えたフィールド番号である。「-7」は、0から数えたフィールド番号の7よりも前までという意味である。ややこしい。後者の形式では、フィールド番号は1から始まるように数え、

sort -k 5,7

と書く。GAWKでのフィールド番号の数え方と一致していてわかりやすい。

■\nの一時書き換えコードを\034から\036に変更
 処理には影響しない些細な変更である。リトライアクセスが連続して並ぶようにソートした後、日付と時刻でソートし直すために、リトライシーケンスの複数の行を一時的に一行のデータに変換する。その際に、元の\n(改行文字)を\034に置き換えていたが、\036に置き換えるように変更した。
 ISOの機能文字の規格(ASCIIやJISでも同じ)では、情報セパレータとして以下の4個が定められている。

\034 (0x1c): FS (File Separator)
\035 (0x1d): GS (Group Separator)
\036 (0x1e): RS (Record Separator)
\037 (0x1f): US (Unit Separator)

今まで、入力されうる文字と重ならない文字を使えばよいということで、あまり深く考えずに置き換え文字として\034を使っていた。しかし、規格に照らせば、元が一行だった情報単位の区切りを示すにはRSコードを使うのがふさわしいと考えて、\036を置き換え文字として使うことにした。どうでもいいこだわりである。

0 件のコメント: