在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
具有相同的结果。