幫助透過 bash 連接 DF 和 LSBLK Linux 命令的輸出

幫助透過 bash 連接 DF 和 LSBLK Linux 命令的輸出

我已經問過這個問題,但沒有更新。我想這個訊息應該要跟這個有關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

最好的選擇是一個簡單的 shell 腳本。您可能會寫出奇怪的、難以理解的俏皮話,但易於理解的 shell 腳本更易於維護。

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

現在明白這是一篇快速寫的文章。腳本存在許多問題(例如安裝點名稱中的空格),但它應該讓您知道該怎麼做。

相關內容