正则表达式与grep命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式与grep命令相关的知识,希望对你有一定的参考价值。

一、引言

介绍Linux系统中的两个命名:grepegrep。要想使用这2个命令要先学会使用正则表达式,在介绍正则表达式之前,先说明一下,大家都熟知的在word中使用的通配符,即:

*:表示任意长度任意字符。

?:表示任意单个字符。

记住上面这两个字符所表示的意思,后面还会在正则表达式里出现,但意义不同。

 

1.正则表达式:Regular ExpressionREGEXP

由一类特殊字符及文本字符所编写的模式,其有些字符不表示字面意义,而是用于表示控制或通配的功能;

元字符分两类:

基本正则表达式:BRE

扩展的正则表达式:ERE

正则表达式引擎是利用正则表达式模式分析给定的文本的程序,在上亿单位的文本搜索时,有明显优势。

 

2.三类grep命令

1grepGlobal search REgular expression and Print out the line;默认支持使用BRE基本正则表达式;

2egrep:支持使用扩展正则表达式;

3fgrep:不支持使用正则表达式;

 

二、grep命令

作用:文本搜索工具,根据用户指定的pattern(过滤条件)对目标文本逐行进行匹配检查;打印出符合条件的行;

模式:有文本字符及正则表达式元字符所编写的过滤条件;

1.语法格式

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE][FILE...]

 

2.选项

--color=auto:对匹配到的文本着色高亮显示;

-i:忽略字符大小写;

-o:仅显示匹配到的文本自身;(默认显示匹配到的文本整行)

-v--invert-match:反向匹配;

-E--extened-regexp:支持扩展的正则表达式;相当于egrep命令,对grepfgrep有用;

-F--fixed-strings:相当于fgrep命令;

-q--quiet--silent:静默模式,不输出任何信息;取命令执行状态码时常用;

-G--basic-regexp:支持使用基本正则表达式,对egrepfgrep有用;

-P--perl-regexp:支持使用pcre正则表达式(支持元字符很多,非常强大);

 

-e PATTERN--regexp=PATTERN:使用多模式;

-f FILE--file=FILE为每行包含了一个pattern的文本文件,即grepscript;把模式写在一个文件里,通过读取文件(脚本文件),来匹配;

-c:显示统计匹配到的行数;

-r--recursive:对目录下所有文件里的内容根据模式匹配;

 

-A #--after-context=#:表示显示匹配到行的后面#行;

-B #--before-context=#:表示显示匹配到行的前面#行;

-C #-#--context=#:表示显示匹配到行的前后#行;

 

例如:

~]# grep ‘root‘ /etc/passwd:如果模式里有变量要用双引号;

~]# grep -v ‘root‘ /etc/passwd:反向匹配;

~]# grep -i ‘root‘ /etc/passwd:忽略字符大小写;

~]# grep -o ‘root‘ /etc/passwd:仅显示匹配到的文本自身;

~]# grep -q ‘root‘ /etc/passwd:静默模式;

~]# echo $?;取命令执行状态码时常用;

 

例如:

~]# grep -e "r..t" -e"bash" /etc/passwd:使用多模式;

~]# grep -f /root/test/mypat /etc/passwd:使用匹配保存在文件里的模式;

~]# grep -A 1 "^[op]" /etc/passwd:显示匹配到的行后面的一行;

~]# grep -B 2 "^[op]" /etc/passwd:显示匹配到的行前面的两行;

~]# grep -C 1 "^[op]" /etc/passwd:显示匹配到的行前后各一行;

 

模式用引号引起来,有变量时用单引号;

 

三、基本正则表达式元字符

1.字符匹配

.:匹配任意单个字符;

[]:匹配范围内的任意单个字符;(glob机制)

[^]:匹配范围外的单个字符;

[:digit:]:任意单个数字;

[:lower:]:任意单个小写字母:

[:upper:]:任意单个大写字符;

[:alpha:]:任意单个字母;

[:alnum:]:任意单个字母和数字

[:space:]:任意单个空白字符;

[:blank:]:任意单个空格和tab

[:punct:]:任意单个标点符号;

[:cntrl:]:任意单个控制符;

[:graph:]:任意单个能显示的符号;

[:print:]:任意单个可打印符号;

[:xdigit:]:任意单个十六进制字符;

 

man 7 glob查看字符集范围;

 

例如:

~]# ifconfig | grep "r.."r后跟两个字符的行;

~]# ifconfig | grep -i"i[a-z][a-z]":不区分大小写,i后跟两个字母的行;

~]# ifconfig | grep "i[[:alpha:]][[:space:]]"i后跟一个字母再跟一个空格的行;

 

2.次数匹配

用在要指定其出现的次数的字符后面,用于限制其前面的字符要出现的次数,默认工作在贪婪模式;

 

*:匹配前面的字符出现的任意次(0,1或多次);

grep "x*y":只要有y就匹配;

xxxyabc

yab

abcxy

abcy

.*:匹配任意长度的任意字符,相当于glob中的*

grep "x.*y":在xy之间可出现任意长度任意字符即匹配;

xxxyabc

abcxy

\+:匹配前面的字符至少1次(1次或多次);\为转义符;

grep "x\+y"y之前必须出现一个x

xxxyabc

abcxy

\?:匹配前面的字符0次或1次,即前面的字符可有可无;

grep "x\?y":只要有y就匹配;

xxxyabc

yab

abcxy

abcy

\{m\}:匹配其前面的字符出现m次,m为非负整数;

grep "x\{2\}y"y前出现2x就匹配;

xxxyabc

\{m,n\}:匹配其前面的字符出现m次,m为非负整数;闭区间[m,n]

\{0,n\}:至多n次;

\{m,\}:至少m次;

例如:

~]# ifconfig | grep"i[[:alpha:]]\{3\}":匹配i后跟3个字母的行;

~]# ifconfig | grep"i[[:alpha:]]\{3,\}":匹配i后跟至少3个字母的行;

 

3.位置锚定

限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的哪个位置;

 

^:行首锚定;用于模式的最左侧,^PATTERN

$:行尾锚定;用于模式的最右侧,PATTERN$

^PATTERN$:要让PATTERN完全匹配一整行;

^$:匹配空行;

^[[:space:]].*$:匹配空白行;

 

例如:

~]# grep "^r..t" /etc/passwd:匹配r开头后跟两个字符再跟t的行;

~]# grep "l.\{3\}n" /etc/passwd:匹配l后跟3个字符再跟n的行;

~]# grep "l.\{3\}n$" /etc/passwd:匹配l后跟3个字符再跟n结尾的行;

~]# grep "^l.\{3\}n$" /etc/passwd:匹配只能是l开头后跟3个字符再跟n结尾的行;

~]# grep "[[:space:]]\+" /etc/passwd:匹配至少连续出现一个空格的行;

 

单词:非特殊字符组成的连续字符(字符串)都称为单词;

 

\<\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN,/bPATTERN

\>\b:词尾锚定,用于的承诺模式的右侧,格式为PATTERN\>,PATTERN\b

 

例如:

~]# grep "\<r..t" /etc/passwd:匹配单词词首:r后跟两个字符再跟t的的行;

~]# grep "\<r..t\>"/etc/passwd:匹配单词:r后跟两个字符再跟t的行;

~]# ifconfig | grep"\<[0-9]\{3\}\>":匹配单词:三个数字;

 

4.分组与引用

\(PATTERN\):将此PATTERN匹配到的字符当作一个不可分割的整体进行处理;

 

注意:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部变量中,这些变量是\1,\2,\3,...

 

例如:pat1\(pat2\)pat3\(pat4\(pat5)pat6\)

 

\n:模式中的第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)

 

\1:表示第一组括号总的PATTERN匹配到的的字符串;上例:pat2

\2:表示第二组括号总的PATTERN匹配到的的字符串;上例:pat4\(pat5)pat6

\3:表示第三组括号总的PATTERN匹配到的的字符串;上例:pat5

...

示例:

he love his lover

he like his lover

he love his liker

he like his liker

 

.*l..e.*l..er

\(l..e\).*\1r

 

~]# grep -o ‘l..e.*l..er‘ fenzu_pattern.txt:不能完成精确匹配;

~]# grep -o ‘\(l..e\).*\1r‘fenzu_pattern.txt:分组可完成精确匹配;

 

后向引用:引用前面的括号中的模式所匹配到的字符串;

 

四、egrep命令

支持使用扩展的正则表达式的grep命令,相当于grep -E

1.语法格式

egrep [OPTIONS] PATTERN [FILE...]

2.选项

选项同grep

 

五、扩展正则表达式的元字符:无需转义符

1.字符匹配

.:匹配任意单个字符;

[]:匹配范围内的任意单个字符;

[^]:匹配范围外的单个字符;

[:digit:]:任意单个数字;

[:lower:]:任意单个小写字母:

[:upper:]:任意单个大写字符;

[:alpha:]:任意单个字母;

[:alnum:]:任意单个字母和数字

[:space:]:任意单个空格;

[:blank:]:任意单个空格和tab

[:punct:]:任意单个标点符号;

 

2.次数匹配

*:匹配前面的字符(可有可无)出现的任意次(0,1或多次);

?:匹配前面的字符0次或1次,即前面的字符可有可无;

+:匹配前面的字符至少1次(1次或多次);

{m}:匹配其前面的字符出现m次,m为非负整数;

{m,n}:匹配其前面的字符出现m次,m为非负整数;[m,n]

{0,n}:至多n次;

{m,}:至少m次;

 

3.位置锚定

^:行首锚定;用于模式的最左侧,^PATTERN

$:行尾锚定;用于模式的最右侧,PATTERN$

^PATTERN$:要让PATTERN完全匹配一整行;

^$:匹配空行

\<,\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN,/bPATTERN

\>,\b:词尾锚定,用于的承诺模式的右侧,格式为PATTERN\>,PATTERN\b

 

4.分组及引用

(pattern):分组,括号中的模式匹配到的字符会被存储于正则表达式引擎内部的变量中;

后向引用:\1,\2,\3,...

 

5.

a|ba或者b

C|cat:表示Ccat

(C|c)at:表示Catcat


以上是关于正则表达式与grep命令的主要内容,如果未能解决你的问题,请参考以下文章

07 grep命令与正则表达式

grep命令与正则表达式(过滤)三

grep与egrep命令及正则表达式

grep命令与正则表达式(过滤)二

grep用法详解:grep与正则表达式 [转]

linux shell基础正则表达式与grep命令(编辑中)