2

我有一个这样的磁盘脚本:

#!/bin/bash

filesys=(
/
)
[ -f "$(pwd)/filesys.conf" ] && filesys=($(<$(pwd)/filesys.conf))

date=$(date +"%d\/%m\/%Y")

df -P "${filesys[@]}" |
sed -ne 's/^.* \([0-9]\+\)% \(.*\)$/'$date', \2, \1%/p' > disk.log

我有 filesys.conf 用于工作的文件系统:

/
/run

这是输出(disk.log):

23/05/2016, /, 78%
23/05/2016, /run, 0%

问题:

我需要 filesys.conf 因为服务器文件系统总是在变化,conf 文件对我来说很容易。但我也需要在 filesys.conf 中添加使用参数,如下所示:

/,90
/run,99

如果/使用量大于 90,/run使用量大于 99,则写入日志文件。

我怎样才能做到这一点?

4

1 回答 1

2

让我们从表单上的文件 filesys.conf 创建一个 bash 关联数组assoc[file system]=threshold。这样,我们可以遍历它并与df -P.

给定文件:

$ cat filesys.conf
/,90
/dev,25

我们将它存储在数组中(来源:Bash 从文件读取到关联数组):

declare -A assoc
while IFS=, read -r -a array;
do
    assoc[${array[0]}]=${array[1]}
done < filesys.conf

所以现在的值是:

$ for k in "${!assoc[@]}"; do echo "${k} --> ${assoc[$k]}"; done
/dev --> 25
/ --> 90

现在只需处理dfwith 的输出,例如awk

mydate=$(date "+%d/%m/%Y")
for k in "${!assoc[@]}"
do
    df -P "${k}" | awk 'NR==2 && $(NF-1)+0 > limit {print date, fs, $(NF-1)}' OFS=, fs="$k" date=mydate limit="${assoc[$k]}"
done >> disk.log

这管道dfawk. 在那里,我们检查第二行(第一行是标题,显然不能从输出中删除(man df没有提到它)),并且在那里检查倒数第二列的值。如果它的值大于给定的阈值,我们打印所需的输出。

$(NF-1)+0请注意将Use%列转换为 int的技巧:格式13%被转换为13.

于 2016-05-23T08:30:25.000 回答