用于创建一个文件并附加结果的 Shell 脚本

用于创建一个文件并附加结果的 Shell 脚本

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

只需测试文件是否存在,如果不存在:echo header:

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

答案2

作为Ljm Dullaart 建议,如果输出文件不存在,则仅输出标头。

这是对脚本进行总体改进的建议(假设是 GNUawkmawk):

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

相关内容