有人可以建议如何在 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)
为什么相同的命令没有在脚本中运行?有没有其他方法可以返回所需的结果?
主要问题是$对 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。