Bash 스크립트: 출력을 반복하지 않고 매일 텍스트 파일 폴더를 구문 분석합니다.

Bash 스크립트: 출력을 반복하지 않고 매일 텍스트 파일 폴더를 구문 분석합니다.

HylaFax는 스풀 폴더에 약 일주일 분량의 팩스 전송 기록을 보관합니다. 파일을 반복하고 사용자 및 페이지 수를 추출하여 로그에 출력하는 스크립트가 있습니다.

로그 파일에 중복 출력을 발생시키지 않고 처리된 파일을 이동/변경하지 않고 매일 폴더의 파일을 처리하는 가장 효율적인 방법은 무엇입니까?

폴더 설명:

# 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

물어

로그 파일에 중복 출력을 발생시키지 않고 처리된 파일을 이동/변경하지 않고 매일 폴더의 파일을 처리하는 가장 효율적인 방법은 무엇입니까?

이를 달성하는 한 가지 방법은 처리된 파일의 정렬된 목록을 저장하는 것입니다. 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는 이 문제를 훌륭하게 해결해야 합니다.

관련 정보