1).简单的grep
grep [option] PATTERM [file...]
#grep 'root' /etc/passwd
-E:使用扩展正则表达式
-F:使用固定字符串进行匹配
-l:列出匹配模式的文件名称,而不是打印匹配的行
-q:静默模式,匹配grep则成功退出,不匹配则写入标准输出
-S:不显示错误信息
-i:忽略字符大小写
--color:显示颜色
# alias grep='grep --color'
# grep 'root' /etc/passwd
-v :反向查找,显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
2).基本正则表达式
meta字符
.:匹配任意单个字符
# grep 'r..t' /etc/passwd
*:匹配其前面的字符任意次
a*b b,aab, 即a出现任意次以后跟一个b
^:锚定行首,此字符后面的任意内容必须出现在行首
# grep '^r..t' /etc/passwd
$:锚定行尾,此字符前面的任意内容必须出现在行尾
# grep 'w$' /etc/passwd
# grep 'r..t$' /etc/passwd
^...$:整个字符串
^$: 空白行
# grep '^$' /etc/passwd 查看空白行
$ cc -E foo.c | grep -v '^$' > foo.out
#先使用grep -v显示不匹配的行(即非空白行),重定向到新的文件,从而过滤文件中空白行
链接:
cc -E :这个选项是相对标准的,它允许修改命令行以使编译程序把预先处理的C文件发到标准输出,而不实际编译代码.
在查看C预处理伪指令和C宏时,这是很有用的.可能的编译输出可重新定向到一个文件,然后用编辑程序来分析:
$cc -c -E foo.c > foo.out
#此命令使include文件和程序被预先处理并重定向到文件foo.out.
#以后可以用编辑程序或者分页命令分析这个文件,并确定最终的C语言代码看起来如何.
\{n,m\}:匹配其前单个字符重现的次数区间,n-m次,匹配其前的字符至少n次,至多m次
n与m的值必须介于0至RE_DUP_MAX(含)之间
$ getconf RE_DUP_MAX 获得值
\{n\}:重现n次
\(n,\}:至少重现n次
\{1,\} ;至少一次
\{0.3\} :至多三次
# grep 'a\{1,3\}b' test.txt
ab aab aaab
# grep 'a.\{1,3\}b' test.txt
aab acb amnb amnbnnhb
练习1:以abcABCdefDEF匹配
^ABC 不匹配
def 匹配
def$ 不匹配
[[:upper:]]\{3\} 匹配,居中456ABC匹配
[[:upper:]]\{3\}$ 匹配,结尾DEF匹配
^[[:alpha:]]\{3\} 匹配,起始abc匹配
.*:任意长度的任意字符
# a.*b a开头b结束中间任意
贪婪模式:默认情况下正则表达式工作在贪婪模式,尽可能长匹配
?:匹配其前面的字符一次或0次
部分符合也可以
a?b
b ,ab ,aab,acb,adb,ammb,annnbnnhbnb
|:匹配于|符号前或后的正则表达式
+:匹配前面正则表达式的一个或多个实例
():匹配括号中内容
[.与.]:排序,给予成组的项目排列顺序的操作,
如假定[.cd.]存在,则[ab[.cd.]ef]匹配a,b,e,f,以及成对出现的cd
[=与=]:等价字符集,让不同字符集在匹配时视为相同字符集
如French的locale下,可能有[=e=]这样的等价字符集,
则[Fi[=e=]ld]就等同于所有小写英文字母元音,以及字母è、é等
\<或者\b:锚定词首,其后面的任意字符必须作为单词首部出现
\>或者\b:锚定词尾,其前面的任意字符必须作为单词尾部出现
# grep " \
后向引用:匹配于正则表达式匹配的先前的部分
①. 将子表达式包围在 \( 和 \) 里,单个模式里最多可包含9个子表达式,且可为嵌套结构
②.在同一个模式之后使用 \digit, 数字digit介于1至9个数字。
指的是匹配于第n个先前方括号内子表达式匹配成功的字符
\(\) :后向引用
\1:引用第一个左括号以及与之对应的右括号所包括的所有内容
# grep '\(l..e\).*\1' test3.txt 匹配一个或多个l..e
# grep '\([0-9]).*\1$' /etc/passwd 任意数字 相同数字结尾
\(ab\)\(cd\)[def]*\2\1 abcdcdab、 abcdeeecdab、 abceddeefffcdab、....
\(why\).*\1 :表示一行里重现两个why
\([“ ’].*\1:表示匹配以单引号或双引号括起来的字,例如"bar"或者'foo'
e\(ch\)o.*\1表示,当遇到echo时,把ch保存在内存中,并编号为1,之后,
可以有0个或者多个字符。当再遇到ch时,匹配到一个。
#grep "\( [\"\'] \).*\1" junk 可以匹配"'How are you'" #先双引号,再单引号和'"How are you"' #先单引号,再双引号
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围之外的任意单个字符
字符集合
[[:blank:]] 空格(space)与定位(tab)字符
[[:cntrl:]] 控制字符
[[:graph:]] 非空格(nonspace)字符
[[:space:]] 所有空白字符
[[:print:]] 可显示的字符
[[:xdigit:]] 十六进制数字
[[:punct:]] 所有标点符号
[[:lower:]] 小写字母
[[:upper:]] 大写字母
[[:alpha:]] 大小写字母
[[:digit:]] 数字
[[:alnum:]] 数字和大小写字母
# grep '[[:space:]][[:digit:]]$' /etc/passwd
以空格数字结尾
注意:排序元素、等价字符集以及字符集,都仅在方括号表达式的方括号内才被认可,也即是说,[:alpha:]这样的正则表达式,匹配字符为a、l、p、h、a以及:,
表达所有英文字母的正确写法应为[[:alpha:]]
BRE运算符优先级 由高到低
运算符
表示意义
[..] [= =] [::]
用于字符排序的方括号符号
\metacharacter
转义的meta字符
[]
方括号表达式
\(\) \digit
子表达式与后向引用
* \{ \}
前置单个字符重现的正则表达式
无符号 (no symbol)
连续
^ $
锚点(Anchors)
练习2:
1.通过管道过滤ls -l输出的内容,只显示以abc开头的行。
$ ls -l | grep '^abc'
2.显示所有以d开头的文件中包含test的行。
$ grep 'test' d*
3.显示在aa,bb,cc文件中匹配test的行。
$ grep 'test' aa bb cc
4.显示aa文件中所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep '[a-z]\{5\}' aa
5.如果Field被匹配,则ie就被存储到内存中,并标记为1,然后搜索任意个字符(.*),
这些字符后面紧跟着另外一个ie(\1),找到就显示该行。
$ grep 'F\(ie\)id.*\1' aa #如果用egrep或grep -E,就不用双引号进行转义,直接写成'F(ie)ld.*\1'就可以了。
6.查找当前系统上名字为student(必须出现在行首0的用户的账号的相关信息,文件为/etc/passwd
$ grep'^student' /etc/passwd | cut -d: -f3
id -u student
链接:
/etc/passwd 下的文件
[gz_field@gimei3 ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
account:登录名
password;密码 密码不在这放 而在 /etc/shadow
UID:用户ID号
GID:基本组ID
comment 用户的注释信息 全名等信息
HOME DIR:家目录
SHELL:用户默认shell
7.分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现的数字必须相同),
请写出精确找到类似两行的模式
11:1:wait:/etc/rc.d/rc 1
13:3:wait:/etc/rc.d/rc 3
# grep '^1\([0-9]\):1.*\1$' /etc/inittab
4).扩展的正则表达式(Extended Regular Expression, ERE)
⑴匹配单个字符时,基本同BRE
awk中存在一个例外,其\符号在方括号内表示其他的含义
若需匹配左方括号、连字符、右方括号或是反斜杠,则需使用[\[\-\]\\]
⑵不存在后向引用
⑶、匹配单个表达式与多个正则表达式
区间表达式{} 不需要前置反斜杠字符
a{5} 刚好重现五个a , b{5,10}重现五到十个b
? 匹配0个或一个前置正则表达式
ab?c -->ac 或者abc
+ 匹配一个或多个前置正则表达式
ab+c -->abc,abbc,abbbc...不匹配ab
⑷、交替运算符| :匹配与这个序列,或者其他序列,或者...
qqq|www|eee|rrr|ttt|...
|与^,$结合使用,实现分组
^abcd|efgh$ 匹配字符串起始处是否有abcd,或者结尾处是否有efgh
^(abcd|efgh)$ 找一个正是abcd或者正是efgh的字符串
⑸、ab^cd,ef$gh 在扩展正则表达式仍然适用,无法匹配到任何东西
ERE运算符优先级 由高到低
运算符
表示意义
[..] [= =] [::]
用于字符排序的方括号符号
\metacharacter
转义的meta字符
[]
方括号表达式
\(\) \digit
子表达式与后向引用
* \{ \}
前置单个字符重现的正则表达式
无符号 (no symbol)
连续
^ $
锚点(Anchors)
5).正则表达式的扩展
额外的GNU正则表达式运算符
运算符
含义
\w:
任何单词组成字符,相当于[[:alnum:]_]
\W:
任何非单词组成字符,相当于[^[:alnum:]_]
\<\>:
匹配单词的起始与结尾
\B:
匹配两个单词组成字符之间的空字符串
\b:
匹配单词的起始或结尾处所找的的空字符串,这是\<与\>运算符的结合
由于awk使用\b表示后退字符,所以GNU awk使用|y表示此功能
\' \`
分别匹配emacs缓冲区的开始与结尾。GNU程序与emacs通常视为与^$同义
6).程序与正则表达式
UNIX程序及其正则表达式类型
类型
grep
sed
ed
ex/vi
more
egrep
awk
lex
BRE
√
√
√
√
√
ERE
√
√
√
\< \>
√
√
√
√
√