【问题标题】:Unable to get output from awk in a variable using Perl Script.无法使用 Perl 脚本从变量中的 awk 获取输出。
【发布时间】:2015-01-06 09:36:06
【问题描述】:

我是 Perl 脚本的新手。我正在编写必须获得 CPU 利用率的代码。我正在尝试运行命令,然后在变量中获取输出。但是当我尝试打印变量时,屏幕上什么也没有。

命令在终端中运行良好并给我一个输出。 (我使用的是 Eclipse)。

my $CPUusageOP;
$CPUusageOP = qx(top -b n 2 -d 0.01 | grep 'Cpu(s)' | tail -n 1 | gawk '{print $2+$4+$6}'); 
print "O/P of top command ", $CPUusageOP;

我得到的输出是:

    O/P of top command

预期输出:

    O/P of top command 31.4

谢谢。

【问题讨论】:

  • 调用greptailawk 的Perl 脚本有什么意义?我打赌你可以在perlawk 中完成所有这些操作。

标签: perl awk qx


【解决方案1】:

qx() 将在您的gawk 中插入$2 等,如果您使用了警告,您就会知道

use strict;
use warnings;

所以你需要逃避它们:

... gawk '{print \$2+\$4+\$6}'); 

当然,这在 Perl 中是一件愚蠢的事情。除了top(在某些模块中可能仍然可用)之外,您可以执行所有这些操作。例如:

my @lines = grep { /\QCpu(s)/ } qx(top -b n 2 -d 0.01);
my $CPUusageOP = $lines[-1];
$CPUusageOP = ( split ' ', $CPUusageOP )[1,3,5];

我不记得awk 是否以$1$0 开头字段名称,但可以随意调整。

【讨论】:

  • 很好的解释和详细的答案。在awk 中,$0 指的是当前记录(通常是行),而$1 是第一个字段,$2 第二个字段,...
  • 你可以使用pop @{[ grep ... ]}来保存一行。
【解决方案2】:

除了top,您无需使用任何外部工具。 Perl 可以完成剩下的工作:

#!/usr/bin/perl
use warnings;
use strict;

my $line;
open my $TOP, '-|', qw( top -b n 2 -d 0.01 ) or die $!;
while (<$TOP>) {
  $line = $_ if /Cpu\(s\)/;
}
my ($us, $ni, $wa) = (split ' ', $line)[1, 3, 5];
{   no warnings 'numeric';
    print $us + $ni + $wa, "\n";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2022-11-23
    • 2012-02-01
    • 2012-02-18
    • 1970-01-01
    • 2017-09-03
    相关资源
    最近更新 更多