awk输出到变量并更改目录

时间:2016-06-25 07:51:04

标签: perl variables awk chdir

在下面的脚本中。我无法更改目录。我需要像该目录中70%以上的磁盘一样消耗更多空间。

#!/usr/bin/perl
use strict;
use warnings;
my $test=qx("df -h |awk \+\$5>=70 {print \$6} ");
chdir($test) or die "$!";
print $test;
system("du -sh * | grep 'G'");

2 个答案:

答案 0 :(得分:3)

无需在您的情况下调用awk,因为Perl非常善于分割和打印某些行本身。您的代码存在一些问题:

  1. 代码qx("df -h |awk \+\$5>=70 {print \$6} ")尝试执行 字符串 "df -h | awk ..."作为失败的命令,因为没有名为{的命令{1}}。当我运行该代码时,我得到"df -h | awk"。您可以通过删除引号sh: 1: df -h |awk +>=70 {print } : not found来解决此问题,因为"已经 引用。变量qx()之后为空,因此$test会更改为chdir目录。

  2. 然后您会看到下一个错误:$HOME,因为它会调用awk: line 1: syntax error at or near end of line。正确的是awk +\$5>=70 {print \$6},即awk '+\$5>=70 {print \$6}'小脚本周围有'个刻度。

  3. 正如评论中所述,awk将长行拆分为两行。例如:

    df -h

    使用Filesystem 1K-blocks Used Available Use% Mounted on /long/and/possibly/remote/file/system 10735331328 10597534720 137796608 99% /local/directory 获得有保证的列顺序和一行输出

  4. 最后一次df -hP调用显示包含字母system的所有行的目录用量(空格)。我估计这不完全是你想要的。

  5. 我建议使用以下Perl脚本:

    G

答案 1 :(得分:2)

#!/usr/bin/perl
use strict;
use warnings;
my @bigd = map { my @f = split " "; $f[5] } 
           grep { my @f = split " "; $f[4] =~ /^(\d+)/ && $1 >= 70} 
           split "\n", `df -hP`;
print "big directories: $_\n" for @bigd;
for my $bigd (@bigd) {
    chdir($bigd);
    my @bigsubd = grep { my @f = split " "; $f[0] =~ /G/ }
                  split "\n", `du -sh *`;
    print "big subdirectories in $bigd:\n";
    print "$_\n" for @bigsubd;
}

我相信你想做这样的事情。