【问题标题】:How do I replace G with white space?如何用空格替换 G?
【发布时间】:2020-04-10 22:35:47
【问题描述】:

我必须检查磁盘卷上的可用空间并使用命令df -h,它会产生以下输出:

Filesystem            Size  Used Avail Use% Mounted on
/dev/md0               27G   24G  2.1G  92% /
udev                  506M  112K  506M   1% /dev
/dev/sda1             102M   40M   63M  39% /boot

这段脚本

my (@space, @freesp);
@space = grep /\/dev\/md0/,`df -h`;
print "@space\n";

给我

/dev/md0               27G   24G  2.1G  92% /

我可以在空格上拆分,给出$freesp[0]$freesp[1] 等中的值。

但我想用空格删除或替换 G,以便我可以将 $freesp[3] 与某个值进行比较,然后继续执行我的脚本。

那么我必须使用什么正则表达式才能做到这一点,或者还有其他更好的方法吗?

这段代码对我有用,但我正在寻找我提到的方向。

#!/usr/bin/perl

use strict;
use warnings;

my (@space, @freesp);

@space = grep /\/dev\/md0/, `df`;

print "@space\n";

for (@space) {
    chomp;
    @freesp = split /\s+/, $_;
}

if ($freesp[3]/1024/1024 < 2.0) {
    print "Space is less\n";
}
else {
    print "Space is OK\n";
}

#print ($freesp[3]/1024/1024);

【问题讨论】:

标签: regex perl


【解决方案1】:

如果您打算使用脚本解析输出,真正的解决方案是not to use the -h option to df。这样一来,输出首先就不会包含“人类可读”K / M / G 后缀。

您可能希望改用 -B1 选项,这会导致所有大小都以字节为单位报告。


编辑:要回答字面问题,您可以删除后缀并像这样适当地重新调整值:

my %units = (K => 2**10, M => 2**20, G => 2**30, T => 2**40,
             P => 2**50, E => 2**60, Z => 2**70, Y => 2**80);

s/^(\d+(?:\.\d+)?)([KMGTPEZY])$/$1 * $units{$2}/e for @freesp[1 .. 3];

但是,使用-B1 开关而不是-h 会更容易获得相同的结果,更不用说更准确和更可靠了。

【讨论】:

  • 是的,我知道使用 df 并除以 1024 来获得我们的 O/p ,但我想知道是否有与我提到的内容相关的任何方法............如果一个数字后跟 G 则将 G/M/K 替换为空格
  • **#!/usr/bin/perl 使用严格;使用警告;我的 (@space,@freesp); @space=grep /\/dev\/md0/,df;打印“@space\n”; for(@space){ chomp; @freesp=拆分 /\s+/ ,$_; } if ($freesp[3]/1024/1024
  • @mViswa 通过使用人类可读的格式并删除G/M/K 然后进行比较,您可能希望获得什么?如果您打算使用脚本解析输出,请不要使用 -h 选项。
  • @mViswa:不使用-h 并依靠空白字母的原因是因为磁盘可能会填满并报告 700M 空闲。 700M 比 20G 小很多,但是,当你把字母删掉时,700 > 20。
猜你喜欢
  • 1970-01-01
  • 2018-02-09
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2011-07-10
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多