如何在同一行上通过逗号输出多个正则表达式匹配项

时间:2018-11-02 03:24:09

标签: regex awk sed grep regular-language

我想使用grep / awk / sed为日志文件的每一行提取匹配的字符串。然后将其放入csv文件。 突出显示的字符串(1432,53,http://www.espn.com/

如果输入是:

  

2018-10-31   18:48:01.717,INFO,15592.15627,PfbProxy :: handlePfbFetchDone(0x1d69850,   pfbId = 561,pid = 15912,状态= 4,fd = 78,计时器= 61),抓取完成:len = 45,   PFBId = 561,pid = 0,loadTime = 1434 ms,objects = 53 ,fetchReqEpoch = 0.0,   fetchDoneEpoch:0.0,fetchId = 26,URL = http://www.espn.com/

     

2018-10-31   18:48:01.806,DEBUG,15592.15621,FETCH DONE:len = 45,PFBId = 82,pid = 0,   loadTime = 1301 毫秒,对象= 54 ,fetchReqEpoch = 0.0,fetchDoneEpoch:0.0,   fetchId = 28,URL = http://www.diply.com/

上述日志行的预期输出:

URL,LoadTime,Objects
http://www.espn.com/,1434,53
http://www.diply.com/,1301,54

这是一个示例,实际的日志文件将包含更多数据。

-到目前为止,我的解决方案

目前,我使用grep获取所有包含关键字“ FETCH DONE”的行(这些行包含我要查找的字符串)。

我确实想出了与我需要的数据匹配的正则表达式,但是当我对它进行grep并将其放入文件中时,它会在新行上打印每个字符串,这并不是我想要的。 我使用的grep和正则表达式(在线正则表达式工具:https://regexr.com/42cah):

echo -en 'url,loadtime,object\n'>test1.csv #add header
grep -Po '(?<=loadTime=).{1,5}(?= )|((?<=URL=).*|\/(?=.))|((?<=objects=).{1,5}(?=\,))'>>test1.csv #get matching strings

实际输出:

URL,LoadTime,Objects
http://www.espn.com
1434
53 
http://www.diply.com
1301
54

预期输出:

URL,LoadTime,Objects
http://www.espn.com/,1434,53
http://www.diply.com/,1301,54

我正在尝试使用awk来匹配多个正则表达式并在两者之间打印逗号。即使我的正则表达式匹配正确的字符串,由于某种原因,我还是无法使它正常工作。

我的另一个想法是使用sed来将某些'\ n'替换为',':

for(i=1;i<=n;i++)
    if(i % 3 != 0){
        sed REPLACE "\n" with "," on i-th line 
    }

我很确定有一种更有效的方法

2 个答案:

答案 0 :(得分:0)

请您尝试以下。

awk '
BEGIN{
  print "URL,LoadTime,Objects"
}
NF{
   match($0,/URL=.*\//)
   url=substr($0,RSTART,RLENGTH)
   match($0,/loadTime=[^ ]*/)
   loadtime=substr($0,RSTART+9,RLENGTH-9)
   match($0,/objects=[^ ]*/)
   object=substr($0,RSTART+8,RLENGTH-9)
   print url,loadtime,object
   url=object=loadtime=""
}
' OFS=","  Input_file

答案 1 :(得分:0)

使用sed:

sed -n 's/.*loadTime=\([0-9]*\)[^,]*, objects=\([0-9]*\).* URL=\(.*\)/\3,\1,\2/p' input | \
  sed 1i'URL,LoadTime,Objects'