grep正则表达式

Posted

tags:

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

文本处理工具

grep作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行

REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能


参数:

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

-v: 显示不被pattern匹配到的行

-i: 忽略字符大小写

-n:显示匹配的行号

-c: 统计匹配的行数

-o: 仅显示匹配到的字符串

-q: 静默模式,不输出任何信息

-A #: after, #

-B #: before, #

-C #context, 前后各#

-e:实现多个选项间的逻辑or关系 ##grep –e‘cat ’ -e ‘dog’ file

-w:整行匹配整个单词

-E:使用ERE

-F:相当于fgrep,不支持正则表达式


字符匹配:

. 匹配任意单个字符;

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

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

前面要加中括号,egrep不需要

[:alnum:] 字母和数字

[:alpha:] 代表任何英文大小写字符,亦即A-Z,a-z

[:lower:] 小写字母

[:upper:] 大写字母

[:blank:] 空白字符(空格和制表符)

[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)

[:cntrl:] 不可打印的控制字符(退格、删除、警铃...

[:digit:] 十进制数字[:xdigit:]十六进制数字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符

[:punct:] 标点符号

[:alnum:]:字母和数字

 

匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

* 匹配前面的字符任意次,包括0

贪婪模式:尽可能长的匹配

.*任意长度的任意字符

\?匹配其前面的字符01

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

\{n\}匹配前面的字符n

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

\{,n\}匹配前面的字符至多n

\{n,\}匹配前面的字符至少n


分组

分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+

分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...

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

示例:\(string1\+\(string2\)*\)

\1 string1\+\(string2\)*

\2 string2


位置锚定:定位出现的位置

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

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

^PATTERN$ 用于模式匹配整行

^$ 空行

^[[:space:]]*$ 空白行

\< \b词首锚定,用于单词模式的左侧

\> \b词尾锚定;用于单词模式的右侧

\<PATTERN\>匹配整个单词


Egrep扩展正则表达式

继承grep的所有模式匹配,只是不再需要\作为转义符了

egrep多了一个或者(要使用大于号):

a|b: ab

C|cat: Ccat

(C|c)at:Catcat

 

 练习:

1、显示/proc/meminfo文件中以不区分大小的s开头的行;

grep -i "^s" /proc/meminfo

egrep "^(S|s)" /proc/meminfo 

2、显示/etc/passwd中以nologin结尾的行;

grep "/sbin/nologin$" /etc/passwd

3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意字符的行;

grep "^#[[:blank:]]\{1,\}.*" /etc/inittab

4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;

grep --color "\:[[:digit:]]\:" /etc/inittab

5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;

grep "^[[:blank:]]" /boot/grub/grub.conf

6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;

grep "^\([[:digit:]]\).*\1$" /etc/inittab

7、找出某文件中的,1位数,或2位数;

egrep "\<[[:digit:]]{1,2}\>" /etc/passwd --color

8、显示三个用户root、bin、ftp的UID和默认shell

egrep "^(root|bin|ftp)" /etc/passwd |cut -d: -f1,3,7

9、找出/etc/rc.d/init.d/functions文件中行首为某单词

grep "^\<[[:alpha:]]" /etc/init.d/functions

10、显示ifconfig命令结果中所有IPv4地址

ifconfig |egrep -o "([[:digit:]]{1,3}.){3}[[:digit:]]{1,3}" 

11、取出/etc/init.d/network的基名

ls /etc/init.d/network |egrep -o "[^/]+$

12、取出/etc/init.d/network的路径

ls /etc/init.d/network |egrep -o ".*/"

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

正则表达式与grep

Linux基础--grep与正则表达式

grep与基本正则表达式

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

shell (e)grep正则表达式问题

shell脚本——正则表达式(包含grep详细介绍及应用)