【问题标题】:Find available space in /tmp on a remote machine在远程机器上的 /tmp 中查找可用空间
【发布时间】:2013-05-24 11:55:35
【问题描述】:

我想找出远程机器上 /tmp 中的可用空间。我可以在我的机器上使用以下命令:

ssh host-name df /tmp |  awk '{ print $4 }' | tail +2`

IT 工作并给出类似这样的输出:9076656,可用空间以 KB 为单位。

但是当我把这个命令放到一个 perl 程序中时,我收到了关于使用未初始化的 $4 值的错误消息。

在连接中使用未初始化的值 $4

这是我在 perl 代码中的做法:

my $output = `ssh $server df /tmp |  awk '{ print $4 }' | tail +2`;

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 有趣的是,当它表现出编程问题时,这是如何“离题”的,需要一些关于编程语言中字符串插值的 cmets,并且已经收到了编程解决方案。我猜 Perl 标签上充斥着大量的问题,以至于你们被要求手指发痒,嗯?

标签: perl bash shell ssh


【解决方案1】:

鉴于 Perl 能够读取文件、解析字段等,使用 Perl 生成 awk 脚本似乎有点多余(而且重量级)。我宁愿 investigate reading a process' output via Perl and splitting the output lines

【讨论】:

    【解决方案2】:

    问题在于 $4 是由 Perl 插值的,就像您期望 $server 被插值而不是字面值一样。直接的解决方案是避开美元符号:\$4。然而,正如 Brian Agnew 所说,在 perl 中使用 awk 来做一些 perl 擅长的事情是非常多余的。

    use strict;
    use warnings;
    use Data::Dumper;
    
    my @output = `ssh $server df /tmp`;      # capture output in array
    @output = map { ( split )[3] } @output;  # take only 4th field
    print Dumper \@output;                   # display data
    

    然后您可以使用各种数组工具将@output 修剪为您喜欢的,例如pop,push,shift,unshift,splice,使用切片和下标。例如,取除前两行之外的所有行:

    print @output[2 .. $#output];
    

    删除前两行:

    splice @output, 0, 2;
    

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 1970-01-01
      • 2012-03-24
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多