次のスクリプトは1時間ごとに実行されます。このスクリプトは、実行されるたびに新しいファイルを生成します。
最初のechoはヘッダーをプッシュし、forループは結果をプッシュします。
しかし、私が望むものは次のとおりです。
- ヘッダーは 1 日に 1 回だけファイルに入力し、for ループの結果を同じファイルに継続的に追加する必要があります。
- 1日に1つの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によって提案されました。、出力ファイルがない場合はヘッダーのみが出力されます。
以下は、スクリプトの一般的な改善のための提案です(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タイムスタンプが1日以上経過したすべての一般ファイルを見つけて削除します。/home
以降、サブディレクトリは検索されません-maxdepth 1
。