Bashスクリプト:出力を繰り返すことなく、毎日テキストファイルフォルダを解析します。

Bashスクリプト:出力を繰り返すことなく、毎日テキストファイルフォルダを解析します。

HylaFax は、スプールフォルダに約 1 週間分のファックス転送履歴を保存します。ファイルを繰り返し、ユーザー数とページ数を抽出してログに出力するスクリプトがあります。

ログファイルに重複出力を発生させずに処理されたファイルを移動/変更せずに、毎日フォルダ内のファイルを処理する最も効率的な方法は何ですか?

フォルダの説明:

# ls /var/spool/hylafax/doneq/
q10000 q10001 ... q10010

スクリプト

#!/bin/bash
for i in /var/spool/hylafax/doneq/q*
  do
   user=$(cat $i | grep "mailaddr" | sed 's/mailaddr://g')
   pgs=$(cat $i | grep "npages" | sed 's/npages://g')
      echo "$i $user - $pgs pages" >> /scripts/log_output.txt
done

答え1

頼む

ログファイルに重複出力を発生させずに処理されたファイルを移動/変更せずに、毎日フォルダ内のファイルを処理する最も効率的な方法は何ですか?

これを達成する1つの方法は、処理されたファイルのソートされたリストを保存することです。comm候補ファイルのリストとして処理すると、重複エントリが削除されます。

技術の例として、次のようなものが正しい形式のファイル名(HylaFaxで生成された名前など)を処理するための基礎として使用できます。

find * -print | sort > /tmp/current_files

test -f /tmp/previous_files || { echo "Come back tomorrow"; exit 0; }
comm -13 /tmp/previous_files /tmp/current_files > /tmp/new_files

# ... Process entries in /tmp/new_files ...

mv -f /tmp/current_files /tmp/previous_files

答え2

これはあまりエレガントな解決策かもしれませんが、これが私が思いついたものです:

#!/bin/bash

processed=$(cat /scripts/processed_log.txt)

for i in /var/spool/hylafax/doneq/q*
  do
   case "${processed[@]}" in
       *"$i"*) ;;
       *) echo "New! Going to add $i to the log"
          echo $i >> /scripts/processed_log.txt
          user=$(cat $i | grep "mailaddr" | sed 's/mailaddr://g')
          pgs=$(cat $i | grep "npages" | sed 's/npages://g')
          echo "$i $user - $pgs pages" >> /scripts/log_output.txt
       ;;
esac
done

スプールディレクトリに存在しなくなったprocess_log.txtのファイルを削除するロジックを追加するだけです。 sedはこの問題をうまく解決しなければなりません。

関連情報