我目前分析的日志, 每行如下:
date,ip,text,source,custom-data,...
$1 ,$2,$3 ,$4 ,$5 ,...
一般情况下以,
分割处理即可;
但当 text
部分有,
时, 日志会在这个字段前后加上引号, 处理流程就会变成如下:
date,ip,"text A, text B",source,custom-data,...
$1 ,$2,$3 ,$4 ,$5 ,$6 ,...
这样后面的就全部乱套了, 当我想要取出$3
时, 就会取得一个"text A
这种东西..
所以请教一下大家, 这种情况下怎样处理比较好呢?
补充一下我目前暂时的解决方案, 使用 sed 将引号内的内容清除掉, 包括,
, 从而可以正确计数.
sed 's/".*"//g' logfile
但这样的局限也是显而易见的, 内容被更改了, 结果就不够准确.
awk
难以处理这样的逻辑如果你使用
GNU awk
可以尝试'FPAT'或者使用
python/perl
等脚本的csv模块
进行格式化处理样本
python
csv模块
处理,并以tab制表符
进行域分隔,再输出awk以
tab
作为域分隔符进行处理当然,如果字符串中也可能有
tab
会造成影响的话,可以将分隔符替换成\1
等不会造成冲突的非打印字符