2016-10-25 6 views
1

У меня есть задача ткани следующим образом:Побег AWK специальный символ в Python

@task 
def getCrons(): 
    timeStampNowServer = sudo("date +%s%3N", pty=False) 
    cronLogFiles = sudo(
     "find /home/logs/cron/ -maxdepth 2 -type f -mtime -1 -name '*.log'", pty=False) 
    cronLogFiles = cronLogFiles.splitlines(True) 
    for cronLog in cronLogFiles: 
     info = sudo(
      "awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next}; pr {printf \" % s\n % s\n % s\n\", prev, cur, $0; pr=0}'{0}".format(cronLog), pty=False) 
     print(info) 

Я имею следующий отслеживающий:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/site-packages/fabric/main.py", line 743, in main 
    *args, **kwargs 
    File "/usr/lib/python2.7/site-packages/fabric/tasks.py", line 379, in execute 
    multiprocessing 
    File "/usr/lib/python2.7/site-packages/fabric/tasks.py", line 274, in _execute 
    return task.run(*args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/fabric/tasks.py", line 174, in run 
    return self.wrapped(*args, **kwargs) 
    File "/home/lbn/k.sewnundun/fabfile/kse/test.py", line 18, in getCrons 
    "awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next}; pr {printf \"%s\n%s\n%s\n\", prev, cur, $0; pr=0}'{0}".format(cronLog), pty=False) 
KeyError: 'prev=$0; next' 

Команда, которую я хочу выполнить на сервере:

awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next}; pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' mylog.LOG 

Однако я не могу избежать символов в строке:

info = sudo(
      "awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next}; pr {printf \" % s\n % s\n % s\n\", prev, cur, $0; pr=0}'{0}".format(cronLog), pty=False) 

Как это сделать правильно?

ответ

2

Проблема была решена путем побега { и AWK новые строки:

info = sudo("awk '/END$/ {{prev=$0; next}}; /^#RETURN/ && $2>0 {{cur=$0; pr=1; next}}; pr {{printf \"%s\\n%s\\n%s\\n\", prev, cur, $0; pr=0}}' {0}".format(cronLog), pty=False) 

https://docs.python.org/2/library/string.html#format-string-syntax

Формат строки содержат «замены поля» фигурные скобки {}. Все, что не содержится в фигурных скобках, считается буквальным текстом, который не изменяется на выходе. Если вам нужно включить символ скобки в буквальном тексте, его можно избежать путем удвоения: {{ и }}.