一.匹配字符
. 匹配任意单个字符
[ ] 匹配指定范围内的任意字符
[^] 匹配飞指定范围内的任意字符
[:alpha:] 字母字符
[:lower:] 小写字母字符
[:upper:] 大写字母字符
[:digit:] 数字
[:alnum:] 字母数字字符
[:space:] 空白字符(禁止打印),如回车符、换行符、竖直制表符和换页符
[:punct:] 标点字符
[:cntrl:] 控制字符(禁止打印)
[:print:] 可打印字符
使用时一般使用两个中括号,具体会在下面的例子中使用。
二.匹配次数
* 匹配前面的字符任一次
.* 匹配任意长度的任意字符(注意贪婪模式,比如 grep “r.*t” /etc/passwd )
x\{m,n\} 指定前面的字符至少出现m次,至多出现N次。
x\{m,\} 指定前面的字符至少出现m次
x\{0,n\} 指定前面的字符至多出现N次
x\{m\} 精确匹配m次
? 匹配其前面的字符0或1次
三.锚定符
1.^ 锚定行首 grep "^r..t" /etc/passwd
2.$ 锚定行尾 grep "h$" /etc/passwd
3.^$ 锚定空白行 grep "^$" /etc/passwd
4.\< (\b) 锚定词首 grep "\<r..t" /etc/passwd
5.\> (\b) 锚定词首 grep "r..t\>" /etc/passwd
示例(容易混淆):
至少包含一个空白字符 grep "[[:space:]]\{1,\}" /etc/passwd
至少包含一个非空白字符 grep "[^[:space:]]\{1,\}" /etc/passwd
没有一个空白字符 grep -v "[^[:space:]]\{1,\}" /etc/passwd
6.\(\)对字符分组 grep "\(l..e\).*\1r"
示例:
grep --color "l\([13]\):\1:.*:\1" /etc/inittab
四.选项
-v 对结果取反
-i 忽略字母大小写
-o 仅显示匹配到的字符串(行的其他内容不显示)
-E 支持扩展的正则表达式
-A n 显示匹配到的行下面n行
-B n 显示匹配到的行上面n行
-C n 显示匹配到的行上下面各显示n行
练习:
1.查找系统中user1用户的相关信息。(提前建好user11,myuser1)(易错)
grep "user1" /etc/passwd 所有包含user1的行
grep "\<user1\>" /etc/passwd 表面可以,但是添加以下用户,就不可以了
useradd -c "user1‘s uncle" /etc/passwd -c 是注释
grep "^\<user1\>" /etc/passwd 成功匹配
2.查找系统中以user开头后面跟了数字的用户的相关信息。
grep "^user[0-9]\{1,\}\>" /etc/passwd
3.分析/etc/inittab 文件如下两行文本的特征,编写可以精确查到的类似两行的模式,
要求每行的数字必须相同。
l1:1:wait:/etc/rc.d/rc 1
l3:3:wait:/etc/rc.d/rc 3
grep "l\([13]\):\1:.*:.* \1" inittab
扩展:匹配所有上述特征:grep "l\([0-9]\):\1:.*:.* \1" inittab
如果超过10,需要添加最小匹配:grep "l\([0-9]\{1,\}\):\1:.*:.* \1" inittab
4.显示/proc/meminfo文件中以不区分大小写的s开头的行
grep "^[sS]" /proc/meminfo
5.显示/etc/passwd中以nologin结尾的行
grep "nologin$" /etc/passwd
6.显示/etc/inittab中以#开头,且后面跟一个或者多个空白字符,而后又跟了任意非空白字符的行
grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab
7.显示/etc/inittab中包含了两个冒号中间一个数字的行
grep ":[0-9]:" /etc/inittab
8.显示/boot/grub/grub.conf 文件中以一个或者多个空白字符的行
grep ":[0-9]:" /etc/inittab
9.显示/etc/inittab文件中以一个数字开头并以一个开头数字相同的数字结尾的行。
grep "^\([0-9]\).*\1$" /etc/inittab
10.显示/etc/inittab文件中非空白的行
grep -v "^$" /etc/inittab
11.取出当前网络接口的相关IP地址(不包含127.0.0.1)
ifconfig |grep "inet addr" |grep -v "127.0.0.1"| cut -d: -f2|cut -d" " -f1
ifconfig |grep -A 1 "eth" |grep -o "addr:[0-9.]\{1,\}"|cut -d: -f2
五.扩展正则表达式
与正则表达式不同之处:
\(\)替换为 ()
\{\}替换为 {}
+ 次数匹配,匹配其前的额字符一次或者多次
| 或者
示例:
匹配ifconfig结果中出现数字为1-255之间的整数
ifconfig|grep --color -E "\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-5][0-5])\>"