我正在运行一个脚本,该脚本建立一个远程SSH隧道并运行以下代码以检查可用磁盘空间,并使用AWK进行格式化,并以以下方式报告:
#!/bin/bash
for DATA in $(sudo df -h | grep -E '/$|/var$|/tmp$' | awk '{print $1","$5","$6}' | tr -d '%')
do
DISK=$(echo $DATA | awk -F, '{print $1}')
FREE=$(echo $DATA | awk -F, '{print $2}')
MOUNT=$(echo $DATA | awk -F, '{print $3}')
if [[ "$FREE" -ge '90' ]]
then
echo "$HOST does not have enough room to patch, \"$MOUNT\" ($DISK) is ${FREE}% full"
fi
done
我有意删除了进行此运行所需的转义 正确地放在远程外壳上(以提高可读性)
运行正常,除非行太长并且df跨行剪切输出,如下所示:
那会弄乱for循环并返回错误的数据。我想要有关如何格式化换行符的任何建议。我已经用sed / tr / printf尝试了几件事,并且引用了以下两个printf速查表:
我引用了其他具有类似标题的帖子,并且已经尝试导出COLUMNS,但这似乎无济于事。
感谢您的反馈,谢谢。
答案 0 :(得分:1)
df -h | awk '
NF == 1 {device = $1; getline; $0 = device $0}
{sub(/%/, "", $5); print $1 "," $5 "," $6}
'
awk主体的第一行将查看当前行是否只有一个字段。如果是,请记住该设备,阅读下一行,然后将该设备插入(新)当前行中。
这应该为您突出显示的项目输出:
/dev/mapper/vg_01-lv_var,16,/var
您可以从管道中删除grep和tr。
您的shell循环需要大量改进。与其讨论,不如直接从事awk中的所有工作:
df -h | awk -v host="$HOST" -v limit=90 '
BEGIN {msg = "%s does not have enough room to patch, \"%s\" (%s) is %s full\n"}
NR == 1 {next}
NF == 1 {device = $1; getline; $0 = device $0}
$5 >= limit {printf msg, host, $6, $1, $5}
'