回车符引发的awk错误

2217阅读 0评论2009-06-01 seaquester
分类:LINUX

回车符引发的awk错误

冷胜魁(Seaquester)
lengshengkui@gmail.com
2009-2-10

在使用awk处理一个可执行程序的输出时遇到了一个奇怪的问题。

这个程序将一个serial number(字符串)写到硬件,然后再读回来,输出到stdout。
通过awk可以将serial number分离出来,然后与写进去的值比较。总是失败,但是将值打印出来却是相同的。

假设写进去的serial number是 ABC1234567,十个字符。读回来时程序输出的格式是:Serial Number: ABC1234567

所以我就用下面的代码来分离出serial number:

serialno=`ipmitool rdsn | grep "Serial Number" | awk '{print $3}'`

然后作比较,示例代码如下:

#!/bin/sh
barcode="ABC1234567"

serialno=`ipmitool rdsn | grep "Serial Number" | awk '{print $3}'`
if [ $barcode == $serialno ] ; then
    echo "OK"
else
    echo "ERROR"
fi

但结果总是输出:ERROR。

百思不得其解,于是就加了echo将serialno输出。

我在输出serialno时用括号括起来,echo "serial number:($serialno)",终于发现了问题。

正确结果应该是:
serial number:(ABC1234567)

但实际结果是:
)erial number:(ABC1234567

于是我将输出结果输出到一个文件中,打开看到后面有一个‘\r’字符(ASCII码是0x0D)。问题就出在它上面了。

于是用tr来将 "\r" 去掉(用sed也是可以的)。

#!/bin/sh
barcode="ABC1234567"

serialno=`ipmitool rdsn | grep "Serial Number" | tr '\r' ' ' | awk '{print $3}'`
if [ $barcode == $serialno ] ; then
    echo "OK"
else
    echo "ERROR"
fi

终于得到了正确的结果!

awk并不将 "\r" 字符看作回车符,而是当成了字符串的一部分!
上一篇:在bash脚本里面作浮点数比较
下一篇:sed 脚本分隔符引起的问题