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快