grep与正则达式
admin
2023-03-01 13:41:53
0

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:]]*

表示空行或者包括空白字符的行


\

锚定词首


\bPATTERN

锚定词首


PATTERN\>

锚定词尾


\\

精确锚定单词




分组及引用

\(PATTERN\)

将一个或者多个字符捆绑在一起,当作一个整体进行处理;

分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:

\1: 模式从左侧起,第一个左括号以及与之匹配到的右括号之间的字符

\2:模式从左侧起,第二个左括号以及与之匹配到的右括号之间的字符


三、扩展正则表达式


类型

元字符

解释

字符匹配

.

匹配任意单个字符


[]

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


[^]

匹配指定范围外的单个字符




匹配次数

*

匹配其前的字符任意次,0次,1次或者多次


.*

匹配任意长度的任意字符


?

匹配其前的字符0次或者1次,即其前面的字符可有可元


+

匹配其前的字符1次或者多次,即其前面的字符至少出现1次


{m}

匹配其前的字符m次,精确匹配


{m,n}

匹配其前的字符至少m次,至多n次


   {0,n}

匹配其前的字符最多n次


   {m,}

匹配其前的字符最少m次

位置锚定

^

锚定行首,写在模式的最左侧,指定的字符串只能出现在行首


$

锚定行尾,写在模式的最右侧


^PATTERN$

用PATTERN来匹配整行


^$

表示空行,连空格都不能包含,不包括任意字符


^[[:spaces:]]*

表示空行或者包括空白字符的行


\

锚定词首


\bPATTERN

锚定词首


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)

相关内容

热门资讯

学习机直播乱象调查:主播打北大... 极目新闻记者 刘闪 何佳仪打开短视频平台,各类学习机测评直播间随处可见。一些自诩自己是“老师”的主播...
即日起,郑州“错峰加油”有优惠... 进入5月,又到了郑州臭氧污染频发的季节,记者从郑州市生态环境局移动源污染监管处了解到,为减少臭氧污染...
汗水写热爱 篮球致青春 成人组1VS1比赛。河南日报全媒体记者 黄晖 摄“非常高兴能够参加这种全民赛事,也希望以后能够有更多...
荷兰六六民主党全国办公室遭爆炸... 荷兰警方7日说,荷兰执政党之一的六六民主党位于海牙的全国办公室当晚遭爆炸物袭击,造成建筑受损,无人受...
樱花树油烟机总是开不了怎么回事 电源问题。先检查电源是否未插上或是否电,若没有,将它重新插好,等待来电后测试,检查开不了机的问题是否...
燃气灶打火后一会就灭是什么原因 原因可能是电池没有电了,所以一开始能够打着火,但是燃烧了一会儿又熄灭了,这种情况下可以尝试更换一节新...
灶盘有气儿,就是高压不打火 这种情况是点火器出了问题,如果点火器无法产生火花,那炉灶盘自然也就不能产生火,通常来说,如果灶台的开...
迅达热水器水流小怎么办 当你发现迅达热水器水流小时,可能会感到烦恼。然而,这个问题通常是很容易解决的。以下是一些可能导致水流...
迅达燃气灶打不着火 1、打火时看一下会不会有火花出来,如果没有火花就是电池没有电导致的打不着火。2、也有可能是迅达燃气灶...