linux + 打印根文件系统大小

linux + 打印根文件系统大小

lvs 是一个很好的命令,可以向我们显示文件系统的大小

lvs
  LV      VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_root vgW -wi-ao---- 100.00g
  lv_swap vgW -wi-ao----   7.72g
  lv_var  vgW -wi-ao---- 100.87g

我正在尝试捕获根文件系统大小

到目前为止我创建了以下语法

lvs | awk  '$1 ~ /root/' | awk '{print $NF}' | sed s'/\./ /g' | awk '{print $1}'

及其打印(预期输出为 100 )

100

但我想改进我的语法以便更好

有什么建议 ?

答案1

lvs显示有关 LVM 卷的信息。它可以为您提供包含根文件系统的块设备的大小(不是该文件系统的大小),如果该文件系统恰好位于 LVM 卷上并且您知道是哪一个(不,是逻辑卷的名称)不是其中有“根”)。

size=$(
  lvs --unit b --nosuffix --no-headings --config 'log{prefix=""}' -o size vgW/lv_root
)

要找出包含根文件系统的块设备的大小,无论是 LVM 卷还是磁盘分区还是 NBD/loop/md... 设备(但请注意,根文件系统不必由块支持)设备(例如网络文件系统、zfs、btrfs...),在 Linux 上,我会使用lsblk

size=$(
  lsblk -Jbo size,mountpoint | jq '.blockdevices[]|select(.mountpoint=="/").size'
)

要查找文件系统的大小/,您可以使用df(假设 GNU df)或findmnt

size=$(findmnt -bno size /)
size=$(df -B1 --output=size / | awk 'NR==2{print $1}')

这些给出了以字节为单位的大小,即最精确的大小。如果您希望大小向下舍入为整数 GB,只需除以 1000000000:

gigabytes=$((size / 1000000000))

或者要以 gibibytes 为单位(请注意,lvs使用基于 1024 的后缀,其中g表示 gibibyte,而不是 gigabyte),请使用:

gibibytes=$((size / 1024 / 1024 / 1024))

尽管上面的所有命令也允许指定不同的单位(但要注意千兆字节与千兆字节,并且大多数命令都会为您提供浮点数,并且可能会进行不同的舍入,并根据区域设置使用不同的字符作为小数基数)。

答案2

您可以轻松地将所有这些集成到一个awk调用中:

lvs | awk '$1=="lv_root" {split($4,a,"."); print a[1]}'

这将仅检查第一个字段结束进程,其中该行等于lv_root。然后它将把 处的第四个字段拆分到.数组中a并打印第一个条目,对应于 之前的部分.

可以通过使用 将大小打印为整数来实现相同的效果printf,这也会将浮点数截断为最接近的数字较小整数(有趣的是忽略数字部分后面的“文本部分”,在本例中为g):

lvs | awk '$1=="lv_root" {printf "%d\n",$4}'

笔记这不等于将大小四舍五入到最接近的整数。如果你想实现这一点,你可以使用

lvs | awk '$1=="lv_root" {printf "%.0f\n",$4}'

答案3

awk '$1 ~/root$/{gsub(/\..*/,"",$NF);print $NF}' filename

输出

praveen:/tmp$ awk '$1 ~/root$/{gsub(/\..*/,"",$NF);print $NF}' filename
100
praveen@praveen:/tmp$ 

相关内容