在 perl 脚本中使用 awk 命令

kir*_*bnl 2 scripts perl awk

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

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

df -H | awk '{print $(NF-3)}'
Run Code Online (Sandbox Code Playgroud)

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

$thirdlast=`df -H | awk '{print $(NF-3)}'`;
print $thirdlast;
Run Code Online (Sandbox Code Playgroud)

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

ter*_*don 6

主要问题是$对 perl 很重要。当你在系统命令中使用它时,你需要转义它:

$thirdlast=`df -H | awk '{print \$(NF-3)}'`;
print $thirdlast;
Run Code Online (Sandbox Code Playgroud)

否则,perl 将尝试扩展$(NF-3)为 perl 变量。变量$( 是 perl 进程的真实 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)
Run Code Online (Sandbox Code Playgroud)

下一个问题是你的awk调用是错误的。的%用途是$(NF-1),不$(NF-3)。所以,你想要的是:

$thirdlast=`df -H | awk '{print \$(NF-1)}'`;
Run Code Online (Sandbox Code Playgroud)

或者,仅打印高于特定阈值的百分比,例如 90:

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

在任何情况下,您都可以df在 Perl 本身中处理输出:

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

或者

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

并设置阈值:

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

或者,更直接:

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

@array=($variable=~/foo/g)将保存的正则表达式的所有比赛foo在变量$variable到阵列@matches。这将与解析dfwith具有相同的结果awk