gpt4 book ai didi

linux - 通过 : use Shell; 重现结果

转载 作者:太空宇宙 更新时间:2023-11-04 09:54:00 25 4
gpt4 key购买 nike

我正在尝试以三种不同的方式重现相同的结果,但在使用“使用 Shell;”时无法弄清楚如何让它工作; (下面的方法 2a),有帮助吗?

#!/usr/bin/perl
# v5.10.1 / linux
use strict;
use warnings;
use Shell;

# method 1 start
my $result = `df -H | grep -vE '^Filesystem|tmpfs|cdrom|none' | awk '{ print \$5 "\t" \$1}'`;
print $result . "\n";
# end of method 1

# I would like to try to reproduce the above but by using "use Shell", even if the above is already somehow using such anyway?!
# method 2a start
my $result2 = df ("-H"); # use powers of 1000 not 1024 # human readable
print $result2 . "\n"; # I can only get it working up to here
# end 2a

# 2b)
# or use regexs on df -H's output
my @linesofoutput= $result2=~/(.*?)\n/g; # needs checking to see if I'm getting the lines right with this?!

foreach my $temp(@linesofoutput){

if (($temp =~ /^Filesystem/)||($temp =~ /^tmpfs/)||($temp =~ /^cdrom/)||($temp =~ /^none/)){
# do nothing for lines starting with Filesystem, tmpfs or cdrom or none
# print "Do not show: $temp\n";
}else{
#print "$temp\n"; # lines wanted
my @words = split(/\s/, $temp); # make an array out of each line, splitting on any whitespace character: space, tab, newline, etc
@words = grep(!/^$/, @words); # remove empty elements. check this(not starting with, ending with)???

print "$words[4]". "\t"."$words[0]"."\n"; # filesystem entries are in index0, size index1, used index2, avail 3...
# be careful of /path/name of file or folder... because of the gaps, and so they could be made up of multi indexs
}
}
# end of method 2b

最佳答案

如果我理解正确,方法 2a) 应该将 df -H 的输出通过管道传输到 grep,然后通过管道传输到 awk。简而言之:您想完成方法 1 的完整重定向工作,这是由 perl 中隐式启动的 shell 完成的。

Shell 包将不会在这里帮助您。该包的唯一目的是,您可以轻松地调用一个命令。所以 df("-H") 有效,但就是这样。

如果您考虑一下,这并没有什么大损失:您所需要的只是 df 的输出。剩下的就是解析和处理该输出——应该在 perl 本身中完成的事情。所以方法 2b 无论如何是更好的方法 - 如果你像这样稍微完善一下:

my @lines = df("-H");
shift @lines; # get rid of "Filesystem..."
for( @lines ){
next if /^tmpfs|cdrom|none/;
my @words = split('\s+', $_);
print $words[4], "\t", $words[0], "\n";
}

我还可以提出方法 3:用 perl 中的内容替换对“df -H”的调用。以下是一些使用 statfs(2)statvfs(2) 系统调用的 CPAN 模块:

关于linux - 通过 : use Shell; 重现结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7703435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com