在perl脚本中使用awk命令

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

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

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

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

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

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

主要问题是$对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)}'`; 

无论如何,您只需在Perl中处理df的输出:

 $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)会将变量$variable @matches则表达式foo所有匹配保存到数组@matches 。 这将与使用awk解析df具有相同的结果。