问题描述
|
我需要一些帮助来调整我的代码,以在此Unix
df
输出中寻找另一个属性:
例如
Filesystem Size Used Avail Capacity Mounted on
/dev/ad4s1e 61G 46G 9.7G 83% /home
到目前为止,我可以提取容量,但是现在我想添加Avail。
这是我的perl产品线,可满足您的需求。我如何获得“可用” ??谢谢!
my @df = qx (df -k /tmp);
my $cap;
foreach my $df (@df)
{
($cap) =($df =~ m!(\\d+)\\%!);
};
print \"$cap\\n\";
解决方法
这样的优点是可以为您查询每个文件系统的所有信息提供一个不错的数据结构。
# column headers to be used as hash keys
my @headers = qw(name size used free capacity mount);
my @df = `df -k`;
shift @df; # get rid of the header
my %devices;
for my $line (@df) {
my %info;
@info{@headers} = split /\\s+/,$line; # note the hash slice
$info{capacity} = _percentage_to_decimal($info{capacity});
$devices{ $info{name} } = \\%info;
}
# Change 12.3% to .123
sub _percentage_to_decimal {
my $percentage = shift;
$percentage =~ s{%}{};
return $percentage / 100;
}
现在,每个设备的信息都在散列中。
# Show how much space is free in device /dev/ad4s1e
print $devices{\"/dev/ad4s1e\"}{free};
这不是最简单的方法,但它是处理df信息的最通用的方法,将所有信息放入一个可以根据需要传递的漂亮数据结构中。这比将其全部分割为单个变量及其应习惯的技术要好。
更新:
要获得容量大于60%的所有设备,您需要遍历哈希中的所有值,然后选择容量大于60%的设备。除容量存储为字符串之类的“ 88%”外,这对比较没有用。我们可以在此处删除%,但是然后我们会在要使用它的任何地方这样做。最好预先对数据进行规范化处理,从而使其更易于使用。存储格式化的数据是一个危险信号。因此,我修改了上面的代码,该代码从ѭ0读取,以将容量从88%更改为.88。
现在,它更易于使用。
for my $info (values %devices) {
# Skip to the next device if its capacity is not over 60%.
next unless $info->{capacity} > .60;
# Print some info about each device
printf \"%s is at %d%% with %dK remaining.\\n\",$info->{name},$info->{capacity}*100,$info->{free};
}
我选择在这里使用printf而不是插值,因为这样可以更容易地看到输出时字符串的样子。
, 简单的perl方法:
perl -MFilesys::Df -e \'print df(\"/tmp\")->{bavail},\"\\n\"\'
, 您是否尝试过仅在空白处拆分并采用第4列和第5列?
my @cols = (split(/\\s+/,$_));
my $avail = $cols[3];
my $cap = $cols[4];
(如果设备名称中当然有空格,则失败...)
, 我们改为拆分,然后从结果数组中获取args。例如。
my @values = split /\\s+/,$df;
my $avail = $values[3];
要么:
($filesystem,$size,$used,$avail,$cap,$mount) = split /\\s/,$df;
, 我认为最好将行分开,跳过第一行。由于您不介意使用@df
和$df
,因此我也不会:
my @df = qx(df -k /tmp);
shift @df; # Lose df heading line
foreach my $df (@df)
{
my($system,$capacity,$mount) = split / +/,$df;
....
}
这一次为您提供所有字段。现在,您只需要解释\'G \'并丢失\'%\',依此类推。
, foreach my $device ( @df ) {
next unless $device =~ m{^/};
my( $filesystem,$mounted ) = split /\\s+/,$device;
# you take it from there.... ;)
}
, 这里的主题有很多变化。我会保留第一行,因为它提供了一个不错的标题:
$ perl -E \'$,= \“ \”;打开我的$ fh,\“-| \”,\“ df -k / tmp \”;
while(<$ fh>){@ a = split;说@a [3,4]} \'
再次考虑,这要干净得多:
$ df -k / tmp | perl -naE \'$,= \“ \\ t \”;说@F [3,4] \'
可用容量
20862392 92%
最后的想法:根本不使用perl:
$ df -h / tmp | tr -s \'\'\'\\ t \'|切-f 3,4
要么
$ df -h / tmp | awk \'{print $ 3 \“ \\ t \” $ 4} \'