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
相关产品推荐
相关产品推荐

