awk 如何避免文本中出现特殊符号的影响?
我目前分析的日志, 每行如下:
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
但这样的局限也是显而易见的, 内容被更改了, 结果就不够准确.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
awk
难以处理这样的逻辑如果你使用
GNU awk
可以尝试'FPAT'或者使用
python/perl
等脚本的csv模块
进行格式化处理样本
python
csv模块
处理,并以tab制表符
进行域分隔,再输出awk以
tab
作为域分隔符进行处理当然,如果字符串中也可能有
tab
会造成影响的话,可以将分隔符替换成\1
等不会造成冲突的非打印字符纯 awk 的解决方案,
parse_csv
函数通过第一个返回一个 awk 数组,包含分隔好的 CSV 字段,直接用下标取值使用就可以了。注意,awk 的数组下标从 1 开始。https://gist.github.com/huandu/869fe48d6e3795875bfb