다음 스크립트는 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
.