다음 파일 형식(쉼표로 구분된 파일 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개의 쉼표가 포함된 줄을 찾습니다. 여기서 네 번째 쉼표 뒤에는 선택적 \h
가로 공백이 오고 ###
각 레코드의 시작을 식별합니다.