shell中用grep查找并且不输出_grep无法查找shell传过来的变量?先注意一下文本格式吧!...
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传过来的变量?先注意一下文本格式吧!...相关推荐
- shell中用grep查找并且不输出_Linux中用 grep查找特定进程,屏蔽grep进程本身(也就是不出现grep --color=auto)...
2020年6月8日09:03:12更新 一些细节. 日常操作linux 中,通常在使用 ps命令后 用管道连接 查询特定进程会显示 grep进程本身. 如下: 1 [root@ecs-linux-by ...
- shell中用grep查找并且不输出_grep awk 搜索日志常用命令
0 grep 常用参数 --color:高亮显示匹配到的字符串 -v:显示不能被pattern匹配到的 -i:忽略字符大小写 -o:仅显示匹配到的字符串 -q:静默模式,不输出任何信息 -A#:aft ...
- shell中用grep查找并且不输出_shell中grep命令详解
用'grep'搜索文本文件如果您要在几个文本文件中查找一字符串,可以使用'grep'命令.'grep'在文本中搜索指定的字符串.举个例子:假设您正在'/usr/src/linux/Documentat ...
- Linux shell:shell 命令的返回值和输出
1. 返回值用$?来测试 如命令ls [baoliw@AONTFN07 vlan_transparent]$ lsconfig not_care_pbit.sh[baoliw@AONTFN07 vla ...
- grep查找的内容输出到文件
使用grep查看服务日志是必备的技能,有时候遇上比较难排查的疑难杂症,需要将日志筛选后保存到指定文件,再下载到本地进行日志分析.将grep查找的内容输出到文件的示例: 在文件server.log中查找 ...
- Linux中用 grep查找特定进程,屏蔽grep进程本身(也就是不出现grep --color=auto)【转载】
日常操作linux 中,通常在使用 ps命令后 用管道连接 查询特定进程会显示 grep进程本身. 如下: 1 [root@ecs-linux-byx ~]# ps -ef|grep gs4 2 ro ...
- Shell ❀ 三剑客 - Grep + Sed + Awk
文章目录 八.三剑客 - Grep + Sed + Awk 1.Grep - 过滤 1.1 常用grep参数 1.2 使用方法 2.Sed - 行匹配 2.1 执行原理 2.2 常见语法 2.3 使用 ...
- shell脚本——grep cut sort uniq tee diff paster tr等小工具的使用方法
shell脚本的一些小工具的使用方法 grep 语法和选项 实例 cut 语法和选项 实例 sort 语法和选项 实例 uniq 语法和选项 实例 tee 语法和选项 实例 diff 语法和选项 实例 ...
- 【Shell牛客刷题系列】SHELL1 统计文件的行数:学习wc命令和文本三剑客awk、grep、sed命令
该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令. 刷题链接:牛客题霸-Shell篇. 该系列文章都放到专栏下,专栏链接为:<专栏:Linux>.欢迎关注专栏~ 本 ...
- 数据流重定向和管道命令, grep, tr,sort, wc, cut,split,tee,sleep(shell 02)
主要内容 1.标准输入输出和错误 2.管道命令和 grep, tr,sort, wc, cut,split,tee,sleep 标准输入输出和错误 标准输入(stdin) 是指令数据的输入,代码为0, ...
最新文章
- 超牛EXCEL操作技巧,用的好,会涨工资哦
- matlab反馈模型,—倒立摆状态反馈系统的建模及matlab仿真.docx
- Springboot .properties或.yml配置文件读取pom.xml文件值
- 数据库几种连接方式的(左右union all)
- java idea 模块_idea 多模块项目依赖父工程class找不到问题的方法
- 山东省中职信息技术c语言试题及答案,中职计算机专业C语言测试题
- 室内布线电缆未来的发展趋势
- windows和linux的共享
- 京东联盟接口——链接取商品sku
- Java后端防止获取短信验证码接口被恶意调用的代码实现
- 大数据在人力资源管理当中的应用
- android代码 发警报音,为提醒设置自定义Android警报
- 《技术人创业攻略》-用技术改变世界!
- TypeError: The ‘compilation‘ argument must be an instance of Compilation
- “贵州与您相约”英文网站8月18日正式上线;大华股份助力长兴打造景区数字化管理样板 | 全球旅报...
- Python爬取去哪儿旅游数据
- (PHP)获取微信支付平台证书步骤
- 自动驾驶系统进阶与项目实战(三)基于全卷积神经网络的点云三维目标检测和ROS实战
- python 自动化测试面试题及答案_自动化测试面试题及答案大全(1)
- safari如何降低版本?mac上的safari版本回退方法!
热门文章
- 计算机自动关机启机唤醒设置,电脑设置自动关机和自动开机
- Windows软件之——RocketDock之无法拖放图标到dock栏
- python绘图之Times New Roman字体以及Helvetica字体
- 已知经纬度自动在地图上标点
- Android studio运行出错 compilation failed see the compiler error output for details.
- Grown Up Digital: How the Net Generation is Changing Your World
- 【第一组】第十三次例会纪要
- 给大家推荐一款好用的背单词APP(目前只支持苹果手机)
- 网卡能通过usb接口与计算机连接吗,usb网卡怎么使用 usb网卡使用方法【图文】...
- Redis Client 之 Jedis与Lettuce