我需要将应用程序日志提取到 Splunk,其格式如下 文件格式 - 逗号分隔的文件 field1、field2、field3、field4、field5。 Field5 具有特殊字符,例如换行符、嵌入逗号、双引号等。现在我需要将此字段括在双引号中,并转义值中的任何特殊字符。我尝试使用 sed 和 awk 通过转义值中的特殊字符将字段用双引号括到最后一个字段。
没有运气。如果有人能提供一些线索将会有很大的帮助。
来自实际日志文件的示例数据
abc,def,ghi,jkl,###abcjkl, defghi"ifgnhgt", NOSQL
executed sql
abc|def|ghi|68
abc|jkl|opg|78
INFO: (Sql statement: select col1, col2, col3 from table_schema.table_name)
abc,def,ghi,jkl,####oprght, hghihk"lklmnp", PostgreSQL
executed sql
select col1,
col2,
col3
from table_schema.table_name
abc,def,ghi,jkl,####[email protected], [email protected], [email protected],
[email protected]
abc, def, ghi,jkl, ### PID:238876 ###
尝试进入以下格式
abc,def,ghi,jkl,"###abcjkl, defghi\\"ifgnhgt\\", NOSQL
executed sql
abc|def|ghi|68
abc|jkl|opg|78
INFO: (Sql statement: select col1, col2, col3 from table_schema.table_name)"
abc,def,ghi,jkl,"####oprght, hghihk\\"lklmnp\\", PostgreSQL
executed sql
select col1,
col2,
col3
from table_schema.table_name"
abc,def,ghi,jkl,"####[email protected], [email protected], [email protected],
[email protected]"
abc, def, ghi,jkl, "### PID:238876 ###"
谢谢
答案1
可能是这样的:
perl -ne '
sub process {
if (defined($before)) {
chomp $after;
printf qq(%s"%s"\n), $before, $after =~ s/"/\\\\"/gr
}
}
if (/^([^,]*,){4}\h*\K###.*/s) {
process;
$before = $`; $after = $&
} else {
$after .= $_
}
END{process}' < your-file
我们查找至少包含 4 个逗号的行,其中第四个逗号后跟可选的\h
水平空格并###
标识每个记录的开头。