bash 経由で DF および LSBLK Linux コマンドの出力を結合するのを支援する

bash 経由で DF および LSBLK Linux コマンドの出力を結合するのを支援する

この質問はすでにしましたが、更新されていません。この情報はこれに関連していると思いますsite。Linux で 2 つの出力をマージする必要があります。これ:

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.$$

これは簡単な記述であることを理解してください。このスクリプトには多くの問題 (マウントポイント名にスペースがあるなど) がありますが、何をすべきかはわかるはずです。

関連情報