grep介绍
1,grep全名(Global Regular Expression Print)。
也许刚接触这个命令的人会有一种这样的感觉,不就是查找东西的一个小命令吗,no,no,no,
grep是一个最初用于unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本,并把匹 配的行打印出来。
Unix的grep家族包 括grep、egrep和fgrep。其中egrep是grep的扩展,支持更多的re元字符,因此功能也更强大;fgrep全称是fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊,由于其功能及其简单,很少使用。
2,常用的选项以及表达式
grep [OPTIONS] PATTERN [FILE...]
-v, --> invert-match: 取反,显示不能被模式所匹配到的行;
-o,--> only-matching:仅显示被模式匹配到的字串,而非字串所在的行;
-i,--> ignore-case:忽略字符分大小写;
-E:支持扩展的正则表达式,相当于egrep;
-A #:显示被模式匹配到的行及其上#行;
-B #:显示被模式匹配到的行及其下#行;
-C #:显示被模式匹配到的行及其上下#行;
注意:#是数字的意思。
3,基本正则表达式的元字符:
a,字符匹配
.: 匹配任意单个字符
显示/etc/passwd中以s和d之间出现任意字符的
[root@localhost ~]# grep "s.d" /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[]: 匹配指定范围内的任意单个字符
显示/etc/fstab中有以b或B开头的行
[root@localhost ~]# grep "[cC]" /etc/fstab
# /etc/fstab
# Created by anaconda on Tue Jul 15 16:37:10 2014
# Accessible filesystems, by reference, are maintained under '/dev/disk'
proc /proc proc defaults 0 0
[a-z]等价于 [[:lower:]],表示小写字母;
[A-Z]等价于 [[:upper:]],表示大写字母;
[0-9]等价于 [[:digit:]],表示数字;
[[:alpha:]]表示大小写字母;
[[:alnum:]]表示大小写字母和数字;
[[:space:]]表示空格和tab
[[:punct:]]表示标点符号
[^]:匹配指定范围外的任意单个字符;
综合实例:显示/etc/fstab文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
[root@localhost ~]# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/fstab
# /etc/fstab
# Created by anaconda on Tue Jul 15 16:37:10 2014
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
b,次数匹配
*: 用来指定匹配其前面的字符任意次;
\?: 用来指定匹配其前面的字符0次或1次;
\{m\}: 用来指定匹配其前面的字符刚好m次;
\{m,n\}:用来指定匹配其前面的字符至少m次,至多n次;
\{m,\}: 用来指定匹配其前面的字符至少m次;
\{0,n\}:用来指定匹配其前面的字符至多n次;
注意:在次数匹配的时候需牢记贪婪模式; 贪婪模式:尽可能的长的去匹配字符;
例:显示/etc/passwd中s后面出现最少一次,最多2次的
[root@localhost ~]# grep "so\{1,2\}" /etc/passwd
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
c,位置锚定
^:锚定行首 比如:^root 开头为root的
$:锚定行尾 比如:root$ 结尾为root的
^$:空白行
例:统计/etc/rc.d/rc.sysinit中出现的空白行
[root@localhost ~]# grep "^$" /etc/rc.d/rc.sysinit |wc -l
96
\<:锚定词首,等价于\b
\>:锚定词尾,等价于\b
例:显示/etc/passwd中root的
[root@localhost ~]# grep "\<root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
d, 分组
\(\):标记匹配字符,如\(ab\)*xy;
e, 引用
\1:后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式所匹配到的内容;
\2:后向引用,引用前面的第二个左括号以及与之对应的右括号中的模式所匹配到的内容;
4,扩展正则表达式的使用
扩展表达式egrep相当于grep -E
a,元字符
字符匹配
.:任意单个字符,用‘ ’引起来
[ ]:指定范围内的任意单个字符
[0-9],[[:digit:]],[[:alnum:]]:匹配所有单个数字
[A-Z],[[:upper:]]:匹配所有单个大写字母
[a-z],[[:lower:]]:匹配所有单个小写字母
[[:alpha:]]:匹配所有单个字母
[[:space:]]:匹配单个空白字符
[[:punct:]]:匹配所有单个标点字符
b,次数匹配
*:匹配其前面任意字符任意次
?:匹配其前面的字符0次或者1次
+:匹配前面的字符至少1次
{m}:匹配前面的字符m次
{m,n}:匹配前面的字符,至少m次,最多n次
{m,}:匹配前面的字符,至少m次,不限最多
{0,m}:匹配前面的字符,最少0次,最多n次
c,位置锚定
^:锚定行首
$:锚定行尾
\<等价于\b:锚定词首
\>等价于\b:锚定词尾
d,分组
():分组
|:或者,只能选其一
练习:1, 取出默认shell为非bash的用户;
# grep -v "bash$" /etc/passwd | cut -d: -f1
2,取出默认shell为bash的且其ID号最大的用户;
# grep "bash$" /etc/passwd | sort -n -t: -k3 | tail -1 | cut -d: -f1
3,使用echo命令输出一个路径,而后使用grep取出其基名;
# echo "/etc/sysconfig/" | grep -o -E "[^/]+/?$" | cut -d/ -f1