Как добавить строку ниже вывода заголовка, предоставленного инструментом колонки? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть короткий Bash-скрипт, который выводит подключенные устройства в систему:

#!/bin/bash

{
   regex="^(\/dev\S+) \S+ (\/\S+) \S+ (\S+)"

   echo "Device Mount Type"
   mount | pcregrep -o1 -o2 -o3 --om-separator=" " "$regex" | sort
}  | column -t -o" | "

Мой вывод:

Device         | Mount     | Type
/dev/md1       | /boot/efi | vfat
/dev/md2       | /boot     | xfs
/dev/md4       | /home     | xfs
/dev/md5       | /data     | xfs
/dev/nvme0n1p2 | /tmp      | xfs

То, что я хотел бы видеть:

Device         | Mount     | Type
---------------+-----------+-----
/dev/md1       | /boot/efi | vfat
/dev/md2       | /boot     | xfs
/dev/md4       | /home     | xfs
/dev/md5       | /data     | xfs
/dev/nvme0n1p2 | /tmp      | xfs

Это сложно, потому что ширина столбцов изменяется, и у самого последнего столбца нет разделителя в конце.

Ширина первых двух столбцов может быть определена изпервая строка.Но ширину последнего столбца можно определить, только оценив каждую строку и найдя самую широкую.

Какими простыми способами это можно сделать?

1 Ответ

0 голосов
/ 03 февраля 2019

В качестве чисто решения bash, пожалуйста, попробуйте следующее:

#!/bin/bash

maxlen=0
lines=()
while read -r line; do
    sub1=${line%%|*}}
    s1=${#sub1}
    sub2=${line%|*}
    s2=${#sub2}
    if ((${#line} > maxlen)); then
        maxlen=${#line}
    fi
    lines+=("$line")
done < <(
{
   regex="^(\/dev\S+) \S+ (\/\S+) \S+ (\S+)"

   echo "Device Mount Type"
   mount | pcregrep -o1 -o2 -o3 --om-separator=" " "$regex" | sort
}  | column -t -o" | ")

f1=$((s1-1))            # field width for "Device"
f2=$((s2-s1))           # field width for "Mount"
f3=$((maxlen-s2-1))     # field width for "Type"

echo "${lines[0]}"
printf "%*s+" "$f1" | tr " " "-"
printf "%*s+" "$f2" | tr " " "-"
printf "%*s\n" "$f3" | tr " " "-"
for ((i=1; i<${#lines[@]}; i++)); do
    echo "${lines[$i]}"
done

Вывод:

Device         | Mount     | Type
---------------+-----------+-----
/dev/md1       | /boot/efi | vfat
/dev/md2       | /boot     | xfs
/dev/md4       | /home     | xfs
/dev/md5       | /data     | xfs
/dev/nvme0n1p2 | /tmp      | xfs

Я признаю, что будет более элегантно и разборчиво использовать другой языккак Сайрус.

...