【发布时间】:2014-11-15 06:34:46
【问题描述】:
我有一个脚本:
OUTPUT_DIR=/share/es-ops/Build_Farm_Reports/WorkSpace_Reports
BASE=/export/ws
TODAY=`date +"%m-%d-%y"`
HOSTNAME=`hostname`
WORKSPACES=( "bob_avail" "bob_used" "mel_avail" "mel_used" "sideshow-ws2_avail" "sideshow-ws2_used" )
if ! [ -f $OUTPUT_DIR/$HOSTNAME.csv ] && [ $HOSTNAME == "sideshow" ]; then
echo "$HOSTNAME" > $OUTPUT_DIR/$HOSTNAME.csv # with a linebreak
separator="," # defined empty for the first value
for v in "${WORKSPACES[@]}"
do
echo -n "$separator$v" >> $OUTPUT_DIR/$HOSTNAME.csv # append, concatenated, the separator and the value to the file
#separator="," # comma for the next values
done
echo >> $OUTPUT_DIR/$HOSTNAME.csv # add a linebreak (if you want it)
fi
WORKSPACES2=( "bob" "mel" "sideshow-ws2" )
separator="" # defined empty for the first value
for v in "${WORKSPACES2[@]}"
do
echo -n "$separator`df -m $BASE/$v | awk '{if (NR!=1) {print $3","$2}}'`" >> $OUTPUT_DIR/$HOSTNAME.csv
separator="," # comma for the next values
done
产生这个:
sideshow
,bob_avail,bob_used,mel_avail,mel_used,sideshow-ws2_avail,sideshow-ws2_used
470400,1032124,661826,1032124,43443,1032108
但我希望第二个 for 循环将日期放在第一列中,如下所示:
09-20-14,470400,1032124,661826,1032124,43443,1032108
意义
$TODAY,<bob avail>,<bob used>,mel avail>,<mel used>,<sideshow-ws2 avail>,<sideshow-ws2 used>
所以整体输出如下所示:
sideshow
,bob_avail,bob_used,mel_avail,mel_used,sideshow-ws2_avail,sideshow-ws2_used
09-20-14,470400,1032124,661826,1032124,43443,1032108
如果这运行了一个 cron,那么我只需要检查主机名是否为 x 并且 .csv 文件是否存在:
sideshow
,bob_avail,bob_used,mel_avail,mel_used,sideshow-ws2_avail,sideshow-ws2_used
09-20-14,470400,1032124,661826,1032124,43443,1032108
09-20-15,470400,1032124,661826,1032124,43443,1032108
只需添加第二天的值。
【问题讨论】:
-
您想要与
-n相同的技巧。循环WORKSPACES2,运行这两个命令,将它们都回显到文件中,然后继续。 (实际上只需要运行一次命令即可。使用{print $3","$2}。) -
由于某种原因,没有像第一个 for 循环那样在第一列中获得日期。我将输出粘贴到我的问题中。
-
您不能像工作区一样循环遍历日期。您只需
echo -n循环之前的文件即可。 -
另外,顺便说一句,如果第一个只是为每个人提供
*_avail和*_used条目,则不需要两个WORKSPACES数组。只需在第一个循环中使用裸名称循环和 `echo -n "$separator${v}_avail,${v}_used"。