以下脚本将每 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 建议,如果输出文件不存在,则仅输出标头。
这是对脚本进行总体改进的建议(假设是 GNUawk
或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
。