Неверный символ в выражении awk, python - PullRequest
2 голосов
/ 07 марта 2012

У меня есть команда, которая выглядит так:

ps v -p 2585 | awk '{if ($9 != "%MEM") {print $9}}'

Теперь это нормально работает в bash, просто занимает часть памяти любого pid, который вы ему даете. Тем не менее, я сейчас пытаюсь реализовать его в Python, но у меня есть некоторые проблемы. Вот что у меня в питоне

cmd1 = ['ps', 'v', '-p', pid]
cmd2 = ['awk', '\'{if ($9 != "%MEM") {print $9}}\'']

Теперь, чтобы запустить их ...

runcmd1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
runcmd2 = subprocess.Popen(cmd2, stdin=runcmd1.stdout, stdout=subprocess.PIPE)

Я получаю эту ошибку:

awk: '{if (\$9 != "%MEM") {print \$9}}'
awk: ^ invalid char ''' in expression

Я использовал это, чтобы распечатать, как команда выглядела вместе ... sys.stdout.write ('' .join (cmd1) + '' + '|' + '' + '' .join (cmd2) + '\ n')

И это дало:

ps v -p 1073 | awk '{if ($9 != "%MEM") {print $9}}'

Я не вижу разницы между этой и действующей командой bash, которая работает. Кто-нибудь может помочь?

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

Вам не нужно защищать команды awk от оболочки, когда вы запускаете ее через popen (аргументы уже разбиты на список, поэтому ваш пробел оставлен в покое).

cmd2 = ['awk', '{if ($9 != "%MEM") {print $9}}']

будет работать нормально.


Примечание для дальнейшего использования

В Python есть несколько хороших способов написания строк, которые избегают экранирования, как вы пытались сделать здесь, в ситуациях, когда вам это нужно:

'''In this string, I don't need to escape a single ' character,
   or even a new-line, because the string only ends
   when it gets three ' characters in a row like this:'''

"""The same is true of double-quotes like this.
Of course, whitespace and both the ' and " quote characters
are safe in here."""

(хотя я не могу гарантировать, что префиксатор исходного кода будет правильно отображать его здесь)

2 голосов
/ 07 марта 2012

Когда вы запускаете команду в bash, bash удаляет одинарные кавычки и дает awk первый аргумент:

{if ($9 != "%MEM") {print $9}}

Вы даете ей одинарные кавычки, чего не следует делать.Вы должны просто написать:

cmd2 = ['awk', '{if ($9 != "%MEM") {print $9}}']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...