我在使用CentOS。我有一个要读取的文件列表,从中提取数据并将其组织为csv文件。
日志文件的文本格式为:
...
{"name":"test-api","hostname":"ci47","pid":3202,"level":30,"msg":"File: dsiManager, Method: getContract, End { userId: 'AFC5EH5PIHHLO4XS7SG',\n clientId: '5003700557',\n intent: 'YesIntent',\n }","time":"2019-01-21T12:23:10.323Z","v":0}
...
输出格式必须为:
clientId;intent;time;userId
5003700557;YesIntent;2019-01-21T12:23:10.323Z;AFC5EH5PIHHLO4XS7SG
完成此任务的最简单方法是什么?(awk,grep ...)
我用awk命令。我的问题是每一行都与其他行不同。我通过添加测试来找到要显示的正确行号来解决此问题。这是我的代码:
awk '
BEGIN {
# Set awk script delimiter
FS=",";
# Set CSV file separator
OFS=";";
# Set header part in csv file
print "Method; UserId; ClientId; intent; time"
}
/'clientId'/
{
i=1;
msg="";
while(i<=NF) {
if ($i ~ /clientId/) {
# Cleaning column value :
gsub(/\\n\s{1,}clientId:\s/, "",$i);
msg = msg $i ";"
};
if ($i ~ /"time"/) {
# Cleaning column value :
gsub(/"time":/, "",$i);
msg = msg $i ";"
};
if ($i ~ /intent/) {
# Cleaning column value :
gsub(/\\n\s{1,}intent:\s{1,}/, "",$i);
msg = msg $i ";"
};
if ($i ~ /Method/) {
# Cleaning column value :
gsub(/(^(.*?)|\s{1,})Method\s{1,}?:?\s{1,}/, "",$i);
gsub (/(\s{1,}\{\s{1,}userId.*)?/, "", $i);
msg = msg $i ";"
};
if ($i ~ /userId/) {
# Cleaning column value :
gsub(/(^(.*?)|\s{1,})userId:\s/, "",$i);
msg = msg $i ";"
};
i++
} print msg
}
END {
print NR
} '
$(grep -l id *.log) >> output.csv
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句