Shell脚本创建一个文件并追加结果


2

以下脚本将每1小时运行一次。脚本每次运行都会创建一个新文件。
第一个回显将推送报头,而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

Answers:


2

只需测试文件是否存在,如果不存在:回显标题:

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

0

Ljm Dullaart所建议,仅在输出文件不存在时才输出标头。

这是对脚本进行一般改进的建议(假设使用GNU awkmawk):

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.