一、grep命令选项
--color=auto:对匹配到的文本着色显示
-v:显示不被pattern匹配到的行
-i:忽略字符大小写
-n:显示匹配的行号
-c:统计匹配的行号,不关心具体是哪些行
-o:仅显示匹配到的字符串,有几个字符串就显示几遍
-q:静默模式,不输出任何信息,可以搭配echo $?使用显示是否匹配到
-A #:after,包含这个字符串的后#行
-B #:before,包含这个字符串的前#行
-C #:context,包含这个字符串的前后各#行
-e:实现多个选项间的逻辑or关系 grep -e ‘cat’ -e ‘dog’ file
-w:匹配整个单词
-E:使用ERE
-F:相当于fgrep,不支持正则表达式
-n:在每一行的最前面列出行号
二、grep中正则表达式的应用
需要注意的是,在基本正则表达式中,一些通配符已经失去了原本的含义,而若恢复他们原本的含义,需要在其前边加上反斜杠\,如:\* \+ \{ \} \| \( \)等。
1、分组:\(\)将一个或多个字符捆绑在一起,当做一个整体进行处理,如:\(root\)\+
2、分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3,...
3、\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例:\(string1\+\(string2\)*\)
\1 : string1\+\(string2\)*
\2: string2
4、后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
5、或者:\|
示例:a\|b:a或b c\|cat:c或者cat \(C|c\)at:Cat或cat
位置锚定:定位出现的位置
^行首锚定:用于模式的最左侧
$行尾锚定:用于模式的最右侧
^pattern$:用于模式匹配整行
^$:空行
^[[:space:]]*$:空白行
\<或\b词首锚定,用于单词模式的左侧
\>或\b词尾锚定,用于单词模式的右侧
\<pattern\>:匹配整个单词
grep命令支持的正则表达式通配符:
c*:将匹配0个或多个字符c(c为任意一个字符)
.:将匹配任何一个字符,且只能是一个字符
[xyz]:匹配方括号中的任意一个字符
[^xyz]:匹配除了方括号中字符外的所有字符
^:锁定行的开头
$:锁定行的结尾
三、egrep及扩展的正则表达式
egrep=grep -E:用来扩展选项为正则表达式
使用了这条命令就可以使用|来分割多个pattern
egrep 选项 pattern
扩展匹配:
*:匹配前面字符任意次
?:0次或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m次,至多n次
例子:找出/etc/passwd中的两位或三位数
[root@localhost ~]# grep -woE "[0-9]{2,3}" /etc/passwd
12
11
12
100
14
50
99
99
192
192
81
81
999
998
998
995
997
994
996
993
32
32
例:显示三个用户root、mysql、nginx的UID和默认shell
[root@localhost ~]# grep -E "^(root|mysql|nginx)" /etc/passwd | awk -F ":" '{print ,,}'
root 0 /bin/bash
nginx 1001 /bin/bash
mysql 1002 /bin/bash
[root@localhost ~]# grep -E "^(root|mysql|nginx)" /etc/passwd | cut -d: -f1,3,7
root:0:/bin/bash
nginx:1001:/bin/bash
mysql:1002:/bin/bash
例:使用egrep取出/etc/rc.d/rc.loacl的基名
[root@localhost ~]# echo /etc/rc.d/rc.local | grep -oE "[^/]*/?$"
rc.local
例:使用egrep取出/etc/rc.d/rc.loacl的目录名
[root@localhost ~]# echo /etc/rc.d/rc.local | grep -oE "^/.*/"
/etc/rc.d/