Chinaunix首页 | 论坛 | 博客
  • 博客访问: 597215
  • 博文数量: 50
  • 博客积分: 4764
  • 博客等级: 上校
  • 技术积分: 597
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-18 09:00
个人简介

资深IT码农,擅长Linux、C/C++、bash

文章分类

全部博文(50)

文章存档

2015年(17)

2014年(2)

2011年(7)

2010年(4)

2009年(20)

分类: LINUX

2009-06-01 09:47:32

回车符引发的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" 字符看作回车符,而是当成了字符串的一部分!
阅读(2163) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~