格式化df命令的输出,不带换行符

时间:2019-03-27 17:30:58

标签: bash awk printf

我正在运行一个脚本,该脚本建立一个远程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跨行剪切输出,如下所示:

Green text Linux terminal showing the output of the df -h command

那会弄乱for循环并返回错误的数据。我想要有关如何格式化换行符的任何建议。我已经用sed / tr / printf尝试了几件事,并且引用了以下两个printf速查表:

我引用了其他具有类似标题的帖子,并且已经尝试导出COLUMNS,但这似乎无济于事。

感谢您的反馈,谢谢。

编辑:df(GNU coreutils)8.4

1 个答案:

答案 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}
'