现在的位置: 首页 > Linux > Linux基础 > 正文
shell编程三剑客之grep:grep基本正则表达式
2013年07月05日 Linux基础 ⁄ 共 3359字 shell编程三剑客之grep:grep基本正则表达式已关闭评论 ⁄ 被围观 13,701 views+
grep是Linux使用中最常用的命令之一,其作用为根据模式(Pattern)搜索文本,并将符合模式的文本行显示出来。支持的模式为文本字符和正则表达式的元字符组合而成匹配条件。

1、grep的基本用法:

通过man命令,我们可以查看到grep的基本用法如下:
[barlowliu@update ~]$ man grep
GREP(1)                                                                GREP(1)
NAME
       grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
其中[options]最常用的有如下几个:
-i:不区分大小写搜索
--color:关键字突出颜色显示
-v: 显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串

2、grep正则表达式的元字符:

为了提高文章的阅读性,我约定:

A、所有基本元字符都不包含冒号

B、红色字体表示被匹配的内容

2.1 基本元字符:

.: 点号,匹配任意单个字符
如grep "r..t" /etc/passwd ,表示匹配r和t中间有两个任意字符的内容。
 [barlowliu@update ~]$ grep "r..t" /etc/passwd
 root:x:0:0:root:/root:/bin/bash
 operator:x:11:0:operator:/root:/sbin/nologin
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[]: 匹配指定范围内的任意单个字符
如grep "[0-9]" /etc/inittab ,表示匹配0到9中任意一个数字
[barlowliu@update ~]$ grep "[0-9]" /etc/inittab
# upstart works, see init(5), init(8), and initctl(8).
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
id:3:initdefault:
[^]:匹配指定范围外的任意单个字符
如grep "[^0-9]" file ,表示出了数字,都匹配

[barlowliu@update ~]$ grep "[^0-9]" /etc/resolv.conf
# Generated by NetworkManager
search cking.inc
nameserver 192.168.18.210
nameserver 8.8.8.8

2.2 次数匹配

注意:grep默认工作在贪婪模式下,即尽可能长的匹配
*:匹配其前面的字符任意次
.*:.和*组合使用,表示匹配任意字符任意长度(包含0次)。
使用示例:
如有文本test1包含内容如下:
a
b
ab
ac
aab
acb
adb
ammsb
使用grep "a*b" test1 ,匹配情况如下:
[barlowliu@update ~]$ grep "a*b" test1
b
ab
aab
acb
adb
ammsb
使用 grep "a.*b" test1,匹配情况如下:
[barlowliu@update ~]$ grep "a.*b" test.txt
ab
aab
acb
adb
ammsb
其实就是a开头,b结尾的都被匹配上了。
\?: 匹配其前面的字符1次或0次
使用grep "a\?b" test1 ,匹配情况如下:
[barlowliu@update ~]$ grep "a\?b" test1
b
ab
aab
acb
adb
ammsb
注意跟 grep "a*b" test1的区别!!
\{m,n\}:匹配其前面的字符至少m次,至多n次
如:\{2,\}  表示匹配至少2次
[barlowliu@update ~]$ grep "a\{2,\}" test1
aab
如:\{0,3\} 匹配0至三次

 2.3 字符集合:

[:digit:] 所有数字          [0-9]
[:lower:] 所有小写字母  [a-z]
[:upper:] 所有大写字母 [A-Z]
[:punct:] 所有标点符号
[:space:] 表示空格或tab键
[:alpha:] 表示所有字母(包含大小写) [a-zA-Z]
[:alnum:] 表示所有字母和数字   [0-9a-zA-Z]
如匹配/etc/resolv.conf中的所有数字:
[barlowliu@update ~]$ grep "[[:digit:]]" /etc/resolv.conf
nameserver 192.168.18.210
nameserver 8.8.8.8
需要注意的是,这里需要用额外的[]将字符合集括起来。

2.4 位置锚定:

^: 锚定行首,此字符后面的任意内容必须出现在行首
如查找/etc/passwd文件中以root开头的行:
[barlowliu@update ~]$ grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
如查找/etc/passwd中以bash结尾的行:
[barlowliu@update ~]$ grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
barlow:x:500:500:Barlow,110,119,110:/home/barlow:/bin/bash
nagios:x:501:501::/home/nagios:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
^$: 空白行
如统计/etc/php.ini文件中有多少空白行:
[barlowliu@update ~]$ grep "^$" /etc/php.ini |wc -l
287
\<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现
\<条件\>或\b条件\b:查找某个独立的单词
如查找/etc/passwd文件中以r开头,t结尾,中间包含两个任意字符的单词
[barlowliu@update ~]$ grep "\<r..t\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
注意与grep "r..t" /etc/passwd结果的区别:
[barlowliu@update ~]$ grep "r..t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

2.5 grep的分组:

\(\)
\(ab\):表示ab整体作为匹配字符
\(ab\)* : 表示ab整体作为匹配字符,且匹配任意次
\(ab\)\{1,\}:表示ab整体作为匹配字符,且匹配至少一次
分组还可以后向引用
\1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
\2: 引用第一个左括号以及与之对应的右括号所包括的所有内容
\3: 引用第一个左括号以及与之对应的右括号所包括的所有内容
如test2有文本内容如下:
He love his lover.
She like her liker.
He like his lover.
grep "\(l..e\).*\1r" test2 表示匹配结果如下:
[barlowliu@update ~]$ grep "\(l..e\).*\1r" test2
He love his lover.
She like her liker.
即引用的为前面匹配内容加上r,因此He like his lover这一行就不会被匹配。

抱歉!评论已关闭.

×