回车符引发的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" 字符看作回车符,而是当成了字符串的一部分!
阅读(2173) | 评论(0) | 转发(0) |