^ синтаксическая ошибка в awk при вызове через ssh

^ синтаксическая ошибка в awk при вызове через ssh

Я запускаю команду использования файловой системы, чтобы обнаружить /varиспользование файловой системы свыше 80% с одного хоста на несколько удаленных хостов.

Моя команда выполняется нормально ( df -h /var | awk '$1 > 80'), но при sshэтом возникают синтаксические ошибки.

for i in `cat /etc/gridhosts`; do ssh -n -o BatchMode=yes ${i} "df -h /var | awk '$4 > 80'" ; done
awk:  > 80
awk:  ^ syntax error
awk:  > 80
awk:  ^ syntax error
awk:  > 80

решение1

Проблема в том, что $4в awkпрограмме есть часть строки в двойных кавычках. Поскольку она в двойных кавычках, (локальная) оболочка расширит ее перед вызовом ssh.

В оболочке $4— это 4-й позиционный параметр, который, скорее всего, пуст. Это означает, что $4в awkкоде будет заменено пустой строкой, что приведет к недействительной awkпрограмме.

В этом случае нет необходимости запускать awkкоманду на удаленном хосте. Вместо этого просто выполните

while IFS= read -r remote; do
    ssh -n -o BatchMode=yes "$remote" 'df /var' | awk 'FNR == 2 && $5 > 80'
done </etc/gridhosts

Обратите внимание, что я изменил awkкод, чтобы он смотрел $5на строку 2, а не на $4каждую строку, так как именно там обычно находится процент. Кроме того, я удалил опцию -hfor, dfтак как она не нужна, и заставил цикл читать входной файл построчно, а не разворачивать все содержимое файла в forзаголовке цикла (что неэлегантно и может, в общем случае, съедать много памяти без необходимости).

Вас также может заинтересовать Ansible или аналогичное программное обеспечение, поскольку оно значительно упростит выполнение операций в масштабах всего кластера.

Связанный контент