【问题标题】:python regex to parse the output of a commandpython 正则表达式来解析命令的输出
【发布时间】:2018-04-10 16:47:22
【问题描述】:

下面的 python 脚本执行一个命令。该命令返回一个输出。输出如下所示。

我需要从输出中解析以下内容。

1) HTTP 响应代码 2) points 数组的内容。数组可以是空的,也可以是非空数组(输出的最后一行)

输出:

Matched line for host akaa-wcb54zu2flskjhx4-szsapxzmalbot2fr.luna-dev.akamaiapis.net
{'access_token': 'akaa-r6gnip3mmql3evrj-mgiex4eajadrjltu', 'max-body': 131072, 'secret': 'yBc1LSGKBd6+sSP5tTR2o+YxlNYvlYNjWGdCFDl6Xt0=', 'signed-header': [], 'host': 'akaa-wcb54zu2flskjhx4-szsapxzmalbot2fr.luna-dev.akamaiapis.net', 'client_token': 'akaa-eyaa6fvcfngdlrb6-uxvn3hkpzxx33oxc'}
[]
Canonicalized header:
Auth data: EG1-HMAC-SHA256 client_token=akaa-eyaa6fvcfngdlrb6-uxvn3hkpzxx33oxc;access_token=akaa-r6gnip3mmql3evrj-mgiex4eajadrjltu;timestamp=20180410T16:38:24+0000;nonce=265e61d8-813c-4c3a-9edb-91caaa027420;
String-to-sign: POST    https   akaa-wcb54zu2flskjhx4-szsapxzmalbot2fr.luna-dev.akamaiapis.net  /prolexic-analytics/v2/metrics      YSycIdG2e9nY8KVLrPvMfzrBNMZEI8ncRxtcUP4h1J0=    EG1-HMAC-SHA256 client_token=akaa-eyaa6fvcfngdlrb6-uxvn3hkpzxx33oxc;access_token=akaa-r6gnip3mmql3evrj-mgiex4eajadrjltu;timestamp=20180410T16:38:24+0000;nonce=265e61d8-813c-4c3a-9edb-91caaa027420;
args = ['curl', '-H', 'Authorization: EG1-HMAC-SHA256 client_token=akaa-eyaa6fvcfngdlrb6-uxvn3hkpzxx33oxc;access_token=akaa-r6gnip3mmql3evrj-mgiex4eajadrjltu;timestamp=20180410T16:38:24+0000;nonce=265e61d8-813c-4c3a-9edb-91caaa027420;signature=p6y+oDzaTfh3nj32R8jveDx8EGmjpHGybL7LJ0L+Adk=', '-S', '-i', '-k', '-X', 'POST', '-H', 'Host:akaa-wcb54zu2flskjhx4-szsapxzmalbot2fr.luna-dev.akamaiapis.net', '-H', 'Content-Type: application/json', '-H', 'Accept: application/json', '-d', '{"contract": "amade", "start": 1522420500, "end": 1522424147, "samples": 20, "type": {"connect": ["bandwidthIn"]}}', 'https://akaa-wcb54zu2flskjhx4-szsapxzmalbot2fr.luna-dev.akamaiapis.net/prolexic-analytics/v2/metrics', '-H', 'Expect:']
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json
Content-Length: 151
X-Trace-Id: c4db5acce87c20f3
Date: Tue, 10 Apr 2018 16:38:26 GMT
Connection: keep-alive

{"status":true,"currentContract":"amade","statusMsg":"Metrics acquired successfully","data":[{"service":"connect","metric":"bandwidthIn","points":[]}]} 

脚本:

import subprocess
import sys
import re

n = sys.argv[1]
for i in range(int(n)):
 # command to be executed 
 cmd = "python egcurl --eg-config .egcurl -Sik -X POST --eg-verbose -H 'Host:akaa-wcb54zu2flskjhx4-szsapxzmalbot2fr.luna-dev.akamaiapis.net' -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{'contract': 'amade', 'start': 1522420500, 'end': 1522424147, 'samples': 20, 'type': {'connect': ['bandwidthIn']}}'  https://akaa-wcb54zu2flskjhx4-szsapxzmalbot2fr.luna-dev.akamaiapis.net/prolexic-analytics/v2/metrics"


 cmd_exec = subprocess.call(cmd, shell=True)
 r1 = re.search("HTTP(.*)",cmd_exec)
 print(r1)
 print(cmd_exec)

错误:

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 146, in search
    return _compile(pattern, flags).search(string)
TypeError: expected string or buffer

【问题讨论】:

  • 查看我对类似问题的回答,stackoverflow.com/a/49570796/7811673。但在这种情况下,我会使用urllib 而不是调用curl
  • 为什么不尝试打印 cmd_exec? call() 返回进程的返回码。
  • 我认为您需要重新考虑这一点。您正在使用 Python 在 shell 中调用另一个 Python 实例来运行 curl,然后使用正则表达式对其进行解析?

标签: python regex


【解决方案1】:

问题是你在做什么

 cmd_exec = subprocess.call(cmd, shell=True)

subprocess.call 返回结果代码,而不是输出。你想用

 cmd_exec = subprocess.check_output(cmd, shell=True)

【讨论】:

  • 好电话!应该注意的是,这仅适用于 python 2.7+。
  • 谢谢Aaron,下次我会数数的:)
  • 你的答案没有错,我只是为未来的人评论这个答案:)
【解决方案2】:

这里的问题是subproccess.call() 返回进程返回码,而不是命令的输出。 From the docs:

运行 args 描述的命令。等待命令完成,然后 返回返回码属性

因此,您尝试在不是字符串的cmd_exec(返回码)上使用re.search(),因此re 不知道如何处理它并引发错误。

请参阅this answer,了解如何获取子进程命令的输出!

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    相关资源
    最近更新 更多