首页 > 代码库 > Linux grep命令用法以及正则表达式

Linux grep命令用法以及正则表达式

1.grep命令和正则表达式的简介

(1).grep(Global search REgular expression and Print out the line),即全局搜索正则表达式并打印出匹配的行,它是Linux系统中一个强大的文本搜索工具,它根据用户指定的“模式(pattern)”对目标文本进行过滤,显示被模式匹配到的行;

(2).正则表达式是由一类字符书写的模式,其中有些字符不表示符的字面意义,而是表示控制或通配的功能

2.grep命令的基本语法格式

    grep [OPTION]... ‘PATTERN‘ FILE...

grep的常用选项:

    -v : 对匹配的行进行取反

    -o : 仅显示匹配到的内容

    -i : 忽略字符大小写

    -n : 为匹配的行加上行号

    -E : 使用扩展正则表达式 ,等同于egrep命令

    -F : 不使用正则表达式搜索,等同于fgrep命令

    -A # : 连同匹配行的下#行一并显示,#代表任意数字

    -B # : 连同匹配行的上#行一并显示,#代表任意数字

    -C # : 连同匹配行的上下#行一并显示,#代表任意数字

    --color=auto : 对匹配的内容以不同的颜色显示

3.grep正则表达式的基本用法

基本正则表达式:

(1)字符匹配

. : 匹配任意单个字符

    例:匹配以r开头,t结尾中间只隔了两个字符的行

    clip_image001

[] : 匹配指定集合中的任意单个字符

常用的集合表示方法有:

        纯数字:[[:digit:]]或[0-9]

        小写字母:[[:lower:]]或[a-z]

        大写字母:[[:upper:]]或[A-Z]

        大小写字母:[[:alpha:]]或[a-zA-Z]

        数字加字母:[[:alnum:]]或[0-9a-zA-Z]

        空白字符:[[:space:]]

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

    例1:匹配包含数字0或2的行(截图只包含前半部分)

    clip_image002

    例2:匹配包含字母r或t的行(截图只包含前半部分)

    clip_image003

    例3:匹配包含数字0-9的行(截图只包含前半部分)

    clip_image004

[^] : 匹配指定集合外的任意单个字符

    例:匹配包含除1-9范围之外的字符的行(截图只包含前半部分)

    clip_image005

(2)次数匹配

* : 匹配其前面的字符出现任意次,0、1或多次的行

    例:创建一个测试文本,包含有以下内容:

    clip_image006

    匹配x字母出现任意次的行:

    clip_image007

\+ : 匹配其前面的字符出现1次或多次的行

    例:匹配x字至少1次的行

    clip_image008

\? : 匹配其前面的字符出现0次或1次的行

    例:匹配x字母出现0次或1次的行

    clip_image009

\{m\} : 匹配其前面的字符出现m次的行

    例:匹配x字母出现2次的行

    clip_image010

\{m,n\} : 匹配其前面的字符至少出现m次,至多出现n次的行,m和n表示一个范围m-n

    例:匹配x字母至少出现1次,至多出现3次的行

    clip_image011

(3)位置锚定

^ : 行首锚定

    例:匹配x字母出现在在行首的行

    clip_image012

$ : 行尾锚定

    例:匹配e字母出现在行尾的行

    clip_image013

^$ : 匹配空白行

    例:匹配空白的行

    clip_image014

\< : 词首锚定

    例:精确匹配xy两个字母在一个单词的词首的行

    clip_image015

\> : 词尾锚定

    例:精确匹配xy两个字母在一个单词的词尾的行

    clip_image016

\<\> : 匹配单词

    例:匹配包含xy这个单词的行

    clip_image017

(3)分组

\(\) : 对某字符串进行进行分组匹配

    例:匹配xy单启出现0次或1次的行

    clip_image018

后向引用:模式中,如果使用\(\)实现了分组,在某行文本的检查中,如果\(\)的模式匹配到了某内容,此内容后面的模式中可以被引用;

对前面的分组进行引用的符号为:\1 , \2 ,\3

模式自左而右,引用第#个左括号以及与其匹配右括号之间的模式匹配到的内容;

后向引用举例:

    新建一个文本文件,假设有如下内容:

    clip_image019

    找出前后都有相同单词的行:

    clip_image020

正则表达式元字符总结:

    字符匹配:. ,[] ,[^]

    次数匹配:* ,\? ,\+ ,\{m\} ,\{m,n\}

    位置锚定:^ ,$ ,\< ,\> ,\<\>

    分组匹配:\(\)

4.egrep及扩展正则表达式:

egrep相当于grep -E,egrep可以直接使用扩展正则表达式,而grep需要加上选项-E;

扩展正则表达式的元字符:

    字符匹配:. ,[] ,[^]

    次数匹配:*,?,+,{m},{m,n},{m,},{0,n}

    位置锚定:^,$,\>,\<

    分组匹配:(),支持后向引用

    | : 匹配左侧或右侧符合条件的行,比如a|b,含有a或b的行都匹配;

    例1:egrep 等同于 grep -E

    clip_image021

    例2:

    clip_image022

5.grep练习题:

(1).显示/proc/meminfo文件中以大写或小写s开头的行;

# grep -i ‘^s‘ /proc/meminfo

(2).显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

# grep -v ‘/sbin/nologin$‘ /etc/passwd | cut -d: -f1

(3).显示/etc/passwd文件中其默认shell为/bin/bash的用户

进一步:仅显示上述结果中其ID号最大的用户

# grep ‘/bin/bash$‘ /etc/passwd | cut -d: -f1 | sort -n -r | head -1

(4).找出/etc/passwd文件中的一位数或两位数;

# grep ‘\<[[:digit:]]\{1,2\}\>‘ /etc/passwd

(5).显示/boot/grub/grub.conf中至少一个空白字符开头的行

# grep ‘^[[:space:]]\+.*‘ /boot/grub/grub.conf

(6).显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

# grep ‘^#[[:space:]]\+[^[:space:]]\+‘ /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$‘ /etc/passwd

(9).扩展题:新建一个文本文件,假设有如下内容:

He like his lover.

He love his lover.

He like his liker.

He love his liker.

找出其中最后一个单词是由此前某单词加r构成的行;

# grep ‘\(\<[[:alpha:]]\+\>\).*\1r‘ grep.txt

(10).显示当前系统上root、centos或user1用户的默认shell及用户名;

# grep -E ‘^(root|centos|user1\>)‘ /etc/passwd

(11).找出/etc/rc.d/init.d/functions文件中某单词后面跟一对小括号‘()"的行;

# grep -o ‘\<[[:alpha:]]\+\>()‘ /etc/rc.d/init.d/functions

(12).使用echo输出一个路径,而使用egrep取出其基名;

# echo /etc/rc.d/ | grep -o ‘[^/]\+/\?$‘ | grep -o ‘[^/]\+‘

Linux grep命令用法以及正则表达式