使用Perl脚本从远程Shell调用awk

3
我正在尝试从Perl脚本执行远程主机上的命令。
$check = `rsh host1 "df -k /backup/|tail -1|awk \'{print \$5}\'"`;
print $check

但是awk返回了整个字符串而不是一个列。
/dev/md/dsk/d10      4133838 1936684 2155816    48%    /

I need only

48%

看起来有一个转义问题,但不知道具体错在哪里。请帮忙。


2
这个工作了吗?你的结束双引号在哪里?你为什么要转义引号和$符号? - SMA
1
我不确定,但是尝试删除命令周围的引号。例如:$check = \rsh host1 df -k /backup/|tail -1|awk '{print $5}'`;` 应该可以。 - Tensibai
2
那不是 Perl 代码。Perl 使用 print,而不是 echo。可能是 PHP。 - TLP
确实应该打印。已更新。 - user947668
1个回答

3

一种选择是使用单引号作为分隔符,同时使用qx,这样Perl变量就不会被插值:

$check = qx'rsh host1 "df -k /backup/|tail -1|awk \"{print \$5}\""';

我在awk命令周围使用了双引号,因此仍然需要转义$5以防止它被解释为shell变量。

如果您愿意在本地运行tailawk,则可以删除双引号:

$check = qx'rsh host1 df -k /backup/|tail -1|awk "{print \$5}"';

这样会导致更多的数据从远程计算机复制回来,这可能是个问题也可能不是。

或者,您可以使用Perl拆分输出并完全避免该问题:

$check = (split /\s+/, qx'rsh host1 "df -k /backup/|tail -1"')[4];

1
太棒了!谢谢您的建议。 - user947668

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接