Hilfe beim Zusammenführen der Ausgabe von DF- und LSBLK-Linux-Befehlen über Bash

Hilfe beim Zusammenführen der Ausgabe von DF- und LSBLK-Linux-Befehlen über Bash

Ich habe diese Frage bereits gestellt, allerdings ohne Update. Ich denke, diese Information sollte damit zusammenhängen site. Ich muss zwei Ausgaben in Linux zusammenführen. Diese:

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

Als Ergebnis habe ich:

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

Und das:

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

Als Ergebnis habe ich:

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

/Ich möchte also über diese Punkte , /var/lib/docker, /dockerhdd, , verbinden /dockerssd. Wichtig! Ich möchte dies an einer anderen Stelle überprüfen, wo wir weitere Einhängepunkte haben werden. Außerdem muss ich die Struktur der ersten Ausgabe ohne Sortierung speichern.

Als Ergebnis muss ich so etwas erhalten:

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%

Eine Person von stackoverflowhat mir über geholfen AWK, aber ihre Antwort hat mir nicht geholfen. Außerdem habe ich ihren Befehl ein wenig geändert.

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)

Aber als Ergebnis habe ich

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

Ich möchte Folgendes erhalten:

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%

Antwort1

Die beste Option wäre ein einfaches Shell-Skript. Sie produzieren vielleicht bizarre, unverständliche Einzeiler, aber ein verständliches Shell-Skript ist besser wartbar.

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

Beachten Sie, dass dies eine schnelle Arbeit ist. Dieses Skript hat viele Probleme (z. B. Leerzeichen in den Einhängepunktnamen), aber es sollte Ihnen eine Vorstellung davon geben, was zu tun ist.

verwandte Informationen