Linux正则表达式grep与egrep

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux正则表达式grep与egrep相关的知识,希望对你有一定的参考价值。

Linux正则表达式grep与egrep

正则表达式:它是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。
其实正则表达式,只是一种思想,一种表示方法。只要我们使用的工具支持表示这种思想那么这个工具就可以处理正则表达式的字符串。常用的工具有grep, sed, awk,这三个都是针对文本的行才操作的。

grep  过滤器
语法: grep  [-cinvABC]  ‘word‘  filename

-n    显示行号
-c    count统计符合要求的行数
-v    取反,不包含所选字符的
-i    不区分大小写
-r    会把目录下面所有的文件遍历  例如: grep -r ‘root‘ ./
-A    后面跟数字,A2表示打印符合要求的行及下面二行
-B    后面跟数字,B2表示打印符合要求的行及上面二行
-C    后面跟数字,C2表示打印符合要求的行及上下各二行
^    行首,开头
$    行尾,结尾
空行用 ^$ 表示

可以做一个别名alias grep="grep --color" 写入到.bashrc里面;以后输入grep命令时查找的关键字符会颜色显示,方便区分。

过滤带有某个关键词的行并输出行号,颜色显示关键词
[[email protected] ~]# grep -n --color ‘root‘ passwd 
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]# grep -o --color ‘root‘ passwd | wc -l
4

加-o 统计包含关键词的个数;

过滤不带有某个关键词的行,并输出行号;
[[email protected] linuxidc.com ~]# grep -nv ‘nologin‘ /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
20:user1:x:600:501::/home/user1:/bin/bash
23:mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

过滤以nologin结尾的,系统禁止登陆的所有用户;
[[email protected] ~]# grep ‘nologin$‘ /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

示例,打印关键字halt所在行的A2 B2 C2
[[email protected] linuxidc.com ~]# grep -A2 ‘halt‘ passwd 
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[[email protected] linuxidc.com ~]# grep -B2 ‘halt‘ passwd 
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[[email protected] linuxidc.com ~]# grep -C2 ‘halt‘ passwd 
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

把所有以#号开头的行去除

[[email protected] linuxidc.com ~]# grep -v ‘^#‘ /etc/inittab 
id:3:initdefault:

去除所有空行和以#号开头的行

[[email protected] linuxidc.com ~]# grep -v ‘^#‘ /etc/crontab |grep -v ‘^$‘
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

示例说明,打印数字或字母开头,及不是字母和数字开头的;
[[email protected] linuxidc.com tmp]# cat test.txt 
helloworld
abc
abc11111
#differt
12345
67899
123def

[0-9]代表任意一个数字,整个命令意思筛选出包含任意一个数字的行;

[[email protected] linuxidc.com tmp]# grep ‘[0-9]‘ test.txt 
abc11111
12345
67899
123def

[^0-9]代表除0-9之外的任意一个字符,整个命令的意思是筛选出不包含数字的行;

[[email protected] linuxidc.com tmp]# grep ‘[^0-9]‘ test.txt 
helloworld
abc
abc11111
#differt
123def

^[^0-9]代表不是数字开头的;

[[email protected] linuxidc.com tmp]# grep ‘^[^0-9]‘ test.txt 
helloworld
abc
abc11111
#differt

[a-z]代表任意一个英文字母;

[[email protected] linuxidc.com tmp]# grep ‘[a-z]‘ test.txt 
helloworld
abc
abc11111
#differt
123def

[^a-z]代表除英文字母以外的;

[[email protected] linuxidc.com tmp]# grep ‘[^a-z]‘ test.txt 
abc11111
#differt
12345
67899
123def

^[^a-z]代表不是英文字母开头的文本;

[[email protected] linuxidc.com tmp]# grep ‘^[^a-z]‘ test.txt 
#differt
12345
67899
123def

[ ] 如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写 字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符。

过滤任意一个字符与重复字符
[[email protected] linuxidc.com ~]# grep ‘h..t‘ /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt

‘.‘点表示任意的一个字符,上面例子为把符合h与t之间有2个任意字符的行过滤出来。

‘*‘代表零个或多个任意的字符
‘ooo*‘代表oo,ooo,oooo 或者更多的o
[[email protected] linuxidc.com ~]# grep ‘ooo*‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

‘.*‘表示零个或多个任意字符,等于所有的,空行也包含在内。
[[email protected] linuxidc.com ~]# grep ‘.*‘ /etc/passwd |wc -l
24
[[email protected] linuxidc.com ~]# wc -l /etc/passwd
24 /etc/passwd

指定要过滤字符出现的次数
{ }内部为数字,表示前面字符要重复的次数。表示两个O即包含OO的行。{ }左右都需要加脱意字符
grep -E 代表增强版的grep即egrep,使用egrep不需要脱意;
123456789 [[email protected] linuxidc.com ~]# grep ‘o{2}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[[email protected] ~]# grep -E ‘o{2}‘ passwd 
[[email protected] ~]# egrep ‘o{2}‘ passwd

[[email protected] linuxidc.com ~]# cat test.txt 
root:hot
abcde
spoool
spool
spol
spl

示例,过滤字母o出现1到3次的行

[[email protected] linuxidc.com ~]# grep ‘o{1,3}‘ test.txt 
root:hot
spoool
spool
spol

{ } 还可以表示一个范围,格式为{n1,n2} n1<n2 表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。

egrep为grep的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成。
grep -E = egrep

1、筛选一个或一个以上前面的字符    字符后面使用+
[[email protected] linuxidc.com ~]# cat test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[[email protected] linuxidc.com ~]# egrep ‘o+‘ test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
[[email protected] linuxidc.com ~]# egrep ‘oo+‘ test.txt 
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
[[email protected] linuxidc.com ~]# egrep ‘ooo+‘ test.txt 
rooooot:x:0:0/roooooot:/bin/bash

2、筛选零个或一个前面的字符    字符后面使用?

[[email protected] linuxidc.com ~]# egrep ‘o?‘ test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[[email protected] linuxidc.com ~]# egrep ‘oo?‘ test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
[[email protected] linuxidc.com ~]# egrep ‘ooo?‘ test.txt 
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
[[email protected] linuxidc.com ~]# egrep ‘oooo?‘ test.txt 
rooooot:x:0:0/roooooot:/bin/bash

3、筛选字符串1或字符串2    包含里面任意一个字符串的打印出来

[[email protected] linuxidc.com ~]# egrep ‘aaa|111|ooo‘ test.txt 
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

4、egrep中()的应用

[[email protected] linuxidc.com ~]# egrep ‘r(oo)|(mo)n‘ test.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash

用( )表示一个整体,例如(oo)+ 表示1个‘oo‘或者多个‘oo‘

[[email protected] linuxidc.com ~]# egrep ‘(oo)+‘ test.txt 
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash

5、egrep中[ ]的应用   

方括号内的字符为其中的一个;[^o]为除了字母o之外的;
示例:r开头t结尾的;;
[[email protected] ~]# egrep ‘r[o]t‘ test.txt 
rot:x:0:0:rot:/rot:/bin/bash

r开头后面有o的

[[email protected] ~]# egrep ‘r[o]‘ test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash

r开头后面不是o的;

[[email protected] ~]# egrep ‘r[^o]‘ test.txt 
rrt
rtx

t为结尾的前面字符不是o的;

[[email protected] ~]# egrep ‘[^o]t‘ test.txt 
rrt
rtx

. * + ? 符号的总结
.    表示任意一个字符(包括特殊字符 空格 # $ ?)
*    表示零个或多个*前面的字符
.*  表示任意个任意字符(包含空行)
+    表示1个或多个+前面的字符
?    表示0个或1个?前面的字符
其中,+ ? grep不支持,egrep才支持。

"ro.*t" 表示以ro开头一直到t结尾的
[[email protected] ~]# grep ‘ro.*t‘ test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash

图片显示的更详细,方便大家理解。

技术分享

grep如果需要筛选字符串 | 管道需要加脱意才可以使用;

技术分享

grep使用简明及正则表达式  http://www.linuxidc.com/Linux/2013-08/88534.htm

Linux下Shell编程——grep命令的基本运用 http://www.linuxidc.com/Linux/2013-06/85525.htm

grep 命令详解及相关事例 http://www.linuxidc.com/Linux/2014-07/104041.htm

Linux基础命令之grep详解 http://www.linuxidc.com/Linux/2013-07/87919.htm

设置grep高亮显示匹配项 http://www.linuxidc.com/Linux/2014-09/106871.htm

Linux grep命令学习与总结 http://www.linuxidc.com/Linux/2014-10/108112.htm

 

 

一、            正则表达式:

 

正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。

 

该模式描述在查找文字主体时待匹配的一个或多个字符串。

 

正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为, 正则表示式通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序。vim、grep、find、awk、sed等命令都支持正则表达式。

常用正则表达式:

1.代表任意单个字符,如:/l..e/与包含一个l,后跟两个字符,然后跟一个e的行相匹配

         grep ‘l..e’ test

         awk ‘/l..e/’ test

 

         cat  test查看文件

                   leeet

                   laat

                   lae

2、^代表行的开始。 ^love 与所有love开头的行匹配

         grep ^le test

3、$代表行的结束。love$ 与所有love结尾的行匹配

那么‘^$’ 就表示空行

grep  at$ test

4、[…]匹配括号中的字符之一

[abc]     匹配单个字符a或b或c

[123]     匹配单个字符1或2或3

[a-z]     匹配小写字母a-z之一

[a-zA-Z]    匹配任意英文字母之一

[0-9a-zA-Z]匹配任意英文字母或数字之一

注意:上面标红色的单个和之一,不管[]里面多复杂,它的结果都是一个字符!

         grep ‘l[ae]e’ test

         awk‘/l[ae]e/’ test

 

可以用^标记做[]内的前缀,表示[]内的字符之外的字符。比如 搜索oo前没有g的字符串的行. 应用 ‘[^g]oo‘作搜索字符串,^符号如果出现[]的起始位置表示否定,但是[]的其他位置是普通字符。[^9b^c] 匹配b或^或c不是a的任意单个字符

 

5、* 用于修饰前导字符,表示前导字符出现0次或任意多

如:‘a*grep‘匹配所有0个或多个a后紧跟grep的行。.*”表示任意字符串

 

6?用于修饰前导字符,表示前导字符出现0或1

a? 匹配0或1个a

 

7+用于修饰前导字符,表示前导字符出现1或多

a+ 匹配1或多个a

 

8{n,m} 用于修饰前导字符,表示前导字符出现n至m次(n和m都是整数,且n<m)

a{3,5} 匹配3至5个连续的a

 

{n,m}还有其他几种形式:

{n} 连续的n个前导字符

{n,} 连续的至少n个前导字符

9、 用于转义紧跟其后的单个特殊字符,使该特殊字符成为普通字符

 

如:^.[0-9][0-9] 以一个句点和两个数字开始

 

例如:

a* 匹配连续的任意(也包括0)个a

a? 匹配0或1个a

a+ 匹配1或多个a

a{3,5} 匹配3至5个连续的a

.* 匹配0或多个连续的.  .表示普通字符句点

 

sed ‘s/^ *[0-9]*//’ test1

history > test1(先生成test1文件)

10|表示  如:a|b|c 匹配abc。如:grep|sed匹配grepsed

    如:egrep  grep|sed test

11(),将部分内容合成一个单位组,比如要搜索 glad  good可以如下 ‘g(la|oo)d‘

       如:egrep ‘g(la|oo)d’ test

综合举例1:

1 Christian Scott lives here and will put ona Christmas party.

2 There are around 30 to 35 people invited.

3 They are:

4  Tom

5 Dan

6 Rhonda Savage

7 Nicky and Kimerly.

8 Steve, Suzanne, Ginger and Larry.

^[A-Z]..$

搜索行以A至Z的一个字母开头,然后跟两个任意字母,然后跟一个换行符的行。将找到第5行。

 

^[A-Z][a-z]*3[0-5]

搜索以一个大写字母开头,后跟0个或多个小写字母,再跟数字3,再跟0—5之间的一个数字。无法找到匹配行(改成^[A-Z][a-z]*.*3[0-5]可找到第2行)

 

^ *[A-Z][a-z][a-z]$

搜索以0个或多个空格开头,跟一个大写字母,两个小写字母和一个换车符。将找到第4行的TOM(整行匹配)和第5行。注意,*前面有一个空格

 

 

综合举例2:

# ls -l  /bin | grep  ‘^...s‘

上面的命令是用来查找suid文件的;

# ls -lR /usr |grep   ‘^...s..s‘

上面的命令是用来查找suid和guid的。

 

二、grep命令的用法

grep (global search regularexpression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.

 

参数:

1. -A NUM--after-context=NUM   除了列出符合行之外,并且列出后NUM行。

:   $ grep –A 1 panda file  (file中搜寻有panda样式的行,并显示该行的后1)

 

2. -B NUM--before-context=NUM   -A NUM 相对,但这此参数是显示除符合行之外并显示在它之前的NUM行。如:    (file中搜寻有panda样式的行,并显示该行的前1)

$ grep -B 1 panda file

 

Linux正则表达式grep与egrep

Linux正则表达式与通配符

linux三剑客---grep,sed,awk与正则表达式

Linux文本处理三剑客之grep一族与正则表达式

linux基础篇-12,grep正则表达式与扩展正则表达式

Linux中不可或缺的“grep三人组”与正则表达式的那些事