【问题标题】:remote shell call with awk from perl script来自 perl 脚本的 awk 远程 shell 调用
【发布时间】:2015-02-25 11:38:39
【问题描述】:

我正在尝试通过 perl 脚本在远程主机上执行命令。

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

但是 awk 会返回整个字符串而不是一列。

/dev/md/dsk/d10      4133838 1936684 2155816    48%    /

我只需要

48%

看起来在转义中存在问题,但不知道到底出了什么问题。请帮忙。

【问题讨论】:

  • 这行得通吗?你的结尾双引号在哪里?你在转义引号和 $ 什么?
  • 我不确定,但请尝试删除命令周围的引号。即:$check = `rsh host1 df -k /backup/|tail -1|awk '{print \$5}'`; 应该这样做
  • 那不是 Perl 代码。 Perl 使用print,而不是echo。可能是 php。
  • 确实应该打印。更新

标签: perl shell awk rsh


【解决方案1】:

一种选择是使用 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];

【讨论】:

  • 多么棒的答案!感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 2020-01-08
  • 2015-11-08
  • 2012-05-30
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
相关资源
最近更新 更多