如何在同一行通过逗号输出多个正则表达式匹配
How to output multiple regex matches through comma on the same line
我想使用 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, state=4, fd=78, timer=61), FETCH DONE: 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 ms, objects=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
}
我很确定有更有效的方法
使用 sed:
sed -n 's/.*loadTime=\([0-9]*\)[^,]*, objects=\([0-9]*\).* URL=\(.*\)/,,/p' input | \
sed 1i'URL,LoadTime,Objects'
我想使用 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, state=4, fd=78, timer=61), FETCH DONE: 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 ms, objects=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
}
我很确定有更有效的方法
使用 sed:
sed -n 's/.*loadTime=\([0-9]*\)[^,]*, objects=\([0-9]*\).* URL=\(.*\)/,,/p' input | \
sed 1i'URL,LoadTime,Objects'