一、grep(文本搜索工具):根据用户指定的模式,对目标文件进行过滤,显示被模式匹配到的行。
使用格式:grep [选项] ‘模式’ 文件名
-o 仅显示匹配到的内容,不会把正行输出
-v 反向选取,把没有匹配到的行显示出来
--color 高亮显示匹配到的内容
-i 忽略字符大小写
-E 使用扩展正则表达式
-A # 匹配模式及其下面#行
-B # 匹配模式及其上面#行
-C # 匹配模式及其上面#行和下面#行
模式(正则表达式):由一类字符书写的模式,其中有一些字符不表示字符字面的意义,而是表示通配功能。
1、基本正则表达式 元字符:
. 匹配任意单个字符
[] 匹配指定集合内的任意单个字符
[0-9] [[:digit:]] 数字集合
[a-z] [[:lower:]] 小写字母集合
[A-Z] [[:upper:]] 大写字母集合
[a-zA-Z] [[:alpha:]] 大小写字母
[0-9a-zA-Z] [[:alnum:]] 数字和大小写字面集合
[[:space:]] 空白字符集合
[^] 匹配的是集合外的任意单个字符 例如[^[:lower:]]指的是除小写字母外的任意单个字符
2、匹配次数:用于对其前面紧邻的字符所能出现的次数作出限定。
* 匹配其前面的字符任意次
grep ‘x*y’
xy xxy xxxy y
\? 匹配其前面字符0此或一次
grep 'x\?y'
xy xxy y xxxxy aby
\+ 匹配其前面字符至少出现一次
\{m\} 匹配其前面字符m次
grep 'x\{2\}y'
xy xxy y aaxxy aby xxxy
\{m,n\}:匹配其前面的字符至少出现m次,至多出现n次
x\{3,5\}
3、位置锚定
^:行首锚定,写在模式的最左侧
例:显示/etc/fstab文件中以#开头的行
$:行尾锚定,写在模式的最右侧
例:显示/etc/fstab文件中以0结尾的行
^$: 空白行(连空格都没有)
例:显示/etc/fstab文件中的空白行
\< 词首锚定
例:\<open 以open开头的单词
\> 词尾锚定
\<单词\> 单词锚定
例:匹配/tmp/sort文件中的两位数
4、分组:\(\)
后向引用:反向引用,指把匹配出来的组引用到表达式本身其它地方 \(\) \1 \2
选择字符:\|
练习1、显示/proc/meminfo文件中以大写或小写S开头的行;
练习2、显示/etc/passwd文件中其默认shell为/sbin/nologin的用户;
练习3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
进一步:仅显示上述结果中其ID号最大的用户;
练习4、找出/etc/passwd文件中的一位数或两位数;
练习5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
练习6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
练习7、找出netstat -tan命令执行结果中以'LISTEN'(后可有空白字符)结尾的行;
练习8、添加用户bash, testbash, basher, nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认shell相同的用户;
练习9、扩展题:新建一个文本文件,假设有如下内容:
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最后一个单词是由此前某单词加r构成的行。
二、扩展正则表达式
egrep [选项] ‘模式’ 文件名
1、元字符
. 匹配任意单个字符
[] 匹配指定集合内的任意单个字符
[0-9] [[:digit:]] 数字集合
[a-z] [[:lower:]] 小写字母集合
[A-Z] [[:upper:]] 大写字母集合
[a-zA-Z] [[:alpha:]] 大小写字母
[0-9a-zA-Z] [[:alnum:]] 数字和大小写字面集合
[[:space:]] 空白字符集合
[^] 匹配的是集合外的任意单个字符
2、匹配次数:用于对其前面紧邻的字符所能出现的次数作出限定
* 匹配其前面的字符任意次
? 匹配其前面字符0此或一次
+ 匹配其前面字符至少出现一次
{m} 匹配其前面字符m此
{m,n}:匹配其前面的字符至少出现m次,至多出现n次
3、位置锚定
^:行首锚定,写在模式的最左侧
$:行尾锚定,写在模式的最右侧
^$ 空白行
\< 词首锚定
\> 词尾锚定
\<单词\>单词锚定
4、 分组
()
'([0-9]) ([a-z]) \1 \2'
| 选择字符
练习10:显示当前系统上root、centos或user1用户的默认shell及用户名;练习11:找出/etc/rc.d/init.d/functions文件中某单词后面跟一对小括号"()"的行;
练习12:使用echo输出一个路径,而使用egrep取出其基名;
练习13:找出ifconfig命令结果中的1-255之间的数值
练习14:找出ifconfig命令结果中的IP地址;(ip范围 1.0.0.1 - 223.255.255.254)
ifconfig|grep --color '\<\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-2][0-3]\)\.\([0-9]\|[1-9][0-9]\|\|1[0-9][0-9]\|2[0-5][0-5]\)\.\([0-9]\|[1-9][0-9]\|\|1[0-9][0-9]\|2[0-5][0-5]\)\.\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-5][0-4]\)\>'