通配符和正则表达式-grep,egrep,fgrep

Posted

tags:

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

通配符和正则表达式-grep,egrep,fgrep


通配符和正则表达式,通配符用于文件名匹配,命令支持ls,cp,rm等;正则为通用匹配,命令支持grep,awk,sed,vi,find等。文本过滤工具grep,egrep,fgrep


通配符

*  匹配零个或多个任意字符

?  匹配单个任意字符

[] 匹配指定范围内的一个字符,[]括号中的 字符间隔符 可以省略,如,\=:等等。举例[1:2=3,5\7] = [12357],也推荐使用这种省略写法作为标准

^  取反,表示非。注意:非数字即包含字母、特殊字符和汉字,非字母即包含数字、特殊字符和汉字。一个汉字属于一个字符


通配符举例:

[1]

[123]

[1-5]

[135]

[1-3,79] = [1-379]

8[0-9]  匹配数字80-89,首位8为固定匹配,第二位为顺序匹配0-9

1[0-9][0-9]  匹配数字100-199,首位1为固定匹配,第二位和第三位为顺序匹配0-9

[^123]

[^12,5] = [^125]

[^1-5,9] = [^1-59]

[0-9]  匹配数字0-9

[^0-9]  非数字,即匹配所有大小写字母和特殊字符

[a-Z]  匹配所有大小写字母,排序为a,A,b,B,c,C...z,Z

[0-Z]  零到大写Z,即匹配所有数字和大小写字母,顺序为0-9,a,A,b,B,c,C...y,Y,z,Z

[^0-Z]  匹配特殊字符

[a-z]  注意这里并非匹配的是a-z,而是除了大写Z之外的字母

[A-Z]  注意这里并非匹配的是A-Z,而是除了小写a之外的字母

[abc]  匹配a,b,c

[a-c]  匹配a,A,b,B,c

[a-C]  匹配a,A,b,B,c,C

[A-C]  匹配A,b,B,c,C

[ACdf]  匹配A,C,d,f

[^a-d]  匹配除了a,A,b,B,c,C,d

[wang]  匹配列表中的任意一个字符w,a,n,g

[^wang]  匹配列表中的所有字符以外的字符

[5-9a-CZ]  数字字母支持混合,匹配5-9,a,A,b,B,c,C,Z

[[:lower:]]  匹配小写字母a,b,c,d...

[[:upper:]]  匹配大写字母A,B,C,D...


预定义的字符类 可通过man 7 glob查看

[[:alnum:]]  匹配任意一个字母或数字,同[0-Z]零-大写Z

[[:alpha:]]  任意一个大小写字母,同[a-Z]小写a-大写Z

[[:lower:]]  任意小写字母

[[:upper:]]  任意大写字母

[[:blank:]]  水平空白字符(空格和制表符)

[[:space:]]  水平或垂直空白字符(比[:blank:]包含的范围广),同[\t\r\n\v\f]

[[:cntrl:]]  任意一个控制字符(ASCII字符集中的前32个字符,退格,删除,警铃...),不可打印字符

[[:digit:]]  任意一个数字,同[0-9]

[[:xdigit:]] 任意一个十六进制数,同[0-9a-F]

[[:graph:]]  任意一个可打印的非空白字符

[[:print:]]  任意一个可打印字符

[[:punct:]]  任意标点符号


字符位说明

[0-9]或[a-Z]或[0-Z]  表示匹配一个字符位,如0,1,9,a,A,z,Z

[a-Z][0-9]  表示匹配两个字符位,且首位为字母,第二位为数字,如a1,b2,c9,Z8,K6

[0-9]??  表示匹配三个字符位,且首位为数字,如010,2ai,98h,66Z

[0-9]*  表示匹配一个或多个字符位,且首位为数字,如1,12,800,10ab,39KEaL

[^0-9]*  表示匹配一个或多个字符位,且首位不是数字,如a,ab,a102,NCo3la


案例:

touch {A..z}  创建大小写字母和5个特殊字符 "`_^][",注意这里的大括号{A..z}并不是通配符
touch {0..9}  创建数字0-9
touch f{A..z}
touch f{0..9}
touch f汉 f汉字
touch f.log
touch f21 f23 f24 f234 f32 f35 f63 f-1 f-12 fa_b f4422 faaa4d35 faaa4d3rr5

touch /root/d1/-al  创建-al文件,注意-开头的文件增删改查必须指定绝对路径,而且-文件无法用通配符匹配过滤,可匹配到的即自动认为是命令参数直接运行

ls ??l  显示为执行后的结果,即匹配到-al后自动作为ls的参数执行ls -al

ls f[1,2,3]  显示f1,f2,f3
ls f[123]  显示f1,f2,f3
ls f[23]  显示f2,f3
ls f[2323]  显示f2,f3
ls f[2,3,23]  显示f2,f3
ls f[23]*  显示f2  f21  f23 f234 f24  f3  f32  f35
ls f[23]?  显示f21  f23  f24  f32  f35,同f2? and f3?
ls f*[23]?  显示f21  f23  f234  f24  f32  f35  f4422  faaa4d35,同f*2? and f*3?
ls f*3*  显示f23  f234  f3  f32  f35  f63  faaa4d35  faaa4d3rr5
ls f*[123]  显示f1  f-1  f-12  f2  f21  f23  f3  f32  f4422  f63
ls f?[123]  显示f-1  f21  f23  f32  f63
ls [aBZ]  显示a  B  Z
ls [^aBZ]  显示非a,B,Z之外的单个字符,包括数字和大小写字母,以及特殊符号,还有汉字
ls [^aBZ5-9]  显示非a,B,Z,5-9之外的单个字符
ls f?  //可以匹配到f汉,说明一个汉字也属于一个字符
ls f????  //可以匹配到f.log,说明后缀也属于字符长度
ls *.*  匹配所有带有后缀名的文件,或者文件名中有.的文件
ls *-*  匹配所有文件名中带有-的文件
ls *_*  匹配下划线
ls -d /etc/*.d  显示/etc下的所有以.d结尾的文件和目录

Funny-变相删除文件

创建文件:
mkdir ~/d1
cd ~/d1
touch {0..9}
touch {A..z}
第一种删除:
touch /root/d1/-rf
ls
rm ??f a b c A B C 1 2 3
rm ??f [^0-9]  //删除非数字字符
mv 9 999
rm ???  //自动删除999,即删除与-rf位数匹配(都是3位)的文件
rm ??? *  //删除所有,但是无法删除-rf文件
rm -rf *  //此命令同上,无法删除-rf文件,需添加绝对路径
rm ??? ~/d1/-rf  //成功删除
第二种删除:
touch rm\ \-rf\ \*  //创建rm -rf *这个文件
ls rm*  //可以匹配到rm -rf * 这个文件,是否可以执行呢
ls [r]*[r]???  //同上
ls rm*|/bin/bash  //用管道交给bash执行

#########################

linux文本处理三剑客

grep:文本过滤工具(模式:pattern),egrep,fgrep(不支持正则表达式搜索)

sed:stream editor,文本编辑工具

awk:Linux上实现gawk,文本报告生成器


grep:Global search REgular expression and Print out the line

作用:文本搜索工具,根据用户指定的模式对目标文本进行逐行匹配检查,并打印匹配到的行

模式:由正则表达式字符及文本字符所编写的过滤条件


格式和选项

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

注意:PATTERN如果是表达式或者多个单词的, 需要用引号引用. 可以是单引号‘‘也可双引号"", 区别是单引号无法引用变量而双引号可以.


--color=auto:对匹配到的文本着色显示
-v:显示没有匹配到的行,即排除关键字行
-i:忽略字符大小写
-n:显示匹配到的行,并显示行号
-c:统计匹配到的行的行数,有几行
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何信息,0表示有匹配到,1表示未匹配到
-A #:after,同时显示匹配到行的后#行
-B #:before,前#行
-C #:context,前后各#行,可简写为-#
-e:实现多个选项间的逻辑或关系,grep -e ‘cat‘ -e ‘dog‘ file
-w:整行匹配整个单词,单词包括字母,数字和下划线_,一个汉字也是一个单词
-l:同时搜索匹配多个文件时,列出匹配到的文本在哪些文件中
-E:使用ERE,相当于egrep
-F:相当于fgrep,不支持正则表达式
-d 动作参数:指定要查找的是目录而非文件,动作参数有:read,recurse,skip
-r:递归搜索,效果同"-d recurse"参数

匹配用户名的5种写法

grep root /etc/passwd
grep ‘root‘ /etc/passwd  //‘‘显示为字符串,即效果同上,用于匹配包含特殊符号的内容,如‘/root‘
grep "$USER" /etc/passwd  //""可以引用变量
grep `whoami` /etc/passwd
grep $(whoami) /etc/passwd

案例:

cp /etc/passwd ~/
grep "name" f1 f2 f3...  在多个文件中查找匹配
grep root passwd |grep nologin  且
grep -e root -e usera passwd  或
grep -i ROOT passwd
grep -w root passwd  //完全匹配单词root的行,不包括rooter用户
grep -v "nologin" passwd
echo abc is acb |grep -o "abc"
grep -c root passwd
grep -n root passwd
grep -l abc passwd group

#grep root . -r -n  //在当前目录下递归搜索匹配root并显示文件名和匹配内容的行号
./passwd:1:root:x:0:0:root:/root:/bin/bash
./passwd:10:operator:x:11:0:operator:/root:/sbin/nologin
./group:1:root:x:0:
./a/abc:1:root,ala

grep -q root passwd
grep root passwd &> /dev/null  功能同上
echo $?  正确为0,错误执行显示为非0,可能是1或2,127...
grep rroot passwd &> /dev/null  未匹配到内容,显示为1
grep root pass &> /dev/null  文件名错误,显示为2
gep root passwd &> /dev/null  命令错误,显示为127

在grep搜索结果中包括或者排除指定文件:
1.只在目录中所有的.php和.html文件中递归搜索字符"main()"
#grep "main()" . -r --include *.{php,html}
2.在搜索结果中排除所有README文件
#grep "main()" . -r --exclude "README"
3.在搜索结果中排除filelist文件列表里的文件

#grep -nA6 root passwd  //同时显示匹配到行的后6行
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6-sync:x:5:0:sync:/sbin:/bin/sync
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:99:99:Nobody:/:/sbin/nologin
14-systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
15-systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16-dbus:x:81:81:System message bus:/:/sbin/nologin
time cmd  //计算cmd执行的时长

###########################

基本正则表达式

REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配符的功能。

正则表达式(regular expression)就是用一个"字符串"来描述一个特征,然后去验证另一个"字符串"是否符合这个特征。

正则表达式的组件可以是单个字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。


支持的程序:grep,vim,less,nginx

分两类:基本正则BRE(grep),扩展正则ERE(grep -E,egrep)

元字符分类:字符匹配、匹配次数、位置锚定、分组

查看正则表达式:man 7 regex

基本正则表达式的特殊符号需要转义,如[]()|\*,表示为:"\(\)","\[\]","\|""\\"在扩展正则表达中不需要加\


字符匹配:

.  匹配除换行符(\n)之外的任意单个字符

[]  匹配指定范围内的任意单个字符

[^]  匹配指定范围之外的任意单个字符


匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

? 匹配前面的字符0次或1次,即≤1次

* 匹配前面的字符0次或多次,即≥0次

+ 匹配前面的字符1次或多次,即≥1次

*  匹配前面的字符任意次,包括0次,同\{0,\}。grep默认为贪婪模式:尽可能长的匹配

   注意区别:通配符的*指的是匹配零个或多个任意字符,正则表达式的*指的是匹配前一个字符零次或多次


.*  匹配任意长度的任意字符

\?  匹配其前面的字符0或1次,同\{0,1\}

\+  匹配其前面的字符至少1次,同\{1,\}

\{n\}  匹配前面的字符n次

\{n,m\}  匹配前面的字符至少n次,至多m次,包括n次和m次,即[n-m]

\{,m\}  匹配前面的字符至多m次,即m次以下,包括m次和0次

\{n,\}  匹配前面的字符至少n次,即n次以上,包括n次

[0-9]

[a-z]

[A-Z]

[:alnum:]  匹配任意一个字母或数字,同[a-zA-Z0-9]

[:alpha:]  任意一个大小写字母,同[a-zA-Z]

[:lower:]  任意小写字母

[:upper:]  任意大写字母

[:blank:]  水平空白字符(空格和制表符)

[:space:]  水平和垂直的空白字符(比[:blank:]包含的范围广),同[\t\r\n\v\f]

[:cntrl:]  任意一个控制字符(ASCII字符集中的前32个字符,退格,删除,警铃...),不可打印字符

[:digit:]  任意一个数字,同[0-9]

[:xdigit:] 任意一个十六进制数,同[0-9a-fA-F]

[:graph:]  任意一个可打印的非空白字符

[:print:]  任意一个可打印字符

[:punct:]  任意标点符号

[[:alpha:]] = [a-zA-Z]

[[:digit:]mage] = [0-9mage]


位置锚定:定位出现的位置

^word  行首锚定^,开始标记

word$  行尾锚定$,结束标记

^pattern$  用于模式匹配整行,^$ 空行, ^[[:space:]]*$ 空白行,即包括空格或tab等的行

\  斜杠表示匹配转义后的字符,如\/,即匹配/

\< 或 \b  词首锚定,匹配单词开始

\> 或 \b  词尾锚定,匹配单词结束

\<pattern\>  匹配整个单词

|  竖线表示或,如a|b,即匹配a或b


单词边界:除了字母,数字和下划线_以外的字符

注意:\<^[^0-9]..host\>  //第一个^表示行首锚定,第二个在[]里的^表示非,即排除数字。


分组:表示为\(\) 将一个或多个字符捆绑在一起,当做一个整体进行处理,如\(root\)\+

分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名方式为:\1,\2,\3...

\1  表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

() 标记匹配的字符串,将候选的所有元素放在()中,用|隔开,如a(1|2|3)b,即匹配a1b,a2b,a3b

grep rooo*t passwd  注意o*包括0次,0次即为空
o*包括:空,o,oo,ooo,oooo,oooo...
vi gle.txt
gle
ggle
gogle
google
abc
goooogle
goooooooooogle
goooooo00000gle
grep gooo*gle gle
grep g...*gle gle
grep "go\?gle" gle
grep "go\{4\}gle" gle
grep "go\{1,6\}gle" gle
grep "go\{,6\}gle" gle
grep "go\{2,\}gle" gle
echo ar br cr |grep "[ab]r"
echo ar br cr |grep "[^ab]r"
echo aaa bbb ccc|grep a*b
grep [a-g]a passwd
grep r.*t passwd
grep "ro\{2\}t" passwd
grep -o r..t passwd
echo rororo | grep "\(ro\)\{2,\}"  //匹配2次以上的ro,可以匹配到
echo rororo | grep "\(ro\)\{4,\}"  //匹配4次以上的ro,则匹配不到
echo ac bc | grep "a\|b"  //匹配a或b
echo ac bc ab cb | grep "\(a\|b\)c"  //匹配ac或bc
grep ‘:[0-9][0-9][0-9]:‘ passwd  //匹配包含连续3个数字的行
grep ^root passwd
grep bash$ passwd
grep -n ^$ f1  //匹配空行
grep -v ^# /etc/fstab  //匹配#号注释的行
grep -n "^[[:space:]]*$" f1  //匹配空白行,-v取反
grep ‘^r.*n$‘ /etc/passwd  //匹配以r开头n结尾的行
grep ‘^r.*n‘ /etc/passwd  //匹配以r开头的行
grep "\(r..t\).*\1" passwd
grep "\(a.c\).*\(1.3\).*\1.*\2" /etc/passwd
nmap -v -sP 172.17.252.0/24 | grep -B "Host is up" | grep for > ipup
more ipup |cut -d" " -f5
nmap -v -A 172.17.0.1  //扫描服务端口
grep ‘#[[:space:]]*[^[:space:]]‘ /etc/inittab
grep ‘^\(1\|2\)‘ /etc/inittab或grep -E ‘^(1|2)‘ /etc/inittab
ifconfig | grep ‘inet ‘ | grep -v ‘127.0.0.1‘|tr -s ‘ ‘ |cut -d‘ ‘ -f3 //centos73截取IP
ifconfig eth0|grep Mask |cut -d: -f2|cut -d" " -f1  //centos6截取IP
ifconfig |grep -A 1 "^eth0" |grep "\<[0-9.]\{1,\} |cut -d: -f2
df |grep /dev/sd|tr -s ‘ ‘ %| cut -d% -f5|sort -nr|head -1
echo "efc:ab_2344c def"|grep "\<efc\>"
echo "hi,Lily,Lucy,Tom." |grep "\bhi\b.*\bLucy\b"
echo "010-12345678 021-23898264 0215-892343951" |egrep "\b0[0-9]{2,3}-[0-9]{8}\b"  匹配固话:3或4位区号-8位电话号码


扩展的正则表达式

egrep = grep -E

字符匹配:无需转义

.  任意单个字符

[]  指定范围的字符

[^]  不包含指定范围的字符

次数匹配:无需转义

*:匹配前面字符任意次,包括0次

?:0或1次

+:1次或多次

{n}:匹配n次

{n,m}:至少n,至多m次,包含nm次

位置锚定:同基本正则

^:行首

$:行尾

\<或\b:语首

\>或\b:语尾

分组:

():user(a|b),匹配usera或userb

后项引用:最多可以匹配9个模式,即\1...\9

(...)(...)\1\2:模式匹配,\1代表前一个括号模式,\2代表后一个括号模式

a|b|c:a或b或c

(C|c)at:Cat或cat


案例:

egrp "go+gle" gle
egrp "go{1,3}gle" gle
egrep ‘^+‘ f1   以一个或者多个空格开头的行
grep ‘^*‘ f1  同上
egrep ‘user(aa|bb)‘ f1 包含useraa或userbb的行
egrep ‘(ab)+‘ f1 包含至少一个ab的行
egrep ‘x[0-9]?‘ f1 包含x或者x后面跟着0个或者多个数字的行
egrep ‘fun\.$‘ * 所有文件里面以fun.结尾的行
egrep ‘[A-Z]+‘ f1 至少包含一个大写字母的行
egrep ‘[0-9]‘ f1 至少一个数字的行
egrep ‘[A-Z]...[0-9]‘ f1 包含五个字符, 第一个是大写字母, 最后一个是数字的行
egrep ‘[tT]est‘ f1 包含单词test或Test的行
egrep ‘ken sun‘ f1 包含ken sun的行
egrep -v ‘marry‘ f1 不包含marry的行
egrep -i ‘sam‘ f1 不考虑sam的大小写,含有sam的行
egrep -l "root" *在当前目录中查找包含root的文件并显示文件名
egrep -n tom f1 包含tom的行并显示行号
egrep -s "$name" f1 找到变量名$name的, 不打印而是显示退出状态. 0表示找到. 1表示表达式没找到符合要求的, 2表示文件没找到

 

参考网址:http://man.linuxde.net/

此文章为个人学习总结,如有任何问题,请评论留言。


本文出自 “rackie” 博客,请务必保留此出处http://rackie386.blog.51cto.com/11279229/1931531

以上是关于通配符和正则表达式-grep,egrep,fgrep的主要内容,如果未能解决你的问题,请参考以下文章

grep和正则表达式

2.6-grep及正则表达式

grep和egrep正则表达式

13 shell脚本--005grep和正则表达式

grep和egrep命令及相应的正则表达式用法总结

grep egrep 通配符