Хобрук: Ваш путь к мастерству в программировании

Недопустимый символ в выражении awk, python

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

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, которая работает. Кто-нибудь может помочь?

07.03.2012

  • Почему бы вам не заменить логику awk какой-нибудь логикой Python. 08.03.2012

Ответы:


1

Вам не нужно защищать 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."""

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

07.03.2012

2

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

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

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

cmd2 = ['awk', '{if ($9 != "%MEM") {print $9}}']
07.03.2012
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

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

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...