Shell——Grep(三)

前言

grep(全局正则表达式版本)允许对文本文件进行模式查找。如果找到匹配模式, grep 打印包含模式的所有行。

表达式

grep [选项]基本正则表达式[文件]

  1. 这里基本正则表达式可为字符串。

  2. 在g r e p命令中输入字符串参数时,最好将其用双引号括起来。

    例如:“m y s t r i n g”。这样做有两个原因,一是以防被误解为 s h e l l命令,二是可以用来查找多个单词组成的字符串,例如:“jet plane”,如果不用双引号将其括起来,那么单词 p l a n e将被误认为是一个文件,查询结果将返回“文件不存在”的错误信息。

  3. 在调用变量时,也应该使用双引号

    诸如: g r e p“$ M Y VA R”文件名,如果不这样,将没有返回结果。

  4. 在调用模式匹配时,应使用单引号。

常用的g r e p选项有:

  • -c 只输出匹配行的计数。
  • -i 不区分大小写(只适用于单字符)。
  • -h 查询多文件时不显示文件名。
  • -l 查询多文件时只输出包含匹配字符的文件名。
  • -n 显示匹配行及行号。
  • -s 不显示不存在或无匹配文本的错误信息。
  • -v 显示不包含匹配文本的所有行。

字符串匹配

查询多个文件

如果要在当前目录下所有. d o c文件中查找字符串“s o r t”,方法如下:

$ grep “sort”*.doc

或在所有文件中查询单词 “sort it”

$ grep “sort it” *

精确匹配

抽取字符串 “48”:

$ grep “48” data.f

返回结果包含诸如 484 和 483 等,实际上应精确抽取只包含 48 的各行。

精确匹配有两种方式:

  1. < Ta b >键

    $ grep “48“ data.f

  2. \ >:

    $ grep “48>“ data.f

行匹配

返回包含字符串“4 8”的行数:

$ grep -c “48” data.f

返回包含字符串 “48” 的行,行数在第一列

$ grep -n “48” data.f

显示所有不包含4 8的各行:

$ grep -v “48” data.f

大小写敏感

缺省情况下,g r e p是大小写敏感的,如要查询大小写不敏感字符串,必须使用 - i开关。

grep -i “sept” data.f

与正则表达式

使用正则表达式时最好用单引号括起来,这样可以防止 g r e p中使用的专有模式与一些 s h e l l命令的特殊方式相混淆。

常用正则表达式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
^word	搜寻以word开头的行。

word$ 搜寻以word结束的行

. 匹配任意一个字符。 例如:grep –n ‘e.e’ regular.txt 匹配e和e之间有任意一个字符,可以匹配eee,eae,eve,但是不匹配ee。

\ 转义字符。 例如:搜寻’,’是一个特殊字符,在正则表达式中有特殊含义。必须要先转义。grep –n ‘\,” regular.txt

* 前面的字符重复0到多次。 例如匹配gle,gogle,google,gooogle等等 grep –n ‘go*gle’ regular.txt

[list] 匹配一系列字符中的一个。 例如:匹配gl,gf。grep –n ‘g[lf]’ regular.txt

[n1-n2] 匹配一个字符范围中的一个字符。 例如:匹配数字字符 grep –n ‘[0-9]’ regular.txt

[^list] 匹配字符集以外的字符 例如:grep –n ‘[^o]‘ regular.txt 匹配非o字符

\<word 单词是的开头。 例如:匹配以g开头的单词 grep –n ‘\<g’ regular.txt

word\> 匹配单词结尾 例如:匹配以tion结尾的单词 grep –n ‘tion\>’ regular.txt

word\{n1\} 前面的字符重复n1 例如:匹配google。 grep –n ‘go\{2\}gle’ regular.txt

word\{n1,\} 前面的字符至少重复n1 例如:匹配google,gooogle。 grep –n ‘go\{2\}gle’ regular.txt

word\{n1,n2\} 前面的字符重复n1,n2次 例如:匹配google,gooogle。 grep –n ‘go\{2,3\}gle’ regular.txt

扩展正则表达式:

grep -neE 可以使用扩展正则表达式。

1
2
3
4
5
6
7
8
9
10
11
12
13
?    匹配0个或1个在其之前的那个普通字符。
例如,匹配gd,god grep –nE ‘go?d’ regular.txt

+ 匹配1个或多个在其之前的那个普通字符,重复前面字符1到多次。
例如:匹配god,good,goood等等字符串。
grep –nE go+d’ regular.txt

() 表示一个字符集合或用在expr中,匹配整个括号内的字符串,
原来都是匹配单个字符。 例如:搜寻good或者glad
grep –nE ‘g(oo|la)’ regular.txt

| 表示“或”,匹配一组可选的字符,或(or)的方式匹配多个字串。
例如:grep –nE ‘god|good’ regular.txt 匹配god或者good。

常用的集合表示方法有:

1
2
3
4
5
6
7
8
9
10
11
12
13
纯数字:[[:digit:]]或[0-9]

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

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

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

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

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

标点符号:[[:punct:]]
文章目录
  1. 1. 前言
  2. 2. 表达式
  3. 3. 字符串匹配
    1. 3.1. 查询多个文件
    2. 3.2. 精确匹配
    3. 3.3. 行匹配
    4. 3.4. 大小写敏感
  4. 4. 与正则表达式
    1. 4.1. 常用正则表达式:
    2. 4.2. 扩展正则表达式:
    3. 4.3. 常用的集合表示方法有:
|