【问题标题】:How can I update lines of file with bash?如何使用 bash 更新文件行?
【发布时间】:2015-07-29 21:26:14
【问题描述】:

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

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

/root/磁盘列表:

/
/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

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

【问题讨论】:

  • &gt;&gt; 更改为 &gt; ?祝你好运。
  • 我知道这一点。但是&gt;删除我昨天的旧台词,以及更早的台词。

标签: bash csv awk


【解决方案1】:

小心:你运行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 的重新格式化输出。

【讨论】:

    【解决方案2】:

    尚不完全清楚您想要什么,但也许这会有所帮助:

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

    【讨论】:

      猜你喜欢
      • 2019-09-07
      • 2020-03-30
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 2021-12-16
      • 1970-01-01
      相关资源
      最近更新 更多