shell脚本_ grep和egrep命令

  • Post author:
  • Post category:其他


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里的命令。



版权声明:本文为adminstate原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。