grep是linux中使用最广泛的命令之一, 缩写来自Globally search a Regular Expression and Print,是一种强大的文本搜索工具。grep支持使用正则表达式搜索文本,根据用户指定的模式对目标文件逐行搜索并显示出能够被匹配到的行,默认将结果打印到标准输出。

    Linux使用的是GNU版本的grep,包含grep,egrep和fgrep3种格式:

        grep:标准grep,支持正则表达式。

        egrep:扩展正则表达式,支持基本及扩展正则表达式,通常情况下可以等效于grep -E。

        fgrep:快速grep,仅允许查找字符串而不是模式,因此不能使用正则表达式,等效于grep -F。

    grep的语法:

        grep [-options] pattern [file……]

    grep常用的options

        -c 显示匹配行的行数而不是行本身

        -i 匹配时忽略大小写

        -n 显示匹配内容在文件中的行数

        -l 在查找多个文件时,显示包含匹配行的文件,而不是行本身

        -L 与-l相反,显示不包含匹配行的文件

        -r 递归搜索,查找这个目录树

        -q 静默输出,常用于shell基本的条件判断

    grep使用的pattern通常是一个正则表达式,因此想要熟练的使用grep就必须学会使用正则表达式。

    正则表达式是一种指定字符串模式的间接方式,通常简写为regex或re。

        grep 使用的基本正则表达式和egrep使用的主要区别:基本正则表达式?,+,|不能使用,(),{}必须用/转义。

    对于GNU grep来说,扩展正则表达式更为实用,因此可以创建别名,为grep默认添加 E选项。

        alias grep=`egrep`或alias grep=`grep E`

        如果想要使别名永久生效,可以写入配置文件~/.bashrc

    以下为常用的egrep正则表达式的语法:

元字符

描述

示例

^

行首锚定符

^love 匹配所有以love开头的行

$

行尾锚定符

love$ 匹配所有以love结尾的行

.

匹配任意单个字符

Lov.    匹配lova,lovb或love等

[]

匹配包含在[]内的单个字符

love[abc] 匹配lovea,loveb或lovec

/<

锚定单词词首

/<love 匹配love开头的位置

>/

锚定单词词尾

Love>/ 匹配love结尾的位置

[^]

匹配不包含在[]内的单个字符

love[^12] 匹配从love3到love9

[-]

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

[1-5] 匹配1,2,3,4,5中的一个字符

|

逻辑运算符或 匹配|两边的任意一项

Love(a | b) 匹配lovea 或loveb

\

转义特殊字符

lov\.e 匹配lov.e而不是lovae,lovbe

()

创建用于匹配的字符串

([0-9]{1,3}\.){3}[0-9]{1,3} 匹配ip地址

                              正则表达式:基本匹配

运算符

描述

示例

?

匹配前一项0次或1次

love? 匹配lov或love 不能匹配lovee

+

匹配前一项1次或多次

love+ 匹配love或lovee 不能匹配lov

*

匹配前一项0次或多次

love* 匹配lov,love或lovee

{n}

匹配前一项n次

[0-9]{3} 匹配任意一个三位数

{n,}

匹配前一项至少n次

[0-9]{3, } 匹配任意一个三位数或更多位数

{ ,n}

匹配前一项最多n次

[0-9]{ ,2} 匹配任意一个一位数或两位数

{m,n}

匹配前一项至少m次,最多n次

[0-9]{2,5} 匹配任意一个从二位数到五位数之间的数

正则表达式:次数运算符

描述

类似于

[:lower:]

小写字母

a-z

[:upper:]

大写字母

A-Z

[:alpha:]

大小写字母

a-zA-Z

[:digit:]

数字

0-9

[:alnum:]

大小写字母数字

a-zA-Z0-9

[:punct:]

标点符号

[:black:]

空格和制表符