Unix 用于显示IBM AIX的每个文件系统所驻留的HDisk的脚本

Unix 用于显示IBM AIX的每个文件系统所驻留的HDisk的脚本,unix,ksh,aix,Unix,Ksh,Aix,下面的脚本显示了IBMAIX中每个文件系统所驻留的HDisk #!/bin/ksh for vg in `lsvg -o`; do for fs in `lsvgfs $vg`; do printf "%-22s" $fs; for disk in `lsvg -p $vg | tail +3 | awk '{print $1}'`; do lspv -l $disk | grep -q " $

下面的脚本显示了IBMAIX中每个文件系统所驻留的HDisk

#!/bin/ksh
for vg in `lsvg -o`; do 
    for fs in `lsvgfs $vg`; do 
            printf "%-22s" $fs; 
            for disk in `lsvg -p $vg | tail +3 | awk '{print $1}'`; do
                    lspv -l $disk | grep -q " ${fs}$" && printf "%-8s" $disk; 
            done; 
            echo
    done; 
done
以下是输出结果:

/apps/data/IAMV1/sys1hdisk189hdisk200hdisk146hdisk151hdisk136hdisk141
/apps/data/IAMV1/sys2hdisk188hdisk201hdisk144hdisk152hdisk137hdisk191
首先,输出不会正确显示,因为它应该是这样的:

/apps/data/IAMV1/sys1    hdisk189 hdisk200 hdisk146 hdisk151 hdisk136 hdisk141
/apps/data/IAMV1/sys2    hdisk188 hdisk201 hdisk144 hdisk152 hdisk137 hdisk191
/apps/data/IAMV1/sys1    hdisk189 hdisk200   hdisk146 hdisk151 hdisk136 hdisk141
                         1000g    200000000g 1000g    1000g    3000g    1000g
                          300g         5000g  250g      90g      80g      30g 

/apps/data/IAMV1/sys2    hdisk188 hdisk201 hdisk144 hdisk152     hdisk137 hdisk191
                         1000g    2000g    1000g    10000000000g 3000g    1000g
                          300g     500g     250g             90g   80g      30g
我需要升级它,以查看磁盘的总空间以及每个磁盘中文件系统使用的空间,比如

/apps/data/IAMV1/sys1    hdisk189 hdisk200 hdisk146 hdisk151 hdisk136 hdisk141
                         1000g    2000g    1000g    1000g    3000g    1000g
                          300g     500g     250g      90g      80g      30g 

/apps/data/IAMV1/sys2    hdisk188 hdisk201 hdisk144 hdisk152 hdisk137 hdisk191
                         1000g    2000g    1000g    1000g    3000g    1000g
                          300g     500g     250g      90g      80g      30g 
在本例中,fs/apps/data/IAMV1/sys1使用来自hdisk189的300g 等等老实说,我不知道怎么做,我知道我可以用这个来获得磁盘的总空间

getconf DISK_SIZE /dev/hdisk189 

谢谢大家。

我创建了一个初始版本,可能适合您的需要。在AIX7.1上测试

我没有带有多个PV的vg,因此我不确定文本是否正确对齐

可能的错误:我使用
awk
lspv
输出进行了措辞,以获得/PP size/Total PP/Used PP/count,我不知道这在不同的AIX版本中是否有所不同


deccnt
-控制十进制计数,根据需要进行更改。只要稍加调整,它就可以作为脚本执行的参数提供

如果最长磁盘名短于磁盘大小总数,且磁盘大小总数大于8个字符,则会出现如下未命中对齐:

/apps/data/IAMV1/sys1    hdisk189 hdisk200 hdisk146 hdisk151 hdisk136 hdisk141
/apps/data/IAMV1/sys2    hdisk188 hdisk201 hdisk144 hdisk152 hdisk137 hdisk191
/apps/data/IAMV1/sys1    hdisk189 hdisk200   hdisk146 hdisk151 hdisk136 hdisk141
                         1000g    200000000g 1000g    1000g    3000g    1000g
                          300g         5000g  250g      90g      80g      30g 

/apps/data/IAMV1/sys2    hdisk188 hdisk201 hdisk144 hdisk152     hdisk137 hdisk191
                         1000g    2000g    1000g    10000000000g 3000g    1000g
                          300g     500g     250g             90g   80g      30g
通过在此处增加较低的8字符硬上限
BEGIN{lng=0;cap=8}')
可以进一步缓解此问题,但这也会增加磁盘列之间的默认间距。我不相信你会经常看到这种行为,但我想提一提。在任何其他情况下,对齐应良好

#!/bin/ksh

# Accuracy
deccnt='2'

# FS name lenght 
fsLng=$(lsvg -l rootvg | awk 'BEGIN{lng=0} !/N\/A/{if(NR>2){if (lng < length($7)){lng=length($7)}}} END{print lng}')
# Disk name lenght | cant be less than 8 
diskLng=$(lspv | awk 'BEGIN{lng=0;cap=8} !/N\/A/{if(NR>2){if(lng < length($1)){lng=length($1)}}} END{if(lng > cap){print lng}else{print cap}}')

for vg in $(lsvg -o)
do
  for fs in $(lsvgfs ${vg})
  do
    line1="$(printf "%-${fsLng}s  " ${fs})"
    line2="$(printf "%-${fsLng}s  " '')"
    line3="$(printf "%-${fsLng}s  " '')"

    for disk in $(lsvg -p $vg | awk '{if(NR>2){print $1}} END{print "hdisk0";print "hdisk0"}')
    do
      set -A diskparam $(lspv ${disk} | awk 'BEGIN{PPsize=0;PPtotal=0;PPused=0}
        /^PP SIZE:/{ if($4~"gigabyte" ){PPsize=$3}else 
                     if($4~"megabyte" ){PPsize=$3/1000}else 
                     if($4~"kilobyte" ){PPsize=$3/1000000} }
        /^TOTAL PPs:/{ PPtotal=$3 }
        /^USED PPs:/{ PPused=$3 }
        END{ GBtotal=PPtotal*PPsize
             GBused=PPused*PPsize
             print length(int(GBtotal))" "GBtotal" "GBused
           }
      ')

      NumWdt=$(( ${diskparam[0]}+${deccnt} ))
      [[ ${deccnt} -ne  0 ]] && (( NumWdt=NumWdt+1 )) # +1 due we have decimal point char

      if [[ ${NumWdt} -lt ${diskLng} ]]
      then
        colWdt=${diskLng}
      else
        colWdt=$(( ${NumWdt}+1 )) # +1 hence 'g' char make line2-3 larger if NumWdt control the column width. 
      fi

      if lspv -l ${disk} | grep -q " ${fs}$"
      then
        line1="${line1} $(printf "%-${diskLng}s%-$(( ${colWdt}-${diskLng} ))s" ${disk} '')"
        line2="${line2} $(printf "%${NumWdt}.${deccnt}f%-$(( ${colWdt}-${NumWdt} ))s" ${diskparam[1]} 'g')"
        line3="${line3} $(printf "%${NumWdt}.${deccnt}f%-$(( ${colWdt}-${NumWdt} ))s" ${diskparam[2]} 'g')"
      fi
    done
    print "${line1}\n${line2}\n${line3}\n"
  done
  print
done
#/bin/ksh
#准确度
deccnt='2'
#FS名称长度
fsLng=$(lsvg-l rootvg | awk'开始{lng=0}!/N\/A/{if(NR>2){if(lng2){if(lngcap){print lng}else{print cap}
以美元表示的vg(lsvg-o)
做
对于以美元表示的fs(lsvgfs${vg})
做
line1=“$(printf“%-${fsLng}s”${fs})”
第2行=“$(printf”%-${fsLng}s”“”)
第3行=“$(printf”%-${fsLng}s”“”)
对于$中的磁盘(lsvg-p$vg | awk'{if(NR>2){print$1}}}END{print“hdisk0”;print“hdisk0”})
做
set-A diskparam$(lspv${disk}awk'开始{PPsize=0;PPtotal=0;PPused=0}
/^PP大小:/{if($4~“GB”){PPsize=$3}其他
如果($4~“MB”){PPsize=$3/1000}其他
如果($4~“KB”){PPsize=$3/1000000}
/^PPs总数:/{PPtotal=$3}
/^已用PPs:/{PPused=$3}
结束{GBtotal=PPtotal*PPsize
GBused=PPused*PPsize
打印长度(int(GBtotal))“”GBtotal“”已使用
}
')
NumWdt=$(${diskparam[0]}+${deccnt}))
[${deccnt}-ne 0]&&((NumWdt=NumWdt+1))#+1,因为我们有小数点字符
如果[${NumWdt}-lt${diskLng}]]
然后
colWdt=${diskLng}
其他的
colWdt=$(${NumWdt}+1))#+1因此,如果NumWdt控制列宽,“g”字符会使第2-3行变大。
fi
如果lspv-l${disk}| grep-q“${fs}$”
然后
line1=“${line1}$(printf”%-${diskLng}s%-$(${colWdt}-${diskLng}))s“${disk}”)
line2=“${line2}$(printf”${NumWdt}.${deccnt}f%-$(${colWdt}-${NumWdt}))s“${diskparam[1]}'g')”
line3=“${line3}$(printf”${NumWdt}.${deccnt}f%-$(${colWdt}-${NumWdt}))s“${diskparam[2]}'g')”
fi
完成
打印“${line1}\n${line2}\n${line3}\n”
完成
打印
完成

对于您可以使用的空间
printf“%-22s”$fs
printf“%-8s”$disk
我没有AIX系统,您可以使用类似
df
的东西吗?它工作起来很有魅力谢谢,您对应该进行的改进是正确的,但结果仍然是正确的很好,我更新了我的答案,现在它更好地处理了数字和对齐。很好,我只是在这里添加了一些空格line2=“$(printf”%-${fsLng}s”“”)”line3=“$(printf”%-${fsLng}s”“””),因为结果显示在文件系统下,非常感谢您的帮助。