grep 全称(Global search regular expression and Print out the line)
作用:文本搜索工具,根据用户指定的文本模式(正则表达元字符以及正常字符组合而成)对目标文件进行逐行搜索,显示能匹配到的行。
模式:由正则表达式的元字符及文本字符所编写的过滤条件。
编写测试文件test.txt内容如下:
[root@localhost shell_test]# cat test.txt
hello world
1a2f3 yui
456 haha
nihao
thinks
1. grep和文本字符编写的过滤条件
#搜索test.txt文件中含有1a字符的行,并打印输出此行全部内容
[root@localhost shell_test]# grep "1a" ./test.txt
1a2f3 yui
[root@localhost shell_test]# cat test.txt | grep "1a"
1a2f3 yui
#只想展示匹配到的内容可以在grep 后加-o,不展示 全行内容
[root@localhost shell_test]# cat test.txt | grep -o "1a"
1a
2.grep和正则表达式编写的过滤条件
root@localhost shell_test]# cat test.txt | grep "[0-9]"
1a2f3 yui
456 haha
#是不是很奇怪,下面的命令,把匹配到的每个字符单独一行展示出来
#因为我们使用了-o模式 不在以行展示匹配到的内容,又因为正则表达式[0-9]表示 匹配0到9内的任意字符
#一旦匹配到一个字符就打印它,并换行继续匹配打印
[root@localhost shell_test]# cat test.txt | grep -o "[0-9]"
1
2
3
4
5
6
#下面使用egrep命令来实现,打印到一行中
#这里先来说明下grep和egrep的区别,grep在不加 -E的情况下,
#不支持扩展正则表达式,仅支持基本正则表达式,
#而egrep支持扩展表达式。e表示的就是extend,扩展的意思。
像{m,n},+等是扩展的表达式。
这里的grep -E 和 egrep 命令是等价的。因为正则表达式中含有扩展的表达式+
#这里的[0-9]+表示 会把同一行内匹配到连续出现的1到多个字符打印到一行内。
[root@localhost shell_test]# cat test.txt | grep -E -o "[0-9]+"
1
2
3
456
[root@localhost shell_test]# cat test.txt | egrep -o "[0-9]+"
1
2
3
456
也等价于下面的命令
[root@localhost shell_test]# cat test.txt | grep -E -o "[0-9]{1,}"
1
2
3
456
[root@localhost shell_test]# cat test.txt | egrep -o "[0-9]{1,}"
1
2
3
456
在这里再补充说下:grep命令退出状态码:
先说结论: 退出状态码为 0表示匹配到,1表示没有匹配到 。所以这里的grep命令不是执行成功就返回0了。而是和是否匹配到过滤的条件也有关系。
使用echo $? 查看命令执行后的退出状态码。
举例说明:
创一个test.txt文件
[root@localhost sh_script]# cat test.txt
hello
world
you
operator
通过grep命令来过滤 指定字符串 看是否和test.txt文件匹配到,如果匹配到就输出打印匹配到的行内容。并通过$?来查看退出状态码。
#演示匹配到的情况,先执行cat命令,如果cat命令执行成功,再执行grep命令,最后的退出状态码 以最后一个命令为准。
[root@localhost sh_script]# cat test.txt | grep "you" #这里加不加双引号都表示字符串,这里加上只是说明这里的内容是一起的。匹配时是忽略双引号的。
you[root@localhost sh_script]# echo $?
0#演示匹配不到的情况
[root@localhost sh_script]# cat test.txt | grep "ite"
[root@localhost sh_script]# echo $?
1
#这种是比较常见的,把待过滤的文件放在后面,效果和上面的一样
[root@localhost sh_script]# grep "you" ./test.txt
you
[root@localhost sh_script]# echo $?
0[root@localhost sh_script]# grep "ite" ./test.txt
[root@localhost sh_script]# echo $?
1
从上面的命令演示中可以看到,当可以匹配到时,会有输出,退出状态码为0;当匹配不到时,不会有输出,退出状态码为:1。
这里再多提一嘴,在if-then语句中。如果if后的命令是grep命令,那么只有grep命令的退出状态码为0时,才能执行then里的命令。否则不会执行then里的命令。