我已经问过这个问题了,但没有更新。我认为这些信息应该与此相关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.$$
现在明白这只是一个速写。这个脚本有很多问题(例如挂载点名称中的空格),但它应该能让你了解该怎么做。