grep(globally search a regular expression and print)以正规表示法进行全域查找并打印,grep是一个最初用于unix操作系统的命令行工具,在给出文件列表或标准输出后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或不匹配)的行或文本。
  

一、查找规则

grep命令的语法为:

grep [option(s)] pattern [file(s)]

grep查找的主要option可选项功能描述如下:

option

功能描述

-A

显示匹配规则的行,并显示该行后的x行

-B

显示匹配规则的行,并显示该行前的x行

-c

统计符合规则的行数

-C

显示匹配规则的行,并显示该行前后的x行,等同于 -x

-e patternList

指定一个或多个搜索模式

-E

将每个规则当作扩展的正则表达式(ERE),ERE空值可匹配所有行

-F

将指定的模式视作字符串而不是正则表达式

-f

指定规则文件,查找匹配规则文件中定义规则的行

-h

不展示符合规则行所在的文件名

-H

展示符合规则行所在的文件名

-i

比较时,大小写不敏感

-l

展示匹配规则的行所在的文件名

-L

展示不匹配规则的文件的文件名

-n

展示匹配规则的行编号

-q

禁止输出到标准输出

-r/-R

在当前目录及子目录下查询,等同于 -d recurse

-s

禁止输出错误信息

-v

展示与指定规则不匹配的行

-w

展示按单词匹配的行

-x

展示精确匹配规则的行

-o

展示精确匹配规则的部分

二、正则表达式

grep pattern部分的正则表达式基本元素:

元素

功能描述

范例

^

锚定行首

‘^test’

|锚定行尾|′test’

.

匹配一个非换行字符

‘te.t’

*

匹配零个多个字符

‘*test’

\<

匹配行首

‘\

\>

匹配行尾

‘test\>’

x\{m\}

连续重复字符’x’ m次

‘te\{3\}st’

x\{m,\}

连续重复字符’x’至少m次

‘te\{2,\}st’

x\{m,n\}

连续重复字符’x’至少m次,至多n次

‘te\{2,\}st’

\w

匹配一个文字或字符

‘test\w*’ (零个或多个文字或字符)

\W

匹配一个非单词字符

‘test\W’

\b

单词锁定功能

‘\btest\b’

[]

匹配一个字符

t[Ee]st

[-]

匹配一个指定范围的字符

[a-zA-Z]

[^]

不匹配一个范围的字符

[^0-9]

\d

匹配一个数字字符

‘\d’ (相当于’[0-9]’)

\D

匹配一个非数字字符

‘\D’ (相当于’[^0-9]’)

\w

匹配一个单词字符

‘\w’ (相当于’[a-zA-Z0-9]’)

\W

匹配一个非单词字符

‘\W’ (相当于’[^a-zA-Z0-9]’)

\s

匹配一个空白字符,如空格、制表、换行等

‘\s’ (相当于’[\f\n\r\t\v]’)

\S

匹配一个非空白字符

‘\S’ (相当于’[^\f\n\r\t\v]’)

\b

匹配一个单词边界

‘\b’

\B

匹配一个非单词边界

‘\B’

三、使用范例
3.1 option应用
  • 1.查找文本中匹配pattern1或者pattern2的行 (-e)
grep -e 'pattern1' -e 'pattern2' test.txt
  • 2.查找不匹配规则的行 (-v)
grep -v '^test' test.txt
  • 3.查找不匹配pattern1且不匹配pattern2的行
grep -v 'pattern1' test.txt | grep -v 'pattern2'
  • 4.将查找到的关键字高亮 (–color)
grep --color=auto 'pattern' test.txt

注:可在~/.bash_profile中添加alias grep=’grep –color=auto’

  • 5.递归查找当前目录及其子目录中的匹配内容 (-r)
grep -r 'pattern' *
  • 6.查看文件中规则匹配的行数 (-c)
grep -c 'pattern' test.txt
  • 7.查找空白行并显示行号 (-n)
grep -n '^$' test.txt
  • 8.查找只包含数字的行 (-x)
grep -x '[0-9][0-9]*' test.txt
  • 9.根据规则文件查询匹配规则的行 (-f)
grep -f patternFile test.txt
3.2 正则应用
  • 1.查找以小写字母开始的行
grep '^[a-z]' test.txt
  • 2.查找非字符开始的行
grep '^[^a-zA-Z]' test.txt
四、egrep、fgrep
  • 1.查找匹配pattern1或pattern2的行 (| : 按或方式查找)
grep -E 'pattern1|pattern2' test.txt
或
grep 'pattern1\|pattern2' test.txt
或
egrep 'pattern1|pattern2' test.txt
  • 2.查找包含一个或多个数字0的行 (+ : 一个或多个)
grep -E '0+' test.txt
或
grep '0\+' test.txt
或
egrep '0+' test.txt
  • 3.查找包含一个或多个no的行 (() : 按群组查找)
grep -E '(no)+' test.txt
或
grep '(no)\+' test.txt
或
egrep '(no)+' test.txt
  • 4.查找匹配n或no的行 (? : 零个或是一个 )
grep -E 'no?' test.txt
或
egrep 'no?' test.txt

注:fgrep职能查找固定文本,速度比grep快