Отформатируйте вывод команды df без перевода строки - PullRequest
1 голос
/ 27 марта 2019

У меня работает скрипт, который устанавливает удаленный 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:

Я ссылался на другие посты с похожими заголовками и уже пытался экспортировать КОЛОННЫ, но, похоже, это ничего не дало.

Я благодарен за отзыв, спасибо.

Редактировать: df (GNU coreutils) 8,4

1 Ответ

1 голос
/ 27 марта 2019
df -h | awk '
    NF == 1 {device = $1; getline; $0 = device $0}
    {sub(/%/, "", $5); print $1 "," $5 "," $6}
'

Первая строка тела awk увидит, имеет ли текущая строка только 1 поле.Если да, запомните устройство, прочитайте следующую строку и вставьте устройство в (новую) текущую строку.

Это должно быть выведено для выделенного вами элемента:

/dev/mapper/vg_01-lv_var,16,/var

Ивы можете удалить grep и tr из вашего конвейера.


Ваша оболочка нуждается в значительном улучшении.Вместо того, чтобы углубиться в это, вы можете просто выполнить всю работу в 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}
'
...