2015-12-22 2 views
0

У меня есть команда unix (aix), которая включает небольшой скрипт awk. Он работает, и вот он ...Команда Escape awk

ps -eaf | awk 'ARGIND == 1 {$pids[$0] = 1} ARGIND > 1 {if ($2 in pids) printf("%s\n",$0)}' /home/richard/myFile.flg - 

Когда я запускаю эту команду из другой коробки, используя ssh, она не работает.

ssh [email protected] ps -eaf | awk 'ARGIND == 1 {$pids[$0] = 1} ARGIND > 1 {if ($2 in pids) printf("%s\n",$0)}' /home/richard/myFile.flg - 

Я работал, что мне нужно процитировать сценарий AWK и избежать некоторых символов в команде AWK, но я не могу получить право ускользает.

Может кто-нибудь мне поможет, указав часть awk скрипта и избегая того, что требуется.

благодаря

+1

«это не работает» - Разработка плз. –

+0

'$ pids [$ 0]' должно быть 'pids [$ 0]'. Удачи. – shellter

+0

@shellter: это правда, и я исправил свой ответ. Но знак отклоненного доллара не влияет на наблюдаемое поведение сценария. – rici

ответ

1

В подобных случаях вам нужно двойное экранирование , это должно работать:

ssh [email protected] "ps -eaf | awk \"ARGIND == 1 {\\\$pids[\\\$0] = 1} ARGIND > 1 {if (\\\$2 in pids) printf(\\\"%s\n\\\",\\\$0)}\" /home/richard/myFile.flg -" 
+0

спасибо, что двойное экранирование работало здесь и было самым простым решением – Richie

4

Что происходит, когда вы выполняете

ssh [email protected] ps -eaf | ... 

что ps -eaf запускается на другом поле, а выход возвращается; ssh затем записывает вывод, который он получает, на свой собственный stdout, который (локально) перенаправляется через команду ...; в этом случае, команда awk.

К сожалению, (я полагаю) /home/richard/myFile.flg находится на удаленной маше, а не на локальной машине, поэтому команда awk терпит неудачу.

Чтобы получить все, что нужно запустить на удаленной машине, вам необходимо предоставить его как единственный аргумент; один способ, который не требует много усилий, квотирование является использование здесь-документ:

ssh [email protected] "$(cat<<"END" 
ps -eaf | 
awk 'ARGIND == 1 {pids[$0] = 1} 
    ARGIND > 1 {if ($2 in pids) printf("%s\n",$0)}' \ 
    /home/richard/myFile.flg - 
END 
)" 

Обратите внимание, что printf("%s\n",$0) действительно просто сложный способ написания print, так что вы могли бы упростить удаленную команду совсем немного. Но вам все равно придется иметь дело с одиночными кавычками в команде AWK:

ssh [email protected] ' 
    ps -eaf | 
    awk '"'"'ARGIND == 1 {pids[$0] = 1; next} 
      $2 in pids {print}'"'"' \ 
     /home/richard/myFile.flg -' 

Чтобы понять '"'"', вам нужно разбить его на куски:

'  close '-quoted string 
"'" A (quoted) ' 
'  open another '-quoted string 
0

Если вы можете использовать синтаксис Баш в $ «строка», то все остается довольно читаемым; в этом случае нужно только, чтобы избежать одинарные кавычки и : обратные слэши

$'ps -eaf | 
    awk \' 
    ARGIND == 1 {$pids[$0] = 1} 
    ARGIND > 1 {if ($2 in pids) printf("%s\\n",$0)}\' /home/richard/myFile.flg -' 
Смежные вопросы