bash - 如何使用 bash 更新文件行?

标签 bash csv awk

我有一个用于记录磁盘使用情况的小脚本,如下所示:

#!/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"

/根/磁盘列表:

/
/dev/mapper/map1

/root/disk.csv:

18.05.2015, /,18
18.05.2015, /dev/mapper/map1,1

当我运行此脚本时,打印到 disk.csv 的新行。我需要查看实际数据,因此当我运行此脚本时,我需要更新到关于同一日期的同一行(而不是插入)。

不是这样的:

运行 - 18.05.2015 13:00

18.05.2015, /,18
18.05.2015, /dev/mapper/map1,1

运行 - 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

运行此脚本时,我需要更改旧行(如果日期相同)。我该怎么做?

最佳答案

注意:你运行 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 的重新格式化输出之前。

关于bash - 如何使用 bash 更新文件行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30302111/

相关文章:

python - 将一组加上格式化字符串写入 CSV?

linux - 使用 awk 将与标题字符串匹配的列移动到文件末尾

bash - Makefile 错误 - 寻找匹配 `"时意外的 EOF '

linux - 为什么 bash 中的所有命令都是小写的?

python - 从记录数组中取出一个元素时给出 void

shell - 如何根据模式对文本文件中的行重新排序?

bash - 打印两个模式之间的所有行,独占的,仅限第一个实例(在 sed、AWK 或 Perl 中)

linux - Bash:格式化 printf 中的字符串

linux - 使用linux bash替换文件中两个字符串之间的文本

csv - 将大量数据从CSV文件上传到数据库的有效方法?