1.什么是grep
grep的全称为(Global search Regular Expression and Printing,全面搜索正则表达式并把行打印出来),grep是linux系统中一种强大的文本搜索工具,它只能使用基本的正则表达式来搜索文本,并把匹配的行打印出来。
2.语法与常用选项
语法:# grep [选项-option] ‘pattern’ FILE
选项:--color=auto 高亮匹配字符
-v 反向选取,只显示不符合模式的行
-o 只显示被 模式匹配到的字符,而不是整个行
-A # 显示匹配到的行时,顺带显示其后面的#行
-B # 显示匹配到的行时,顺带显示其前面的#行
-C # 显示匹配到的行时,顺带显示其前后的#行
-i 不区分字符大小写
-E 使用扩展的正则表达式,grep -E=egrep
3.基本正则表达式元字符及实例
关于元字符的具体信息可以man 7 regex 查看
为了方便编辑博文,此处根据元字符功能自行做了如下分类
(1)字符匹配类
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
(2)次数匹配类
*:匹配紧挨在其前面的字符任意次
.*:匹配任意长度的任意字符
\?:匹配紧挨在其前面的字符0次或1次
\{m,n\}:匹配其前面的字符至少m次,至多n次
(3)字符锚定类
^: ^pattern,锚定行首
$: pattern$,锚定行尾
^$:表示空白行
\<:锚定词首
\>:锚定词尾
\<pattern\>:锚定单词
(4)其他类
\(pattern\):表示分组
3.1
^: ^pattern,锚定行首,例如
# grep --color=auto '^root' /etc/passwd /*匹配以root为行首的行,选项--color=auto意为高亮匹配字符*/
# grep -o --color=auto '^root' /etc/passwd /*上述命令-o选项,至显示字符,不显示整行*/
3.2
$: pattern$,锚定行尾
# grep --color=auto 'sh$' /etc/passwd /*匹配以sh为行尾的行*/
# grep -v 'sh$' /etc/passwd /*选项-v,匹配未以sh为行尾的行*/
3.3
^$:表示空白行
# grep '^$' /etc/rc.d/rc.sysinit | wc �Cl /*匹配文件内容中的空白行,通过管道显示空白行行数*/
3.4
.:匹配任意单个字符
# grep 'r..t' /etc/passwd /*匹配文件中包含r开头后接2个任意单个字符和t的行*/
3.5
*:匹配紧挨在其前面的字符任意次
# grep --color=auto 'a*b' /test/grep.txt /*匹配符合b前出现任意次a的行*/
3.6
.*:匹配任意长度的任意字符
# grep --color=auto 'r.*h' /etc/passwd /*在文件中匹配每行以r开头,以h结尾的内容*/
3.7
[]:匹配指定范围内的任意单个字符
# grep "r[0-9].*h" /etc/passwd /*匹配文件passwd中符合r开头,中间为任意长度任意字符,并以h结尾的行*/
3.8
[^]:匹配指定范围外的任意单个字符
# grep "r[^[:digit:]]" /etc/passwd /*匹配以r开头后接一个除数字外的任意单个字符的行*/
3.9
\?:匹配紧挨在其前面的字符0次或1次
首先在/test下新建文件grep.txt,内容如下
# grep "a\?b" /test/grep.txt /*匹配文件内容中符合b前出现0至1次a的行*/
# grep "^a\?b$" /test/grep.txt /*匹配文件中符合b前出现0至1次a,且行首为a,行尾为b的行*/
3.10
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{0,n\}:至多n次
\{m,\}:至少m次
\{m\}:精确匹配m次
# grep --color=auto "a\{1,2\}b" grep.txt /*匹配文件中字符b前出现至少1次至多2次a的行*/
3.11
\<:锚定词首,同\b
# grep --color=auto "\<[bB].\{2,5\}[tT]" /etc/rc.d/rc.sysinit /*匹配文件中词首为b或者B,接2-5个任意字符,接t或者T的行*/
从以上信息看出,匹配的内容中词首一定的是b或B,没有其他字母在b前
3.12
\>:锚定词尾,同\b
# grep --color=auto "[bB].\{2,5\}[tT]\>" /etc/rc.d/rc.sysinit /*匹配文件中词首为b或者B,接2-5个任意字符,接t或者T的行*/
从以上信息看出,匹配的内容中词尾一定的是t或T,没有其他字母在t后
3.13
\<pattern\>:锚定单词,同\bpattern\b
# grep --color=auto "\<[bB].\{2,5\}[tT]\>" /etc/rc.d/rc.sysinit /*匹配文件中词首为b或者B,接2-5个任意字符,以t或者T为词尾的行*/
3.14
\(pattern\):表示分组
# grep --color=auto "\(ab\)\{1,3\}" grep.txt /*匹配文件中ab至少1次至多三次*/
还有一种用法为引用分组
\(pattern\).*\1 数字1此时表示引用前面的分组内容pattern
以下两个正则表达式并不相同
编辑文件grep内容,如下
# grep --color=auto "a.b.*a.b" grep.txt /*后面的a.b不一定与前面的相同*/ # grep --color=auto "\(a.b\).*\1" grep.txt /*因为引用前面的分组内容,所以一定相同*/
4.egrep扩展正则表达式元字符及实例
4.1 什么是egrep
egrep是扩展正则表达式命令,等同于grep -E,利用此命令可以使用扩展的正则表达式对文本进行搜索,并把符合用户需求的字符串打印出来。
4.2 语法格式
语法:# egrep [选项-option] ‘pattern’ FILE
4.3元字符
为了方便编辑博文,此处根据元字符功能自行做了如下分类
(1)字符匹配类
.: 任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
(2)次数匹配类
*:匹配紧挨在其前面的字符任意次
+: 匹配其前面的字符至少1次
?: 匹配紧挨在其前面的字符0次或1次 (基本正则表达式中为\?)
{m,n}: 至少m次,至多n次(基本正则表达式中为\{m,n\})
(3)字符锚定类
\<:锚定词首
\>:锚定词尾
^ :锚定行首
$ :锚定行尾
(4)其他类
a|b: 表示a或者b,二选一;
():分组,支持引用\1, \2;
4.4 实例
字符匹配类、字符锚定类、次数匹配类的用法和与基本正则表达式的用法相同,不再重复阐述,以下列出有变化及其他元字符用法实例。
(1) 分组:()与或者:|,基本正则表达式中分组为\(pattern\)
要求匹配文件内容以大写S或小写s开头的行
# egrep "^(s|S)" /proc/meminfo /*正确的写法,此时需要做分组处理*/
# egrep "^s|S" /proc/meminfo /*错误的写法,表示匹配文件内容中以小写s开头或包含大写S的行*/
另有 要求匹配文件中cat 和 Cat
正确写法 egrep “(c|C)at” test.txt
错误写法 egrep “c|Cat” test.txt 意为匹配c或Cat
(2) 匹配字符前面的字符至少1次:+
# egrep --color=auto "a+b" /test/grep.txt /*匹配文件中b前至少出现1次a的行*/
5.fgrep
fgrep命令等同于grep -F,它利用固定的字符串来对文本进行搜索,但不支持正则表达式的引用,所以此命令的执行速度也最快。
语法:fgrep [选项-option] pattern FILE
6.补充一点
模式中使用了变量,并需要正确使用变量内容就需要使用双引号
# UserName=root /*定义变量*/ # grep "^$UserName" /etc/passwd /*需用双引号,表示引用变量的值root,使用单引号则bash认为此处使用字符本身*/
错误写法 # grep '^$UserName' /etc/passwd
关于grep的学习,先记录到这里,在以后的学习工作中有新知识再补充。