有人能建议如何在 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
@matches
df
awk