удаленный вызов оболочки с помощью awk из сценария perl

Я пытаюсь выполнить команды на удаленном хосте из Perl-скрипта.

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

Но awk возвращает мне всю строку вместо одного столбца.

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

мне нужно только

48%

Похоже, есть проблема с побегом, но не знаю, что именно не так. Пожалуйста помоги.


person user947668    schedule 29.12.2014    source источник
comment
это работает? Где ваши конечные двойные кавычки? Что вы избегаете кавычек и $?   -  person SMA    schedule 29.12.2014
comment
Я не уверен, но попробуйте убрать кавычки вокруг команды. то есть: $check = `rsh host1 df -k /backup/|tail -1|awk '{print \$5}'`; должен делать   -  person Tensibai    schedule 29.12.2014
comment
Это не код Perl. Perl использует print, а не echo. Это может быть php.   -  person TLP    schedule 29.12.2014
comment
действительно должна быть печать. обновлен   -  person user947668    schedule 29.12.2014


Ответы (1)


Один из вариантов — использовать qx с одинарной кавычкой в ​​качестве разделителя, чтобы переменные Perl не интерполировались:

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

Я использовал двойные кавычки вокруг команды awk, поэтому по-прежнему необходимо экранировать $5, чтобы предотвратить ее интерпретацию как переменную оболочки.

Если вам удобно запускать tail и awk на локальном компьютере, вы можете удалить двойные кавычки:

$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];
person Tom Fenech    schedule 29.12.2014
comment
Какой классный ответ! Спасибо за ваши советы. - person user947668; 29.12.2014