from:https://zhangge.net/4703.html

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

大概就是这样一个要求:

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

Shell

1

2

3

4

50001

0003

0005

0007

0009

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

Shell

1

2

3

4

5

6

7

8

9[12 11 2014 11:03,198 INFO] userId:0001 gilettype:3

[12 11 2014 12:12,198 INFO] userId:0002 gilettype:3

[12 11 2014 13:02,198 INFO] userId:0003 gilettype:1

[12 11 2014 14:33,198 INFO] userId:0001 gilettype:3

[12 11 2014 15:13,198 INFO] userId:0002 gilettype:2

[12 11 2014 16:43,198 INFO] userId:0003 gilettype:1

[12 11 2014 17:32,198 INFO] userId:0001 gilettype:3

[12 11 2014 18:16,198 INFO] userId:0002 gilettype:1

[12 11 2014 19:25,198 INFO] userId:0003 gilettype:2

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

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

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

Shell

1

2

3

4

5

6#!/bin/bash

while read userId;

do

echo $userId

grep $userId record.txt

done

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

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

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

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

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

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

[root@localhost ~]# vim 1.txt

Shell

1

2

31111

3333

5555

[root@localhost ~]# vim 2.txt

Shell

1

2

3

4

5

61111

2222

3333

4444

5555

6666

[root@localhost ~]# vim test.sh

Shell

1

2

3

4

5#!/bin/bash

cat 1.txt|while read userId;

do

grep $userId 2.txt

done

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

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

先修改脚本代码:

Shell

1

2

3

4

5

6#!/bin/bash

cat userid.txt|while read userId;

do

grep $userId record.txt

sleep 3

done

然后,带 -x 参数执行:

Shell

1

2

3

4

5

6

7

8

9

10

11[root@localhost ~]#  sh -x test

+ cat userid.txt

+ read userId

+ grep $'0001\r' record.txt

+ sleep 3

+ read userId

+ grep $'0003\r' record.txt

+ sleep 3

+ read userId

+ grep $'0005\r' record.txt

+ sleep 3

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

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

Shell

1

2

3

4

5

6#!/bin/bash

cat -A userid.txt|while read userId;

do

grep $userId record.txt

sleep 3

done

执行后恍然大悟:

Shell

1

2

3

4

5

6

7

8

9

10

11[root@localhost ~]#  sh -x test

+ cat -A userid.txt

+ read userId

+ grep '0001^M$' record.txt

+ sleep 3

+ read userId

+ grep '0003^M$' record.txt

+ sleep 3

+ read userId

+ grep '0005^M$' record.txt

+ sleep 3

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

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

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

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

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

Shell

1

2

3

4

5

6

7#!/bin/bash

cat -A userid.txt|while read userId;

do

#利用cut命令取出 ^ 之前的数字部分:

id=`echo $userId | cut -d"^" -f1`

grep $id record.txt

done

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

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

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

shell中用grep查找并且不输出_grep无法查找shell传过来的变量?先注意一下文本格式吧!...相关推荐

  1. shell中用grep查找并且不输出_Linux中用 grep查找特定进程,屏蔽grep进程本身(也就是不出现grep --color=auto)...

    2020年6月8日09:03:12更新 一些细节. 日常操作linux 中,通常在使用 ps命令后 用管道连接 查询特定进程会显示 grep进程本身. 如下: 1 [root@ecs-linux-by ...

  2. shell中用grep查找并且不输出_grep awk 搜索日志常用命令

    0 grep 常用参数 --color:高亮显示匹配到的字符串 -v:显示不能被pattern匹配到的 -i:忽略字符大小写 -o:仅显示匹配到的字符串 -q:静默模式,不输出任何信息 -A#:aft ...

  3. shell中用grep查找并且不输出_shell中grep命令详解

    用'grep'搜索文本文件如果您要在几个文本文件中查找一字符串,可以使用'grep'命令.'grep'在文本中搜索指定的字符串.举个例子:假设您正在'/usr/src/linux/Documentat ...

  4. Linux shell:shell 命令的返回值和输出

    1. 返回值用$?来测试 如命令ls [baoliw@AONTFN07 vlan_transparent]$ lsconfig not_care_pbit.sh[baoliw@AONTFN07 vla ...

  5. grep查找的内容输出到文件

    使用grep查看服务日志是必备的技能,有时候遇上比较难排查的疑难杂症,需要将日志筛选后保存到指定文件,再下载到本地进行日志分析.将grep查找的内容输出到文件的示例: 在文件server.log中查找 ...

  6. Linux中用 grep查找特定进程,屏蔽grep进程本身(也就是不出现grep --color=auto)【转载】

    日常操作linux 中,通常在使用 ps命令后 用管道连接 查询特定进程会显示 grep进程本身. 如下: 1 [root@ecs-linux-byx ~]# ps -ef|grep gs4 2 ro ...

  7. Shell ❀ 三剑客 - Grep + Sed + Awk

    文章目录 八.三剑客 - Grep + Sed + Awk 1.Grep - 过滤 1.1 常用grep参数 1.2 使用方法 2.Sed - 行匹配 2.1 执行原理 2.2 常见语法 2.3 使用 ...

  8. shell脚本——grep cut sort uniq tee diff paster tr等小工具的使用方法

    shell脚本的一些小工具的使用方法 grep 语法和选项 实例 cut 语法和选项 实例 sort 语法和选项 实例 uniq 语法和选项 实例 tee 语法和选项 实例 diff 语法和选项 实例 ...

  9. 【Shell牛客刷题系列】SHELL1 统计文件的行数:学习wc命令和文本三剑客awk、grep、sed命令

    该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令. 刷题链接:牛客题霸-Shell篇. 该系列文章都放到专栏下,专栏链接为:<专栏:Linux>.欢迎关注专栏~ 本 ...

  10. 数据流重定向和管道命令, grep, tr,sort, wc, cut,split,tee,sleep(shell 02)

    主要内容 1.标准输入输出和错误 2.管道命令和 grep, tr,sort, wc, cut,split,tee,sleep 标准输入输出和错误 标准输入(stdin) 是指令数据的输入,代码为0, ...

最新文章

  1. 超牛EXCEL操作技巧,用的好,会涨工资哦
  2. matlab反馈模型,—倒立摆状态反馈系统的建模及matlab仿真.docx
  3. Springboot .properties或.yml配置文件读取pom.xml文件值
  4. 数据库几种连接方式的(左右union all)
  5. java idea 模块_idea 多模块项目依赖父工程class找不到问题的方法
  6. 山东省中职信息技术c语言试题及答案,中职计算机专业C语言测试题
  7. 室内布线电缆未来的发展趋势
  8. windows和linux的共享
  9. 京东联盟接口——链接取商品sku
  10. Java后端防止获取短信验证码接口被恶意调用的代码实现
  11. 大数据在人力资源管理当中的应用
  12. android代码 发警报音,为提醒设置自定义Android警报
  13. 《技术人创业攻略》-用技术改变世界!
  14. TypeError: The ‘compilation‘ argument must be an instance of Compilation
  15. “贵州与您相约”英文网站8月18日正式上线;大华股份助力长兴打造景区数字化管理样板 | 全球旅报...
  16. Python爬取去哪儿旅游数据
  17. (PHP)获取微信支付平台证书步骤
  18. 自动驾驶系统进阶与项目实战(三)基于全卷积神经网络的点云三维目标检测和ROS实战
  19. python 自动化测试面试题及答案_自动化测试面试题及答案大全(1)
  20. safari如何降低版本?mac上的safari版本回退方法!

热门文章

  1. 计算机自动关机启机唤醒设置,电脑设置自动关机和自动开机
  2. Windows软件之——RocketDock之无法拖放图标到dock栏
  3. python绘图之Times New Roman字体以及Helvetica字体
  4. 已知经纬度自动在地图上标点
  5. Android studio运行出错 compilation failed see the compiler error output for details.
  6. Grown Up Digital: How the Net Generation is Changing Your World
  7. 【第一组】第十三次例会纪要
  8. 给大家推荐一款好用的背单词APP(目前只支持苹果手机)
  9. 网卡能通过usb接口与计算机连接吗,usb网卡怎么使用 usb网卡使用方法【图文】...
  10. Redis Client 之 Jedis与Lettuce