本节学习的命令:grep
本节学习的技能:
grep对文本的匹配
正则表达式的使用
知识点十:grep及正则表达式(4_4)
grep,egrep,fgrep:
grep: 根据模式搜索文本,并将符合模式的文本行显示出来。
Pattern(模式): 文本字符和正则表达式的元字符组合而成匹配条件
语法定义:
grep [options] PATTERN [FILE...] -i:表示忽略大小写 --color:把匹配到的值显示颜色 -v: 显示没有被模式匹配到的行 -o:只显示被模式匹配到的字符串
文件名通配, globbing(回顾) *: 任意长度的任意字符 ?:任意单个字符 []:匹配指定范围内的任意单个字符
[^]: 匹配指定范围之外的任意单个字符
1 grep 'root' /etc/passwd --只显示/etc/passwd文件中符合查找‘root’的行 2 3 grep --color 'root' /etc/passwd 4 5 alias grep='grep --color' 6 grep 'root' /etc/passwd 7 8 grep -v 'root' /etc/passwd 9 grep -o 'root' /etc/passwd
正则表达式(REGular EXPression, REGEXP):
元字符:
. : 匹配任意单个字符
[] :匹配指定范围内的任意单个字符
[^] :匹配指定范围外的任意单个字符
字符集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:]
匹配次数(贪婪模式):
* : 匹配其前面的字符任意次
数据:a, b, ab, aab, acb, adb, amnb
匹配结果:a*b:b,ab,aab,acb,adb,amnb
a?b:b,ab,aab,acb,adb,amnb
a.*b:ab,aab,acb,adb,amnb
.* : 任意长度的任意字符
? : 匹配其前面的字符1次或0次
{m,n} :匹配其前面的字符至少m次,至多n次
{1,}:匹配前面的字符至少1次
{0,3}:匹配前面的字符1到3次
位置锚定:
^ : 锚定行首,此字符后面的任意内容必须出现在行首
$ : 锚定行尾,此字符前面的任意内容必须出现在行尾
^$ : 空白行
<或 : 锚定词首,其后面的任意字符必须作为单词首部出现
>或 : 锚定词尾,其前面的任意字符必须作为单词的尾部出现
分组:
()
后向引用
1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
2:
3:
1 --正则表达式 2 grep 'r..t' /etc/passwd 3 4 vi a.txt 5 数据 6 a 7 b 8 ab 9 aab 10 acb 11 adb 12 amnb 13 14 grep 'a*b' a.txt 15 grep 'a.*b' a.txt 16 grep 'a?b' a.txt 17 18 grep 'a{1,3}b' a.txt 19 20 grep '^r..t' /etc/passwd 21 grep 'w$' /etc/inittab 22 grep 'b..h$' /etc/passwd 23 grep '^$' /etc/inittab 24 25 grep '[[:digit:]]$' /etc/inittab 26 grep '[[:space:]][[:digit:]]$' /etc/inittab 27 28 vi test2.txt 29 数据: 30 This is root. 31 The user is mroot. 32 rooter is a dog's name. 33 chroot is a command. 34 mrooter is not a word. 35 36 grep 'root>' test2.txt 37 grep '<root' test2.txt 38 grep '<root>' test2.txt 39 40 grep '(ab)*' a.txt 41 42 vi test3.txt 43 数据: 44 He love his lover. 45 She like her liker. 46 He like his lover. 47 48 grep 'l..e' test3.txt 49 grep 'l..e.*l..e' test3.txt 50 grep '(l..e).*1' test3.txt 51 52 grep '([0-9]).*1$' /etc/inittab
课后作业:
1 练习: 2 1、显示/proc/meminfo文件中以不区分大小的s开头的行; 3 grep -i '^s' /proc/meminfo 4 grep '^[sS]' /proc/meminfo 5 2、显示/etc/passwd中以nologin结尾的行; 6 grep 'nologin$' /etc/passwd 7 8 取出默认shell为/sbin/nologin的用户列表 9 grep "nologin$' /etc/passwd | cut -d: -f1 10 11 取出默认shell为bash,且其用户ID号最小的用户的用户名 12 grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1 13 14 3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行; 15 grep "^#[[:space:]]{1,}[^[:space:]]" /etc/inittab 16 17 4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行; 18 grep ':[0-9]:' /etc/inittab 19 20 5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行; 21 grep '^[[:space:]]{1,}' /boot/grub/grub.conf 22 23 6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行; 24 grep '^([0-9]).*1$' /etc/inittab 25 26 练习: 27 1、找出某文件中的,1位数,或2位数; 28 grep '[0-9]{1,2}' /proc/cpuinfo 29 grep --color '<[0-9]{1,2}>' /proc/cpuinfo 30 31 2、找出ifconfig命令结果中的1-255之间的整数; 32 33 34 3、查找当前系统上名字为student(必须出现在行首)的用户的帐号的相关信息, 文件为/etc/passwd 35 grep '^student>' /etc/passwd | cut -d: -f3 36 id -u student 37 38 student1 39 student2 40 41 练习:分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现在数字必须相同),请写出可以精确找到类似两行的模式: 42 l1:1:wait:/etc/rc.d/rc 1 43 l3:3:wait:/etc/rc.d/rc 3 44 45 grep '^l([0-9]):1.*1$' /etc/inittab