grep无法查找shell传过来的变量?先注意一下文本格式吧!

昨天,同事告诉我发现一个诡异的问题,grep无法搜索shell中的变量,着实很惊讶。到他所说的服务器上试了下,还真是不行!

大概就是这样一个要求:

①、有个文本为userid.txt,里面每一行一个用户id,类似如下:

②、另外还有一个文本为record.txt,里面是所有用户的操作记录,一行一条,并且包含有id,类似如下:

③、现在他要求循环取出userid.txt中每一行ID值,然后去record.txt去查找并保存结果。

实现这个需求原本很简单,根本难不倒他,只要使用while read + grep 就能搞定。可问题是明明record.txt里面包含这些id,却无法输出结果??

我顺便写了一个测试脚本测试了下:

发现脚本可以打印echo $userId,却无法grep到??而实际上record.txt里面是有这个id的!还真诡异!

先百度搜索了一下【grep 无法搜索变量】,还真有不少类似问题,比如:http://bbs.chinaunix.net/thread-123113-1-1.html

根据经验,对于这种诡异的问题,我首先会想到是不是系统有问题,要是系统有问题你怎么折腾都是错!

于是把他的文件拷贝到其他服务器,发现居然可以了!!!难道真是系统问题么?

第一台是SUSE Linux,第二台是Centos,难道和系统发行版有关系?

后来,同事在第二台服务器上完成了他的项目。但这个问题却一直留在我的脑子里,挥之不去。


 

今天,我决定再次研究下这个问题,看看是不是有其他原因。我先在那台SUSE Linux上,手工编写所需文件:

[root@localhost ~]# vim 1.txt

[root@localhost ~]# vim 2.txt

[root@localhost ~]# vim test.sh

结果,发现居然可以输出结果!证明这系统没有问题啊!于是再一次测试了一下昨天的脚本,发现还是无法输出。

于是使用 -x 参数 调试一下脚本:

先修改脚本代码:

然后,带 -x 参数执行:

难怪找不到,grep的变量已经变了!0001变成了 $'0001\r' !

看到\r,立马想到是文本中的换行符,可为毛会输出换行符呢?想到博客以前写的《Linux终端:用cat命令查看不可见字符》,继续改了一下代码:

执行后恍然大悟:

原来是dos下的文本格式,问了下同事,他还真是从Windows下导过来的! — —||

也就是说,userid.txt这个文本的换行符是Windows格式,在Linux下读取会带有^M。

所以解决上述问题,就很明了了,要么转换userid.txt的换行格式,要不就修改代码,去掉多余的字符!

试了下转换格式,发现居然转换不成功,可能是我没找对方法,暂时先不折腾了!

直接如下修改代码,就搞定了:

好了,搞了半天原来是dos和unix的换行符问题!o(︶︿︶)o 唉!还是经验不足啊!

网上那些问grep无法搜索变量的朋友,赶紧看看是不是文本格式造成的!现在,让我很纳闷的是,为毛在另一台centos系统可以直接grep??为什么在SUSE系统就不行?

如果和发行版没关系的话,那造成2个不同结果的原因就只有一个:在我用sz+rz命令将所有文本传送到centos的过程中,文件很可能被自动转格式了!好吧,具体就不深究了,有兴趣的可以试试看。

发表评论

gravatar

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

刷新评论

目前评论:6   其中:访客  5   博主  1

  1. 热冰柠檬 0 来自天朝的朋友 Netscape Navigator iPhone iPhone OS 8_1 like Mac OS X) AppleWebKit 广东省阳江市 联通机房

    可以下载工具unit2dos!可以转换格式???

  2. 方法SEO博客 4 来自天朝的朋友 谷歌浏览器 Windows 7 河北省廊坊市 联通

    多加一个命令dos2unix就可以搞定个问题。

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

      多谢指点,回头补充下。

  3. 起重配件 2 来自天朝的朋友 谷歌浏览器 Windows 7 河南省焦作市 移动

    支持一下

  4. 高达阿宝 0 来自天朝的朋友 火狐浏览器5.0 Windows 7 北京市 教育信息网

    卧槽,我弄了一天就是弄不出来然后靠你这个解决了!简直太感谢了!

  5. rocdk890 0 来自天朝的朋友 谷歌浏览器 Mac OS X 10_11_6 四川省成都市 电信

    在vi里的编辑模式下:set ff=unix也不行吗?

加载中,请稍候...