ファイルを生成して結果を追加するシェルスクリプト

ファイルを生成して結果を追加するシェルスクリプト

次のスクリプトは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

関連情報