grep 全称为:Global search Regular Exmpression and Printing


grep:是使用正则表达式来描述选择条件的,正则表达式就是一类字符所书写的模式(pattern),使用‘元字符’:来进行实现查询功能。


用法为:grep [options] 'pattern'  file

               选项     模式      文件

基本正则表达式:常用的元字符用法如下:

^: 锚定行首的符合条件的内容,用法格式“^pattern”

例:显示/etc/passwd 下文件行首以 root 开头的内容。

   [root@localhost ~]# grep "^root"  /etc/passwd


$: 锚定行尾的符合条件的内容,用法格式 “pattern$”

例:显示/etc/passwd 下文件行尾以 sh 结束的内容。      

[root@localhost ~]# grep "sh$" /etc/passwd


.: 匹配任意单个字符

例:显示/etc/passwd 下匹配 sh 前面的任意单个字符。

   [root@localhost ~]# grep ".sh$" /etc/passwd


*: 匹配紧挨在其前面的字符任意次

例:查询/etc/passwd 文件下所有字符中出现h的地方。

   [root@localhost ~]# grep "h*"  /etc/passwd


.*: 这两个元字符一般一起使用,表示匹配任意长度的任意字符

例:查看以r开头和以h结尾的中间任意字符

   [root@localhost ~]# grep "r.*h$" /etc/passwd


[]: 匹配指定范围内的任意单个字符

例:显示/etc/passwd 下以任意单个字符出现的内容

   [root@localhost ~]# grep "[1]"  /etc/passwd


[^]:匹配指定范围外的任意单个字符

例: 不显示/etc/passwd 下所有内容的任意单个字符

   [root@localhost ~]# grep "[^0-9]" /etc/passwd


\?:匹配紧挨在其前面的字符0次或1次。

例:显示/etc/passwd 下的o字符 0次或一次

   [root@localhost ~]# grep "o\?o"  /etc/passwd


\{m,n}:匹配其前面的字符至少m次,至多n次

例:显示/etc/passwd 下t前面的0至少1次至多1

[root@localhost ~]# grep "o\{1,1\}t"  /etc/passwd


\{m,\}:至少m次 至多不限

例:显示/etc/passwd 下t前面的0至少1次至多不限

[root@localhost ~]# grep "o\{1,\}t"  /etc/passwd


\<: 锚定词首,用法格式:\<pattern

例:显示/etc/passwd下以r开头中间任意两个字符以t结尾并且锚定词首

   [root@localhost ~]# grep "\<r..t" /etc/passwd  


\>: 锚定词尾,用法格式:pattern\>

例:显示/etc/passwd下以r开头中间任意两个字符以t结尾并且锚定词尾

[root@localhost ~]# grep "r..t\>" /etc/passwd


\(\): 分组,用法格式: \(pattern\)

例:查询/etc/passwd以bash为分组的内容

  [root@localhost ~]# grep   "\(bash\)"   /etc/passwd


这里介绍一些命令组合使用的几个试例:

1.显示/etc/rc.d/rc.sysinit中符合形为“任意单个字符n任意字符任意单个字符n”模式的行;即任意单个字符后面跟了个n,n后面有任意长度的任意字符,而后是任意单个字符后面跟了个n;并以n结尾的内容。

[root@localhost ~]# grep ".n.*.n$" /etc/rc.d/rc.sysinit    --color=auto


2 显示/etc/rc.sysinit中以f开头的中间匹配了指定任意范围内的单个字符后跟了任意字符以n结尾的并锚定了词首和词尾的的内容

[root@localhost ~]# grep "\<f[o].*n\>" /etc/rc.d/rc.sysinit  --color=auto


grep[options]常用选项有以下几种有:

--color=auto 表示查询出来的内容用颜色标记出来

用法:[root@localhost ~]# grep   "root"   /etc/passwd  --color=auto


-v: 反向选取,只显示不符合模式的行;

用法:[root@localhost ~]# grep -v  "root"   /etc/passwd  --color=auto


-o: 只显示被模式匹配到的字串,而不是整个行;

[root@localhost ~]# grep -o  "root"   /etc/passwd  --color=auto


-i: 不区分字符大小写;

[root@localhost ~]# grep -i  "root"   /etc/passwd  --color=auto


-A #:显示匹配到的行时,顺带显示其后面的#个行;

-B #:前面的#行;

-C #:前后的#行;

-E: 使用扩展的正则表达式


-A,-B,-C,-E 方法同上使用  


扩展正则表达式用egrep表示或者grep -E 表示:

扩展正则表达式元字符正则表达式元字符基本通用只有下面这个不通用

a|b: 意思就是二选一的意思

例:显示/etc/passwd下字符包含a和b的内容

[root@localhost ~]# egrep "a|b"  /etc/passwd


():分组:不用再加\斜杠

例:显示/etc/passwd下字符包含ab的词组

[root@localhost ~]# egrep "(ab)"  /etc/passwd


组合的一些用法:

例如:[:lower:]的用法 如下:

[root@localhost ~]# grep "[[:lower:]]"  /etc/passwd 其他一下的用法是一致的。

[:lower:] 表示所有的小写字母

[:upper:] 表示所有的大写字母

[:digit:] 表示所有的数字

[:alpha:] 表示所有的大小写字母

[:alnum:] 表示所有的大小写字母和数字

[:space:] 表示所有的空白字符

[:punct:] 表示所有的标点符号


下面介绍几个综合使用的例子:

1 找出ifconfig命令结果中的1-255之间的整数;

[root@localhost ~]# ifconfig | grep --color=auto -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"


2 取出默认shell为bash,且其用户ID号最小的用户的用户名

[root@localhost ~]# grep "/bin/bash$" /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1