在 perl 脚本中使用 awk 命令

在 perl 脚本中使用 awk 命令

有人能建议如何在 perl 脚本中使用命令管道吗?特别是涉及调用的命令awk

我正在尝试创建一个 perl 脚本,它将读取磁盘使用情况df -H并返回输出的倒数第二行,该行显示 %use。直接在终端中输入命令将返回所需的输出。

df -H | awk '{print $(NF-3)}'

此命令返回了正确的结果。但是在反向勾选实用程序中使用相同命令时,perl 脚本会抛出很多错误。

$thirdlast=`df -H | awk '{print $(NF-3)}'`;
print $thirdlast;

为什么同样的命令在脚本中无法运行?还有其他方法可以返回所需的结果吗?

答案1

主要问题是$对 perl 来说很重要。在系统命令中使用它时,需要对其进行转义:

$thirdlast=`df -H | awk '{print \$(NF-3)}'`;
print $thirdlast;

否则,perl 将尝试扩展$(NF-3)为 perl 变量。变量$( perl 进程的真实 GID 是

$(

此进程的实际 gid。如果您所在的计算机支持同时加入多个组,则将给出以空格分隔的您所在组的列表。

该变量$)是进程的有效 GID:

因此,$(NF-3)计算结果为list of groups you are a member of NF-3)。例如,在我的系统上,即:

$ perl -le 'print "$(NF-3)"'
1001 27 29 111 112 1001NF-3)

下一个问题是你的awk调用是错误的。%使用的$(NF-1),而不是$(NF-3)。因此,你想要的是:

$thirdlast=`df -H | awk '{print \$(NF-1)}'`;

或者,仅打印超过某个阈值的百分比,例如 90:

$thirdlast=`df -H | awk '(\$(NF-1)>90){print \$(NF-1)}'`;

无论如何,您都可以df在 Perl 本身中处理输出:

$thirdlast=`df -H`;
@matches=($thirdlast=~/(\S+%)/g);
print "@matches\n";

或者

@matches=(`df -H`=~/(\S+%)/g);
print "@matches\n";

并设置一个阈值:

@matches=(`df -H`=~/(\S+%)/g);
@above90=grep {$_>90} @matches;
print "@above90\n";

或者更直接地说:

@matches=grep {$_ >90} (`df -H`=~/(\S+%)/g);
print "@matches\n";

会将变量中正@array=($variable=~/foo/g)则表达式的所有匹配项保存到数组中。这与使用 解析 的结果相同。foo$variable@matchesdfawk

相关内容