我有一个用于磁盘使用记录的小脚本,如下所示:
#!/bin/bash
date=$(date +"%d.%m.%Y")
while read -r filesystem;
do
filesys=${filesystem}
df -P | tr -d "%" | awk '$6=="'"$filesys"'" {print"'"$date"'"",",$6","$5}' >> /root/disk.csv
done < "/root/disklist"
/根/ disklist:
/
/dev/mapper/map1
/root/disk.csv:
18.05.2015, /,18
18.05.2015, /dev/mapper/map1,1
当我运行此脚本时,请打印到disk.csv的新行。我需要查看实际数据,因此当我运行此脚本时,我需要更新到相同日期(不是插入)的同一行。
不喜欢这样:
Run - 18.05.2015 13:00
18.05.2015, /,18
18.05.2015, /dev/mapper/map1,1
Run - 18.05.2015 15:00
18.05.2015, /,18
18.05.2015, /dev/mapper/map1,1
18.05.2015, /,19
18.05.2015, /dev/mapper/map1,5
运行此脚本时,我需要更改旧行(如果日期相同)。我怎么能这样做?
答案 0 :(得分:4)
护理:你没有参数运行df -P
,(将生成所有磁盘的完整统计信息),你的/root/disklist
中有一行。
所以有我的目的(使用最近的bash):
disklist=(
/home
/usr
/var
)
[ -f "/root/disklist" ] && disklist=($(</root/disklist))
file="/root/disk.csv"
printf -v myDate "%(%d.%m.%Y)T" -1
sed -e "/^$myDate,/d" $file >$file.tmp
df -P "${disklist[@]}" |
sed -ne 's/^.* \([0-9]\+\)% \(.*\)$/'$myDate', \2, \1/p' >>$file.tmp
read osize < <(stat -c%s $file)
read nsize < <(stat -c%s $file.tmp)
((nsize+=${#disklist[@]}*2)) # So length of % field could become smaller
[ $nsize -ge $osize ] && mv $file.tmp $file || rm -v $file.tmp >&2
在添加sed -e "/^$myDate,/d" -i $file
的重新格式化输出之前,$file
将内联修改18.05.2015,
以删除以df -P
开头的所有行。
答案 1 :(得分:3)
它并不完全清楚你想要什么,但也许这会有所帮助:
#!/bin/bash
df -P | awk -v date="$(date +"%d.%m.%Y")" -v OFS=',' '
NR==FNR{disk[$1 OFS $2]=$3; next}
{disk[date OFS $6]=$5+0}
END {for (key in disk) print key, disk[key]}
' FS=',' /root/disk.csv FS=' ' - > tmp && mv tmp /root/disk.csv