Ayudando con la unión de la salida de los comandos DF y LSBLK de Linux a través de bash

Ayudando con la unión de la salida de los comandos DF y LSBLK de Linux a través de bash

Ya hice esta pregunta, pero sin actualizar. Creo que esta información debería estar relacionada con esto site. Necesito fusionar dos salidas en Linux. Este:

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

Como resultado tengo:

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

Y esto:

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

Como resultado, tengo:

/ /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%

Entonces, quiero unirme a través de estos puntos /,,,, . ¡Importante! Quiero comprobar esto en otro lugar, donde tendremos otros puntos de montaje. También tengo que guardar la estructura del primer resultado sin ordenar./var/lib/docker/dockerhdd/dockerssd

Como resultado tengo que recibir algo como esto:

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%

Alguna persona de stackoverflowme ayudó a través de AWK, pero su respuesta no me ayudó. También he cambiado un poco su mando.

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)

Pero como resultado, tengo

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

Quiero recibir esto:

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%

Respuesta1

La mejor opción sería un script de shell simple. Puede producir frases extrañas e incomprensibles, pero es mejor mantener un script de shell comprensible.

#!/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.$$

Ahora comprenda que esta es una escritura rápida. Hay muchos problemas con este script (como espacios en los nombres de los puntos de montaje), pero debería darle una idea de qué hacer.

información relacionada