You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本中PV/VG/LV信息列对齐问题及解决

Bash脚本优化:实现PV/VG/LV信息的规整列对齐输出

我用Bash编写了一个脚本,目的是收集磁盘信息并通过paste命令输出,展示物理卷(PV)、卷组(VG)和逻辑卷(LV)的相关数据。但遇到一个问题:当单个PV对应多个LV时,原脚本输出的列无法对齐,LV内容会左移错位。

初始脚本及问题输出

最初编写的函数如下:

function ShowVolumeAttr()
{
    local lun_id="$1"

    # 展示PV、VG和LV信息
    PV=$(pvscan | grep $lun_id | awk '{print $2}')
    VG=$(pvscan | grep $lun_id | awk '{print $4}')
    declare -a LV
    for pv in $PV
    do
        LV[${#LV[@]}]+=$(pvdisplay -m $pv | grep "Logical volume" | awk '{print $3}')
    done
    echo -e "Physical Volume(s)	Volume Group	Logical Volume(s)"
    echo -e "------------------	------------	-----------------"
    paste <(printf %s "$PV") <(printf "	%s" "$VG") <(printf "	%s" "${LV[@]}")
}

运行后输出出现列对齐问题,多个LV条目无法对应到正确列:

Physical Volume(s)      Volume Group    Logical Volume(s)
------------------      ------------    -----------------
/dev/sda2               rhel            /dev/rhel/root
                /dev/rhel/var
                /dev/rhel/home
                /dev/rhel/swap
                /dev/rhel/usr
                /dev/rhel/tmp
                /dev/rhel/opt
                /dev/rhel/var

我尝试过调整printf命令、添加制表符,但都没能解决问题。经过优化,最终实现了规整的列对齐输出。

优化后的脚本

for pv in $PV
do
    PVARRAY[${#PVARRAY[@]}]+=$pv
done

for pv in "${PVARRAY[@]}"
do
    # 将当前PV对应的逻辑卷存入数组
    LV[${#LV[@]}]+=$(pvdisplay -m $pv | grep "Logical volume" | awk '{print $3}')

    # 遍历数组并显示内容
    for lv in "${!LV[@]}"
    do
        printf "%s	%s	%s	%s\n" "Physical Volume(s)" "Volume Group" "Logical Volume(s)" "LV Size"
        printf "%s	%s	%s	%s\n" "------------------" "------------" "-----------------" "-------"
        if [ "$lv" -ne 0 ]
        then
            printf "No physical volumes"
        fi

        PHYSV=$(lvs --segments ${LV[$lv]} -o+lv_size,devices | tail -n +2 | grep $pv | awk '{print $8}' | sed "s/([^)]*)/()/g" | tr -d '()')
        #echo -e "PHYSV: $PHYSV"
        LOGVOL=$(pvs $pv -o+lv_path,devices | grep ${LV[$lv]}  | awk '{print $8}')
        #echo -e "LOGVOL: $LOGVOL"
        PHYSVOL=$(lvs --segments ${LV[$lv]} -o+lv_size,devices | tail -n +2 | grep $pv | awk '{print $6}')
        #echo -e "PHYSVOL: $PHYSVOL"
        VOLGRP=$(lvs --segments ${LV[$lv]} -o+lv_size,devices | tail -n +2 | grep $pv | awk '{print $2}')
        #echo -e "VOLGRP: $VOLGRP"

        paste <(printf "%s" "$PHYSV") <(printf "%s" "$VOLGRP") <(printf "%s" "${LV[$lv]}") <(printf "%s" "$PHYSVOL")
    done | column -ts $'\t'

    # 清空数组
    LV=()
done

测试结果示例

[root@lavulc01-new scripts]# ./dmcli.sh -l sdb
Partition /dev/sdb1 exists but there are no physical volumes found!
[root@lavulc01-new scripts]# ./dmcli.sh -l sda
Physical Volume(s)  Volume Group  Logical Volume(s)  LV Size
------------------  ------------  -----------------  -------
/dev/sda2           rhel          /dev/rhel/root     8.00g
/dev/sda2           rhel          /dev/rhel/var      8.00g
/dev/sda2           rhel          /dev/rhel/home     8.00g
/dev/sda2           rhel          /dev/rhel/swap     32.00g
/dev/sda2           rhel          /dev/rhel/usr      8.00g
/dev/sda2           rhel          /dev/rhel/tmp      16.00g
/dev/sda2           rhel          /dev/rhel/opt      8.00g
/dev/sda2           rhel          /dev/rhel/var      4.00m
Physical Volume(s)  Volume Group  Logical Volume(s)  LV Size
------------------  ------------  -----------------  -------
/dev/sda3           rhel          /dev/rhel/var      <92.00g
[root@lavulc01-new scripts]# ./dmcli.sh -l mpatha
Physical Volume(s)   Volume Group  Logical Volume(s)   LV Size
------------------   ------------  -----------------   -------
/dev/mapper/mpatha1  u01_vg        /dev/u01_vg/u01_lv  <1.50t


LUN mpatha ID: 60:06:01:60:5e:26:47:00:96:82:74:5b:0b:5b:2c:8c


Adapters Paths  Backing Disk    Array Port UUID
--------------  ------------    -----------------------
8:0:2:0                  sdz    50:06:01:61:47:e4:45:bd
7:0:2:0                  sdj    50:06:01:60:47:e4:45:bd
7:0:3:0                  sdn    50:06:01:62:47:e4:45:bd
8:0:3:0                 sdad    50:06:01:63:47:e4:45:bd
7:0:0:0                  sdb    50:06:01:68:47:e4:45:bd
7:0:1:0                  sdf    50:06:01:6a:47:e4:45:bd
8:0:0:0                  sdr    50:06:01:69:47:e4:45:bd
8:0:1:0                  sdv    50:06:01:6b:47:e4:45:bd
[root@lavulc01-new scripts]# ./dmcli.sh -l mpatha1
Disk mpatha1 not found or is a partition device.
[root@lavulc01-new scripts]# ./dmcli.sh -l mpathd
  Failed to find device for physical volume "/dev/mapper/mpathd?".


LUN mpathd ID: 60:06:01:60:99:10:47:00:91:b9:c0:5c:8e:e3:29:86


Adapters Paths  Backing Disk    Array Port UUID
--------------  ------------    -----------------------
7:0:2:3                  sdm    50:06:01:60:47:e4:45:bd
7:0:3:3                  sdq    50:06:01:62:47:e4:45:bd
8:0:2:3                 sdac    50:06:01:61:47:e4:45:bd
8:0:3:3                 sdag    50:06:01:63:47:e4:45:bd
7:0:1:3                  sdi    50:06:01:6a:47:e4:45:bd
7:0:0:3                  sde    50:06:01:68:47:e4:45:bd
8:0:0:3                  sdu    50:06:01:69:47:e4:45:bd
8:0:1:3                  sdy    50:06:01:6b:47:e4:45:bd

内容的提问来源于stack exchange,提问作者Patrick W

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:57:09