【发布时间】:2018-05-04 23:59:28
【问题描述】:
我有一个 shell 命令返回类似的行
timestamp=1511270820724797892 eventID=1511270820724797892 eventName="corvil_request_summary" channelID="HTTP: Other" channelDir=false classID="class-default" packetID=2809419165205232 messageOffset=1 warnCSMInvalidSample=false warnCSMOverflow=false warnEventInvalidSample=false Server="nginx/1.10.1" Method="GET" RequestURI="/system/varlogmessages/" UserAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0" WebSite="backup-server-new" Domain="backup-server-new" SrcIP="172.20.1.13" SrcPort="80" DstIP="172.18.4.181" DstPort="60065"
timestamp=1511270820735795372 eventID=1511270820735795372 eventName="corvil_request_summary" channelID="HTTP: Other" channelDir=false classID="class-default" packetID=2809419176202992 messageOffset=1 warnCSMInvalidSample=false warnCSMOverflow=false warnEventInvalidSample=false Server="probe" Method="GET" RequestURI="/system/status" WebSite="probe609:8111" Domain="probe609:8111" SrcIP="172.20.2.109" SrcPort="8111" DstIP="172.18.4.96" DstPort="49714"
我试图将其解读为:
for i, row in enumerate(csv.reader(execute(cmd), delimiter=' ', skipinitialspace=True)):
print i, len(row)
if i > 10:
break
但这不能正常工作,因为引号内的空格不会被忽略。例如channelID="HTTP: Other" 被拆分为两个变量,因为HTTP: 和Other 之间有空格
解析此类输入的正确方法是什么?
【问题讨论】:
-
你试过
quotechar='"'吗? -
我目前的解决方案是:
row = {k:v.strip('"') for k,v in re.findall(r'(\S+)=(".*?"|\S+)', row)} -
我刚刚意识到当前的解决方案在某些情况下不起作用
-
@Donbeo 哪个?
-
上面评论里的那个