解决了一例awk中substr处理汉字字符串的bug

本来,awk中的substr在处理中文字符串是没有问题的,但是前几天却碰到一个诡异的现象:
————————————————————————————————
[lw]$cat awktest
Title: 123小苵大家
[lw]$cat awktest | awk -F" " '{print $2}'
123小苵大家
[lw]$cat awktest | awk -F" " '{print substr($2,1)}'
123小小|大家

————————————————————————————————
见鬼了不是?
最后采用其他方式解决了此问题:
————————————————————————————————
[lw]$export atstr=`cat awktest | awk -F" " '{print $2}'`
[lw]$echo ${atstr:0:10}
123小苵大家
[lw]$cat awktest | awk -F" " '{print $2}' | cut -c 1-
123小苵大家
[lw]$cat awktest | cut -c 8-
123小苵大家

————————————————————————————————

其实最不解的还是
————————————————————————————————
[lw]$ expr substr "`cat awktest`" 8 18
123小苵大家
————————————————————————————————

敢情这俩substr不是一个娘亲生的。

对了,汇报下自家的环境
————————————————————————————————
[lw]$ uname -a
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
[lw]$ locale
LANG=zh_CN
LC_CTYPE="zh_CN"
LC_NUMERIC="zh_CN"
LC_TIME="zh_CN"
LC_COLLATE="zh_CN"
LC_MONETARY="zh_CN"
LC_MESSAGES="zh_CN"
LC_PAPER="zh_CN"
LC_NAME="zh_CN"
LC_ADDRESS="zh_CN"
LC_TELEPHONE="zh_CN"
LC_MEASUREMENT="zh_CN"
LC_IDENTIFICATION="zh_CN"
LC_ALL=

——————————————————————————————————
最终大概明确了问题的所在:awk中的substr,对于LANG设为zh_CN时,实际上是调用的zh_CN.gb2312,而awk的print、expr、cut等,调的是zh_CN.gbk。
当明确设置LANG为zh_CN.gbk时,以上各类输出都表现正常。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29867/viewspace-706228/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29867/viewspace-706228/

你可能感兴趣的:(解决了一例awk中substr处理汉字字符串的bug)