파일을 생성하고 결과를 추가하는 쉘 스크립트

파일을 생성하고 결과를 추가하는 쉘 스크립트

다음 스크립트는 1시간마다 실행됩니다. 이 스크립트는 실행될 때마다 새 파일을 생성합니다.
첫 번째 echo는 헤더를 푸시하고 for 루프는 결과를 푸시합니다.

하지만 내가 원하는 것은 다음과 같습니다.

  • 헤더는 하루에 한 번만 파일에 들어가야 하며 for 루프 결과는 동일한 파일에 지속적으로 추가되어야 합니다.
  • 하루에 하나의 CSV 파일만 생성해야 합니다.
  • result_something이라는 이름의 이전 파일을 모두 삭제해야 합니다.

내가 가지고 있는 코드

echo "collectiontime,hostname,diskusage,directory" > /home/result_$CURR_TIME_EPOCH.csv

for i in /data01 /opt /opt/splunk /opt/splunk/var/lib/splunk/kvstore /opt/splunk/var/run/searchpeers /opt/splunk/var/run
do
   T=`sudo du -sh $i 2> /dev/null`
if [ $? -eq 0 ]; then   
   T=`echo $T | awk '{print $1","$2}'`
   echo `date +%s`,$HOSTNAME,$T  
fi

done >> /home/result_$CURR_TIME_EPOCH.csv

답변1

파일이 존재하는지 테스트하고, 존재하지 않는 경우: 에코 헤더:

if [ ! -f "/home/result_$CURR_TIME_EPOCH.csv" ]; then 
    echo "collectiontime,hostname,diskusage,directory" > "/home/result_$CURR_TIME_EPOCH.csv"
fi

답변2

~처럼Ljm Dullaart가 제안했습니다., 출력 파일이 없으면 헤더만 출력됩니다.

다음은 스크립트의 일반적인 개선을 위한 제안입니다(GNU awk정도라고 가정 mawk).

if [ ! -f "/home/result_$CURR_TIME_EPOCH.csv" ]; then 
    echo 'collectiontime,hostname,diskusage,directory' >"/home/result_$CURR_TIME_EPOCH.csv"
fi

for dir in /data01 /opt /opt/splunk /opt/splunk/var/lib/splunk/kvstore /opt/splunk/var/run/searchpeers /opt/splunk/var/run
do
    sudo du -sh "$dir" |
    awk -v OFS=',' '{ print strftime("%s"), $1, $2 }'
done >>"/home/result_$CURR_TIME_EPOCH.csv" 2>/dev/null

다음을 사용하는 경우 bash디렉터리 배열(및 출력 파일에 대한 별도의 변수)을 사용하여 가독성을 향상시킬 수 있습니다 .

dirs=(  /data01
        /opt
        /opt/splunk
        /opt/splunk/var/lib/splunk/kvstore
        /opt/splunk/var/run/searchpeers
        /opt/splunk/var/run )

outfile="/home/result_$CURR_TIME_EPOCH.csv"

if [ ! -f "$outfile" ]; then
    echo 'collectiontime,hostname,diskusage,directory' >"$outfile"
fi

for dir in "${dirs[@]}"; do
    sudo du -sh "$dir" |
    awk -v OFS=',' '{ print strftime("%s"), $1, $2 }'
done >>"$outfile" 2>/dev/null

예를 들어 오래된 파일을 삭제하려면 다음을 사용할 수 있습니다.

find /home -maxdepth 1 -type f -name 'result_*.cvs' -ctime +1 -delete

이름이 주어진 패턴과 일치하고 ctime 타임스탬프가 하루 이상 지난 모든 일반 파일을 찾아 삭제합니다. /home이후 하위 디렉토리는 검색되지 않습니다 -maxdepth 1.

관련 정보