次のファイル形式(カンマ区切りのファイルfield1、field2、field3、field4、field5)でSplunkにアプリケーションログを抽出する必要があります。 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つのカンマを含む行を探します。ここで、4番目のカンマの後には、オプションの水平スペースが続き、\h
各###
レコードの先頭を識別します。