正则表达式利器之grep与egrep的使用及其区别

时间:2022-07-25 08:55:40

何为正则;

    简单的来说就是快速高效的查找和分析字符串. 也可以用于验证一个字符串是否符合某个给定的规则.

   使用正则表达式,可以: 测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。 替换文本。可以在文档中使用一个则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。 根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。


grep与egrep的区别;

在linux系统环境下,我们通常使用grep命令来过滤出需要的行而egrep确很少使用,他们的区别其实很简单,grep默认不支持正则表达式,egrep默认支持正则表达式,egrep 等于 grep -E 命令。


grep的功能

文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行


grep的使用格式;

grep [options] 'PATTERN' file...


grep的常用选项;

   -v;反向匹配,显示不能被模式所匹配到的行

       显示/etc/inittab文件下非#号开头的行

[root@localhost ~]# grep -v "^#" /etc/inittabid:3:initdefault:
[root@localhost ~]#

   -o;仅显示被模式匹配到的字串,而非整行

       匹配/etc/passwd下root的用户

[root@localhost ~]# grep -o 'root' /etc/passwdrootrootrootroot

   -i;不区分字符大小写

       匹配/etc/fstab下字母u开头d结尾的行。

[root@localhost ~]# grep -i "u..d" /etc/fstabUUID=6e4d8aaf-c57b-4ddf-86b8-bb7f3d2f9777 /boot                   ext4    defaults        1 2[root@localhost ~]#

   -A #1显示被匹配到的行的下面的1行

   -B #1显示被匹配到的行的上面的1行

   -C #1显示被匹配到的行的上下面各1行

       示例;显示“IPADDR”字符及上下行

[root@localhost ~]# grep -A 2 "IPADDR" /etc/sysconfig/network-scripts/ifcfg-eth0#IPADDR=192.168.48.2#NETMASK=255.255.255.0
#NETMASK=255.255.255.0[root@localhost ~]# grep -B 2 "IPADDR" /etc/sysconfig/network-scripts/ifcfg-eth0TYPE="Ethernet"UUID="354619c8-0722-41e6-afff-5c0470e6c13c"#IPADDR=192.168.48.2[root@localhost ~]# grep -C 2 "IPADDR" /etc/sysconfig/network-scripts/ifcfg-eth0TYPE="Ethernet"UUID="354619c8-0722-41e6-afff-5c0470e6c13c"#IPADDR=192.168.48.2#NETMASK=255.255.255.0[root@localhost ~]#


   -n: 显示匹配到的行号

   示例;匹配到/etc/fstab/以#号开头的行,并且显示行号

[root@localhost ~]# grep -n "^#" /etc/fstab2:#3:# /etc/fstab4:# Created by anaconda on Mon Feb 10 10:27:38 20145:#6:# Accessible filesystems, by reference, are maintained under '/dev/disk'7:# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info8:#


grep中的常用元字符匹配;  

字符匹配;

   .;任意单个字符

[root@localhost shell]# grep 'r..t' /etc/passwdroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologintestuser:x:504:504::/home/restuserhome:/bin/bash

[];指定范围内的任意单个字符。(以下7种字符)

        [[:digit:]] 数字

        [[:lower:]], 小写字母

        [[:upper:]], 大写字母

        [[:punct:]], 标点符号

        [[:space:]], 空白符号

        [[:alpha:]], 所有字母

        [[:alnum:]], 所有数字和字母


示例1:匹配/etc/inittab文件下以数字结尾的行

[root@localhost ~]# grep '[[:digit:]]$' /etc/inittab#   5 - X11


示例2:匹配/etc/inittab/文件下以#号开头后面是空白字符

[root@localhost ~]# grep '^#[[:space:]][[:upper:]]' /etc/inittab# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.# System initialization is started by /etc/init/rcS.conf# Individual runlevels are started by /etc/init/rc.conf# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,# For information on how to write upstart event handlers, or how# Default runlevel. The runlevels used are:

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

示例;匹配s开头中间接一个任意单个符的行

[root@localhost ~]# grep "[s].s" /etc/fstab# Accessible filesystems, by reference, are maintained under '/dev/disk'sysfs                   /sys                    sysfs   defaults        0 0


[^];指定范围外的任意单个字符

示例;匹配/etc/sysconfig/network-scripts/ifcfg-eth0文件下以 非小写字母开头的行?

正则表达式利器之grep与egrep的使用及其区别


*;匹配其前面的字符任意次

正则表达式利器之grep与egrep的使用及其区别


次数匹配;用来指定匹配其前面的字符的次数

       (grep默认工作在贪婪模式;尽可能长的去匹配字符)

\?; 匹配其前面的字符1次或0次

   匹配nba.txt文件中b开头其前面字符至多1次或0次

正则表达式利器之grep与egrep的使用及其区别


\{m\};匹配其前面的字符m次

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

   匹配nba.txt文件中n和b之间出现了至少2次至多3次的字符

正则表达式利器之grep与egrep的使用及其区别


\{m,\};至少m次

   匹配其前面的字符至少2次

正则表达式利器之grep与egrep的使用及其区别


\{0,n};至多n次

正则表达式利器之grep与egrep的使用及其区别


位置锚定:用于指定字符出现的位置

^;行首,此字符后面的任意内容必须出现在行首

[root@localhost ~]# grep "^r..t" /etc/passwdroot:x:0:0:root:/root:/bin/bash[root@localhost ~]#


$;行尾,此字符前面的任意内容必须出现在行尾

[root@localhost ~]# grep "b..h$" /etc/passwdroot:x:0:0:root:/root:/bin/bashouyang:x:500:500::/home/ouyang:/bin/bashgentoo:x:501:501:tom,new you,110,120:/home/gentoo:/bin/bashuser2:x:502:502::/home/user2:/bin/bash


^$;空白行

[root@localhost ~]# grep '^$' /etc/inittab | wc -l0[root@localhost ~]# grep '^$' /etc/fstab | wc -l1[root@localhost ~]#


\<或\b;词首,其后的任意字符必须作为单词的首部出现

[root@localhost ~]# grep '\<http' /etc/issuehttp://www.magedu.com[root@localhost ~]#


\>或\b;词尾,其后的任意字符必须作为单词的尾部出现

[root@localhost ~]# grep 'Services\>' /etc/issueMage Education Learning Services[root@localhost ~]#


分组

\(\);分组

\1;后向引用,引用前面的第一个左括号以及之对应的右括号中的模式所匹配到的内容

示例;将分组里的内容ba向后引用一次

正则表达式利器之grep与egrep的使用及其区别


egrep;使用扩展正则表达来构建模式,相当于grep,因此grep与egrep的匹配模式及常用选项基本一致,仅做了两个grep没有的示例;


+;匹配其前面的字符至少1


正则表达式利器之grep与egrep的使用及其区别


扩展的正则表达式还支持或者

|or


正则表达式利器之grep与egrep的使用及其区别


由于本人现还在学习阶段,也是第一次写blog,写的不好及有不对之处,还请各位大佬们多多指出,谢谢。



本文出自 “春天里” 博客,请务必保留此出处http://wfnygah.blog.51cto.com/7150625/1362400