grep是一个行编辑器,它的默认动作是搜索与给定模式匹配的行显示到屏幕上来。它的变种程序包括egrep和fgrep。
正则表达式是用户定义的、Linux工具用来过滤文本的模式模板。正则表达式利用元字符来表示数据流中的一个或多个字符。
正则表达式(Regual Expression,REGEXP)包括BRE和ERE两种,BRE就是基本正则表达式,而ERE是扩展正则表达式。
grep使用的元字符是BRE,egrep使用的元字符是ERE,而fgrep不使用元字符。而这三个命令可以使用不同的选项进行互通。接下来,我们来看看grep的用法。
一、grep
1. 格式
grep [options] PATTERN [FILE...]
2. 选项
-o:只显示匹配的行中与PATTERN相匹配的部分。
-i: 忽略PATTERN和输入文件中大小写的区别
-v:反选,只显示没有被PATTERN匹配到的行
-q:静默模式,找到匹配的内容,则命令的执行状态返回值为0,否则为非0。
-A NUM:打印紧随匹配的行之后的下文NUM行。
-B NUM: 打印紧随匹配的行之前的上文NUM行。
-C NUM: 打印匹配出来的行的上下文各NUM行。
二、基本正则表达式
类型 | 元字符 | 解释 |
字符匹配 | . | 匹配任意单个字符 |
[] | 匹配指定范围内的任意单个字符 | |
[^] | 匹配指定范围外的单个字符 | |
匹配次数 | * | 匹配其前的字符任意次,0次,1次或者多次 |
.* | 匹配任意长度的任意字符 | |
\? | 匹配其前的字符0次或者1次,即其前面的字符可有可元 | |
\+ | 匹配其前的字符1次或者多次,即其前面的字符至少出现1次 | |
\{m\} | 匹配其前的字符m次,精确匹配 | |
\{m,n\} | 匹配其前的字符至少m次,至多n次 | |
\{0,n\} | 匹配其前的字符最多n次 | |
\{m,\} | 匹配其前的字符最少m次 | |
位置锚定 | ^ | 锚定行首,写在模式的最左侧,指定的字符串只能出现在行首 |
$ | 锚定行尾,写在模式的最右侧 | |
^PATTERN$ | 用PATTERN来匹配整行 | |
^$ | 表示空行,连空格都不能包含,不包括任意字符 | |
^[[:spaces:]]* | 表示空行或者包括空白字符的行 | |
\<PATTERN | 锚定词首 | |
\bPATTERN | 锚定词首 | |
PATTERN\> | 锚定词尾 | |
\<PATTERN>\ | 精确锚定单词 | |
分组及引用 | \(PATTERN\) | 将一个或者多个字符捆绑在一起,当作一个整体进行处理; |
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为: \1: 模式从左侧起,第一个左括号以及与之匹配到的右括号之间的字符 \2:模式从左侧起,第二个左括号以及与之匹配到的右括号之间的字符 |
三、扩展正则表达式
类型 | 元字符 | 解释 |
字符匹配 | . | 匹配任意单个字符 |
[] | 匹配指定范围内的任意单个字符 | |
[^] | 匹配指定范围外的单个字符 | |
匹配次数 | * | 匹配其前的字符任意次,0次,1次或者多次 |
.* | 匹配任意长度的任意字符 | |
? | 匹配其前的字符0次或者1次,即其前面的字符可有可元 | |
+ | 匹配其前的字符1次或者多次,即其前面的字符至少出现1次 | |
{m} | 匹配其前的字符m次,精确匹配 | |
{m,n} | 匹配其前的字符至少m次,至多n次 | |
{0,n} | 匹配其前的字符最多n次 | |
{m,} | 匹配其前的字符最少m次 | |
位置锚定 | ^ | 锚定行首,写在模式的最左侧,指定的字符串只能出现在行首 |
$ | 锚定行尾,写在模式的最右侧 | |
^PATTERN$ | 用PATTERN来匹配整行 | |
^$ | 表示空行,连空格都不能包含,不包括任意字符 | |
^[[:spaces:]]* | 表示空行或者包括空白字符的行 | |
\<PATTERN | 锚定词首 | |
\bPATTERN | 锚定词首 | |
PATTERN\> | 锚定词尾 | |
\<PATTERN>\ | 精确锚定单词 | |
或 | | | 或,以|为分隔,表示或者为|左边,或者为|右边 C|cat表示C或者cat |
分组及引用 | (PATTERN) | 将一个或者多个字符捆绑在一起,当作一个整体进行处理; |
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为: \1: 模式从左侧起,第一个左括号以及与之匹配到的右括号之间的字符 \2:模式从左侧起,第二个左括号以及与之匹配到的右括号之间的字符 |
四、 BRE和ERE的区别: 从上面的两个表可以看出基本正则表达式和扩展正则表达式的区别,那就是扩展正则表达式在进行次数匹配和分组时的元字符不再需要\进行转义;另外扩展正则表达式多了一个或的元字符。
五、 练习:前面提到了这么多,一起来练习下吧。
1、显示/proc/meminfo文件中以大写或小写S开头的行;
# grep -i '^s' /proc/meminfo
# grep '^[Ss]' /proc/meminfo
# grep -E '^(S|s)' /proc/meminfo
2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f
3、显示/etc/passwd文件中其默认shell为/bin/bash的用户; 进一步:仅显示上述结果中其ID号最大的用户;
# grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n | tail -1 | cut -d: -f1,7
4、找出/etc/passwd文件中的一位数或两位数;
# grep "\<[0-9][0-9]\?\>" /etc/passwd
# grep "\<[0-9]\{1,2\}\>" /etc/passwd
5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
7、找出netstat -tan命令执行结果中以'LISTEN'结尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"
8、添加用户bash, testbash, basher, nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认shell相同的用户;
# grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd
9、扩展题:新建一个文本文件,假设有如下内容:
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最后一个单词是由此前某单词加r构成的行。
[root@liuqing tmp]# grep "\(l..e\).*\1" love.txt
10. 显示ifconfig命令输出结果中的IP地址。
~]# ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>(.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>){3}"
六、三个命令的互换
grep -E表示使用扩展正则表达式(egrep), -F表示将模式视为一个固定的字符串(fgrep)
egrep -G表示使用基本正则表达式(grep), -F表示将模式视为一个固定的字符串(fgrep)
fgrep -E表示使用扩展正则表达式(egrep), -G表示使用基本正则表达式(grep)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。