Помощь с объединением вывода команд DF и LSBLK Linux через bash

Помощь с объединением вывода команд DF и LSBLK Linux через bash

Я уже задавал этот вопрос, но без обновления. Я думаю, что эта информация должна быть связана с этим site. Мне нужно объединить два вывода в Linux. Это:

lsblk -n -b --output KNAME,NAME,SIZE,MOUNTPOINT | grep -v "fd0" | grep -v "loop" | grep -v "sr0" | grep -v "hdc" | grep -v "cdrom"

В результате я имею:

sda   sda                   53687091200
sda1  └─sda1                53684994048
dm-3    └─dockerVG-rootLV   53682896896 /
sdb   sdb                 2147483648000
sdb1  └─sdb1              2147482599424
dm-1    ├─hddVG-dockerLV   536866717696 /var/lib/docker
dm-2    └─hddVG-hddLV     1610612736000 /dockerhdd
sdc   sdc                  536870912000
sdc1  └─sdc1               536869863424
dm-0    └─ssdVG-ssdLV      536866717696 /dockerssd

И это:

df --exclude={tmpfs,devtmpfs,squashfs,overlay} | sed -e /^Filesystem/d | awk '{print $6 " " $1 " " $3 " " $4 " " $5}'

В результате я имею:

/ /dev/mapper/dockerVG-rootLV 8110496 40591632 17%
/dockerssd /dev/mapper/ssdVG-ssdLV 214133656 274642488 44%
/dockerhdd /dev/mapper/hddVG-hddLV 83278236 1385191240 6%
/var/lib/docker /dev/mapper/hddVG-dockerLV 76046204 412729940 16%

Итак, я хочу присоединиться через эти точки /, /var/lib/docker, /dockerhdd, /dockerssd. Важно! Я хочу проверить это в другом месте, где у нас будут другие точки монтирования. Также мне нужно сохранить структуру первого вывода без сортировки.

В результате я должен получить что-то вроде этого:

sda   sda                   53687091200
sda1  └─sda1                53684994048
dm-3    └─dockerVG-rootLV   53682896896 / /dev/mapper/dockerVG-rootLV 8110496 40591632 17%
sdb   sdb                 2147483648000
sdb1  └─sdb1              2147482599424
dm-1    ├─hddVG-dockerLV   536866717696 /var/lib/docker /dev/mapper/hddVG-dockerLV 76046204 412729940 16%
dm-2    └─hddVG-hddLV     1610612736000 /dockerhdd /dev/mapper/hddVG-hddLV 83278236 1385191240 6%
sdc   sdc                  536870912000
sdc1  └─sdc1               536869863424
dm-0    └─ssdVG-ssdLV      536866717696 /dockerssd /dev/mapper/ssdVG-ssdLV 214133656 274642488 44%

Мне помог какой-то человек из stackoverflowчерез AWK, но его ответ мне не помог. Также я немного изменил его команду.

awk '/^dm-*/ || /^sd*/ || /^xvd*/ { print $0" "arr[$5] } /^Filesystem/ { mrk=1;next } mrk==1 { arr[$6]=$0 }' <<< $(df --exclude={tmpfs,devtmpfs,squashfs,overlay};lsblk -n -b --output KNAME,NAME,SIZE,MOUNTPOINT)

Но в результате у меня есть

sda   sda                   53687091200  fd0   fd0                          4096
sda1  └─sda1                53684994048  sda   sda                   53687091200
dm-3    └─dockerVG-rootLV   53682896896 / sda1  └─sda1                53684994048
sdb   sdb                 2147483648000  dm-3    └─dockerVG-rootLV   53682896896 /
sdb1  └─sdb1              2147482599424  sdb   sdb                 2147483648000
dm-1    ├─hddVG-dockerLV   536866717696 /var/lib/docker sdb1  └─sdb1              2147482599424
dm-2    └─hddVG-hddLV     1610612736000 /dockerhdd dm-1    ├─hddVG-dockerLV   536866717696 /var/lib/docker
sdc   sdc                  536870912000  dm-2    └─hddVG-hddLV     1610612736000 /dockerhdd
sdc1  └─sdc1               536869863424  sdc   sdc                  536870912000
dm-0    └─ssdVG-ssdLV      536866717696 /dockerssd sdc1  └─sdc1               536869863424

Я хочу получить это:

sda   sda                   53687091200
sda1  └─sda1                53684994048
dm-3    └─dockerVG-rootLV   53682896896 / /dev/mapper/dockerVG-rootLV 8110496 40591632 17%
sdb   sdb                 2147483648000
sdb1  └─sdb1              2147482599424
dm-1    ├─hddVG-dockerLV   536866717696 /var/lib/docker /dev/mapper/hddVG-dockerLV 76046204 412729940 16%
dm-2    └─hddVG-hddLV     1610612736000 /dockerhdd /dev/mapper/hddVG-hddLV 83278236 1385191240 6%
sdc   sdc                  536870912000
sdc1  └─sdc1               536869863424
dm-0    └─ssdVG-ssdLV      536866717696 /dockerssd /dev/mapper/ssdVG-ssdLV 214133656 274642488 44%

решение1

Лучшим вариантом будет простой скрипт оболочки. Вы можете создавать странные, непонятные однострочники, но понятный скрипт оболочки лучше поддается поддержке.

#!/bin/bash

df -h --exclude={tmpfs,devtmpfs,squashfs,overlay} | sed -e /^Filesystem/d | awk '{print $6 " " $1 " " $3 " " $4 " " $5}' > /tmp/dinges.$$

lsblk -n -b --output KNAME,NAME,SIZE,MOUNTPOINT | egrep -v "fd0|loop|sr0|hdc|cdrom" | 
while read kname name size mountpoint ; do
    printf '%-5s' "$kname"
    printf '%-20s' "$name"
    printf '%15d' "$size"
    printf '%-10s' "$mountpoint"
    if [ "$mountpoint" != "" ] ; then
        grep "$mountpoint " /tmp/dinges.$$
    else
        echo
    fi
done
rm /tmp/dinges.$$

Теперь поймите, что это быстрая запись. С этим скриптом много проблем (например, пробелы в именах точек монтирования), но он должен дать вам представление о том, что делать.

Связанный контент