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$