shell 三剑客之 grep

背景

对于很多的测试人员来说,grep 命令都很熟悉,用的最多的比如去查找指定的进程:ps -ef | grep *** ,其中***为进程名或进程号,这里我们只用到的 grep 的最基础功能-从标准输出中过滤指定的字符串,实际上 grep 的功能远不止如此。这篇文章给大家来介绍下 grep 的进阶及高阶用法,来帮助我们在测试工作中提升效率。
grep 的全称:Global search Regular Expression and Print out the line,是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行,grep 和 sed、awk 一起成为 Linux 中的三剑客。grep 可以不使用正则,但是跟正则一起配合使用时,功能最为强大!

命令语法

grep 提供两种方式:

语法格式 解释
option 参数选项
pattern 为查找的字符串或者正则表达式
第一种是从文本中直接使用 pattern 匹配搜索
第二种是从标准输出中处理
grep 所提供的 option(参数选项)
参数选项 含义
-i 搜索时忽略大小写
-n 显示行号
-o 只显示被匹配的关键字,不会打印匹配的整行内容
-r 递归搜索
-v 不显示匹配行信息
-q 静默模式,不输出任何信息,在 shell 脚本中,可以通过 echo $?查看是否匹配到,0 表示匹配到,1 表示没有匹配到
-E 使用扩展正则表达式

我们先从第一个最简单的示例开始:
先准备一个测试文件,内容如下:

hhy@hhy-virtual-machine:~/shellTest$ cat testfile
hello lemonban
test
tomcat Test jenkins
lemon apache test
selenium appium httpclient
java python
TEST

从文本文件中搜索 test 字符串

hhy@hhy-virtual-machine:~/shellTest$ grep "test" testfile
test
lemon apache test

可以看到包含有"test"的行被打印出来,默认 grep 是区分大小写的,所以"Test","TEST"没有被匹配出来
如果想要不区分大小写,我们可以加"-i"的参数,如下

hhy@hhy-virtual-machine:~/shellTest$ grep -i "test" testfile
test
tomcat Test jenkins
lemon apache test
TEST

当前我们的测试文本内容比较少,我们肉眼可以见到是在第几行。如果文本行数较多的情况下那就不太方便了,这里就可以用到"-n"的参数

hhy@hhy-virtual-machine:~/shellTest$ grep -i -n "test" testfile
2:test
3:tomcat Test jenkins
4:lemon apache test
7:TEST

包含有"test"的并且不区分大小写的行在开头会显示行号
现在的结果中匹配的关键字所在行全部内容都会输出,如果只想要看到匹配的关键字,怎么办?
使用"-o"参数即可

hhy@hhy-virtual-machine:~/shellTest$ grep -i -n -o "test" testfile
2:test
3:Test
4:test
7:TEST

有时候我们需要对整个目录去搜索关键字,如果直接使用 grep "test" 目录名,会报错
加参数'-r'就可以避免这个问题

hhy@hhy-virtual-machine:~$ grep "test" shellTest
grep: shellTest: Is a directory
hhy@hhy-virtual-machine:~$ grep -r "test" shellTest
shellTest/test1.txt:test 1111 aaaaa
shellTest/testfile:test
shellTest/testfile:lemon apache test

可以看到 shellTest 目录下的两支文件 test1.txt 以及 testfile 都包含 test 被打印出来了

“-q”选项表示使用静默模式,在此模式下 grep 命令不会有任何的打印结果,无论是否有匹配到。一般来说我们可以根据 echo $? 来查看上一条指令(grep)的执行结果,如果返回结果为 0,表示 grep 有匹配到了,如果返回结果为 1,表示 grep 没有匹配到

hhy@hhy-virtual-machine:~/shellTest$ grep "test" testfile
test
lemon apache test
hhy@hhy-virtual-machine:~/shellTest$ grep -q "test" testfile
hhy@hhy-virtual-machine:~/shellTest$ echo $?
0

一般我们可以 shell 脚本中去用 if 条件分支进行判断,如果 echo $?结果为 0,就去执行相应的操作

grep 结合 pattern 正则

前面我们介绍了参数的基本用法,grep 的强大之处其实是和正则表达式一起才有作用。

注:本篇文章不会具体介绍正则表达式的使用,如果不了解正则表达式的同学推荐去看下之前相关的文章

我们知道在正则表达式中分为了两类:

基本正则表达式

. 单个字符
* 表示前面的字符连续出现任意次,包括 0 次
^ 表示锚定行首
$ 表示锚定行尾
[a-z] [0-9] 区间范围
......

扩展正则表达式

? 表示匹配其前面的字符 0 或 1 次
+ 表示匹配其前面的字符至少 1 次,或者连续多次,连续次数上不封顶。
() 分组
{} 连续匹配
| 匹配多个表达式的任何一个
......

如查询以"lemon"单词开头

hhy@hhy-virtual-machine:~/shellTest$ grep "^lemon" testfile
lemon apache test

查找文件中空白行的数量

hhy@hhy-virtual-machine:~/shellTest$ grep -c "^$" testfile
2

正则“^$”表示空白行,参数“-c”表达计算行数

连续字数的正则匹配,如:查找“appium”,p 是连续的

hhy@hhy-virtual-machine:~/shellTest$ grep "ap{2}ium" testfile

“{2}”表示 p 连续出现了两次,可以发现结果是匹配不到的
因为{}是扩展正则表达式,grep 默认是基本正则表达式,如果需要支持扩展正则表达式,我们需要加"-E"选项:

hhy@hhy-virtual-machine:~/shellTest$ grep -E "ap{2}ium" testfile
selenium appium httpclient
1 操作
shakebabe 在 2020-08-06 17:37:28 更新了该帖
1 回帖
请输入回帖内容 ...