您的位置:首页 > 运维架构 > Linux

linux操作中,使用sed卡死的问题

2015-07-28 19:11 531 查看
这段时间,写了个数据库表的备份功能,要求将数据导出csv文件。因为要导出成csv,而直接查询出来的时候每个字段的分割符是\t。所以要使用sed进行字符串替换。sed语句:sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' .

程序开始运行后,大概备份了十几个表的样子,然后就卡住了,通过ps -ef 查看进程,发现多了个sed进程,再使用top,发现sed进程的cpu占用达到100%,这时候才知道程序是卡在哪里了。原来是sed卡死。同样的进程,在别的几个服务器上很流畅的运行,但是在另外个服务器上,也遇到sed卡死的问题。这让我百思不解,刚开始怀疑是服务器的性能问题,不过另外一台出问题的机器性能与其他不出问题的性能相识,所以排除了这个可能性。接下来就是一通瞎鼓捣。

在鼓捣了一上午+半个下午未果之后,总算想起,用笨方法,先将出现问题的表的数据导出一个文件,对这个文件执行上面提到的sed语句,最终,很符合我的期望,语句卡死了。这下子确定就是文件的问题了。又将这个文件拷贝到其它几个服务器上运行,发现有的可以,有的不行。

这时候,基本上可以确定,是编码问题。使用file命令查看文件的编码,UTF-8。出问题的机器上,输出的LANG值是zh_CN.GB18030。我将LANG的值设置为GB1800之后,再执行sed语句,终于,字符串被替换了。为了验证真的是编码问题,我又将文件的编码转换为gb2312,LANG的值设置为zh_CN.GB18030,执行sed语句,字符串成功被替换。

最终结论,sed卡死问题是因为编码原因。

解决方法:LANG=C sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' 文件名

卡死程序的截图:包含环境编码,文件编码,文件内容:



正常执行的截图:包含环境编码的修改,环境编码值的显示,文件编码,文件内容:



第一次遇到这种问题,记录下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: