在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在不少文本编辑器或其余工具里,正则表达式一般被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操做。linux
在最简单的状况下,一个正则表达式看上去就是一个普通的查找串。如:正则表达式"test"中没有包含任何元字符,它能够匹配"test"和"007test007"等字符串,可是不能匹配"Test"。ios
要想真正的用好正则表达式,须要正确的理解元字符。正则表达式
. :匹配任何单个字符。例如正则表达式 r.t 匹配这些字符串:rat、rut、r t,可是不匹配root。bash
$ :匹配行结束符。例如正则表达式 weasel$ 可以匹配字符串"He's a weasel"的末尾,可是不能匹配字符串"They are a bunch of weasels."。编辑器
^ :匹配一行的开始。例如正则表达式 ^When in 可以匹配字符串"When in the course of human events"的开始,可是不能匹配"What and When in the"。工具
*:匹配0个或多个正好在它以前的那个字符。如,正则表达式 .* 意味着可以匹配任意数量的任何字符(表明全部内容)。spa
" \ ":脱义符,使这里列出的这些元字符以普通的字符的身份来进行匹配。如,\ . 是匹配点字符,而不是以通配符的身份出现。命令行
[ ]:匹配括号中的任何一个字符。如,正则表达式 r[aeo]d 匹配rad,red,rod。也能够指定区间 [0-9a-zA-Z],即表明全部非特殊字符!设计
\ <,\ >:匹配词(word)的开始(\ <)和结束(\ >)。例如正则表达式 \ < the 可以匹配字符串"for the wise"中的"the",可是不能匹配字符串"otherwise"中的"the"。 注意: 这个元字符不是全部的软件都支持的。code
|:将两个匹配条件进行逻辑“或”(Or)运算。 注意: 这个元字符不是全部的软件都支持的。
+:匹配1或多个正好在它以前的那个字符。注意: 这个元字符不是全部的软件都支持的。
?:匹配0或1个正好在它以前的那个字符。注意: 这个元字符不是全部的软件都支持的。
\ {i\ }\ {i,j\ }: 匹配指定数目的字符,这些字符是在它以前的表达式定义的。例如正则表达式A[0-9]\ {3\ } 可以匹配字符"A"后面跟着正好3个数字字符的串,例如A12三、A348等,可是不匹配A1234。而正则表达式[0-9]\ {4,6\ } 匹配连续的任意4个、5个或者6个数字字符。注意: 这个元字符不是全部的软件都支持的。
注: x表示支持。
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep,egrep和fgrep的命令都是grep的扩展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它们把全部的字母都看做单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,再也不特殊。linux使用GNU版本的grep。它功能更强,能够经过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
语法: grep [options] ‘Word’ filename
Options:
-c:=count 行数
-i:=ignore-case 不区分大小写
-n:=line-number 显示行号
-v:=revert-match 取反
-r,-R:=recursive(递归的,循环的)读取目录下的全部文件,包括子目录
-A:后面跟数字,过滤出复合要求的行以及下面n行
-B:同上,过滤出符合要求的行以及上面n行 -C:同上,同时过滤出符合要求的行以及上下各n行
-E:‘grep -E’ = egrep
eg:
[root@1 grep]# grep 'nologin' 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 [root@1 grep]# which grep alias grep='grep --color=auto' /usr/bin/grep
[root@1 grep]# grep -c 'nologin' passwd 4 [root@1 grep]# cat !$ cat passwd root:x:0:0:root:/root:/bin/bash 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
[root@1 grep]# grep -n 'nologin' passwd 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
[root@1 grep]# cat !$ cat passwd root:x:0:0:root:/root:/bin/bash 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 [root@1 grep]# grep 'nologin' passwd 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 [root@1 grep]# grep -i 'nologin' 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 [root@1 grep]# grep -c 'nologin' passwd 3 [root@1 grep]# grep -ic 'nologin' passwd 4
[root@1 grep]# grep -v 'nologin' passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/Nologin
[root@1 grep]# tree . ├── grep1 │ └── passwd1 └── passwd [root@1 grep]# grep -r 'root' . ./passwd:root:x:0:0:root:/root:/bin/bash ./grep1/passwd1:root:x:0:0:root:/root:/bin/bash [root@1 grep]# grep -R 'root' . ./passwd:root:x:0:0:root:/root:/bin/bash ./grep1/passwd1:root:x:0:0:root:/root:/bin/bash
[root@1 grep]# grep -nA2 'daemon' passwd 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
[root@1 grep]# grep -nB2 'daemon' passwd 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
[root@1 grep]# grep -nC2 'daemon' passwd 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
[root@1 grep]# grep -n '[0-9]' passwd 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 5:adm:x:3:4:adm:/var/adm:/sbin/nologin 6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7:pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
[root@1 grep]# cat !$ cat passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/Nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/c adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target [root@1 grep]# grep -nv '[0-9]' passwd 4:Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/c 8:Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
[root@1 grep]# cat inittab # inittab is no longer used when using systemd. # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. lhugalkdoljweriii # systemd uses 'targets' instead of runlevels. By default, there are two main targets: jlkdghkhladlllsdjfj # multi-user.target: analogous to runlevel 3 # graphical.target: analogous to runlevel 5 [root@1 grep]# grep -n '^#' inittab 1:# inittab is no longer used when using systemd. 2:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. 4:# systemd uses 'targets' instead of runlevels. By default, there are two main targets: 6:# multi-user.target: analogous to runlevel 3 7:# graphical.target: analogous to runlevel 5 [root@1 grep]# grep -nv '^#' inittab 过滤不是以#开头的行 3:lhugalkdoljweriii 5:jlkdghkhladlllsdjfj
[root@1 grep]# cat inittab # inittab is no longer used when using systemd. # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. lhugalkdoljweriii 23542524 1245a879869 # systemd uses 'targets' instead of runlevels. By default, there are two main targets: 6999%&*0927309 # multi-user.target: analogous to runlevel 3 ^%^%$&%%*&## # graphical.target: analogous to runlevel 5 [root@1 grep]# grep '[^0-9]' inittab # inittab is no longer used when using systemd. # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. lhugalkdoljweriii 1245a879869 # systemd uses 'targets' instead of runlevels. By default, there are two main target: 6999%&*0927309 # multi-user.target: analogous to runlevel 3 ^%^%$&%%*&## # graphical.target: analogous to runlevel 5
[root@1 grep]# grep '^[^0-9]' inittab # inittab is no longer used when using systemd. # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. lhugalkdoljweriii # systemd uses 'targets' instead of runlevels. By default, there are two main targets: # multi-user.target: analogous to runlevel 3 ^%^%$&%%*&## # graphical.target: analogous to runlevel 5
[root@1 grep]# grep 'r.o' passwd root:x:0:0:roprot:/root:/bin/bash pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
[root@1 grep]# grep 'o*o' passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/Nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
[root@1 grep]# grep '.*' passwd root:x:0:0:roprot:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/Nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
[root@1 grep]# grep -n 'o\{2\}' passwd 1:root:x:0:0:roprot:/root:/bin/bash 4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c 6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@1 grep]# grep -n 'o\{3\}' passwd 4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c [root@1 grep]# grep -n 'o\{0,3\}' passwd 1:root:x:0:0:roprot:/root:/bin/bash 2:bin:x:1:1:bin:/bin:/sbin/Nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c 5:adm:x:3:4:adm:/var/adm:/sbin/nologin 6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7:pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin 8:Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
[root@1 grep]# grep -nE 'o{2}' passwd 1:root:x:0:0:roprot:/root:/bin/bash 4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c 6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@1 grep]# egrep -n 'o{2}' passwd 1:root:x:0:0:roprot:/root:/bin/bash 4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c 6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 当{}前面是一个字符串时须要使用‘()’
[root@1 grep]# egrep -n 'o+o' passwd 1:root:x:0:0:roprot:/root:/bin/bash 4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c 6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@1 grep]# egrep -n 'o?t' passwd 1:root:x:0:0:roprot:/root:/bin/bash 4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c 7:pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin 8:Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
[root@1 grep]# egrep -n 'root|nologin' passwd 1:root:x:0:0:roprot:/root:/bin/bash 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 5:adm:x:3:4:adm:/var/adm:/sbin/nologin 6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7:pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
[root@1 grep]# grep -nE '(oo){2}' passwd 4:Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c
过滤一个目录下全部某类型文档中含有某字符的行:
[root@1 ~]# grep -r --include="*.txt" 'root' ./sed/ ./sed/test.txt:root:x:0:0:roprot:/root:/bin/bash
说明: 过滤./sed/目录下全部.txt文件中含有字符串root的行。