【问题标题】:Escape awk special character in Python在 Python 中转义 awk 特殊字符
【发布时间】:2016-10-25 08:55:38
【问题描述】:

我有一个 Fabric 任务如下:

@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)

如何让它正确运行?

【问题讨论】:

    标签: bash python-2.7 fabric


    【解决方案1】:

    通过转义 { 和 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

    格式字符串包含用大括号 {} 包围的“替换字段”。大括号中不包含的任何内容都被视为文字文本,它会原封不动地复制到输出中。如果您需要在文字文本中包含大括号字符,可以通过将其转义:{{}}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2012-03-24
      • 1970-01-01
      相关资源
      最近更新 更多