所在位置:

grep的基本用法

grep 是一个用来在文件中搜索内容的工具,但不能替换和删除文件中的内容,如果要实现这些功能,可以使用 sedawk 命令。grep 的强大在于正则表达式,下面简单说一下 grep 的正则表达式和一些常用的用法:

格式

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

grep、egrep、fgrep 的关系

  • grep -E 相当于 egrep
  • grep -F 相当于 fgrep
  • grep 默认支持 基本的正则表达式 BRE ( basic regular expression )
  • egrep 支持 扩展的正则表达式 ERE ( extended regular expression )
  • fgrep 不支持正则表达式

基本的正则表达式 BRE

  • . 表示任意的单个字符

  • [] 表示括号里的任意一个字符,比如 [0-9] 表示数字,[a-z] 表示小写字母

  • * 表示 * 前面的字符出现1次或者多次

  • [^] 表示排除括号内的内容,比如说 [^0-9] 表示非数字的内容

  • ^ 表示以 ^ 后面的内容开头

  • $ 表示以 $ 前面的内容结尾

  • \? 表示 ? 前面的字符出现1次或者0次

  • \{m,n\} 表示前面的字符最少m次,最多n次

  • \< 或者 \b 表示以 < 或者 \b 之后的字符做为一个单词的开始

  • \> 或者 \b 表示以 > 或者 \b 之后的字符做为一个单词的结尾

  • \<\> 表示以 < 开始和 > 结尾作为一个单词

  • \(\) 表示反向搜索

扩展的正则表达式 ERE

  • . 表示任意的单个字符

  • [] 表示括号里的任意一个字符,比如 [0-9] 表示数字,[a-z] 表示小写字母

  • * 表示 * 前面的字符出现1次或者多次

  • [^] 表示排除括号内的内容,比如说 [^0-9] 表示非数字的内容

  • ^ 表示以 ^ 后面的内容开头

  • $ 表示以 $ 前面的内容结尾

  • ? 表示 ? 前面的字符出现1次或者0次

  • {m,n} 表示前面的字符最少m次,最多n次

  • \< 或者 \b 表示以 < 或者 \b 之后的字符做为一个单词的开始

  • \> 或者 \b 表示以 > 或者 \b 之后的字符做为一个单词的结尾

  • \<\> 表示以 < 开始和 > 结尾作为一个单词

  • () 表示分组

说明: 其实 基本的正则表达式 与 扩展的正则表达式 完全有相同的,像 .*[][^]^$\<或者\b\>或者\b,还有一些是也有相同,但是 基本的正则表达式 要加 \ 这个,像 ?{m,n}()

常用参数

  • -i 表示不区分大小写

  • -o 表示只显示匹配的单词

  • -v 表示显示没有匹配的行

  • -A 表示显示匹配行的相邻下几行

  • B 表示显示匹配行的相邻上几行

  • C 表示显示匹配行的相邻上下几行

  • -n 表示显示结果所在的行数

举例

test.txt 的内容
The old man was thin and gaunt with deep wrinkles in the back of his neck.
The brown blotches of the benevolent skin cancer the sun
this is a 135 test 135.
12456 112125 1111

But none of these scars were fresh.
They were as old as erosions in a fishless desert.

as root my  god
test \abc good ao scars were fresh.
不区分大小写
grep -in 'the' test.txt
显示没有匹配的行
grep -vn '[0-9]' test.txt
显示匹配行的相邻下两行
grep -A 2 'test' test.txt

注意:不能加 n 参数

显示匹配行的相邻上两行
grep -B 2 'test' test.txt
显示匹配行的相邻上下两行
grep -C 2 'test' test.txt
显示匹配数字的行
grep -n '[0-9]' test.txt
显示1个或者多个 e 的行
grep -n 'e*' test.txt
显示以 th开头的单词,并且不区分大小写的行
grep -in '\<th' test.txt
显示以 th结尾的单词,并且不区分大小写的行
grep -in 'th\>' test.txt
显示以 the 为单词的行
grep -n '\bthe\b' test.txt
显示以数字开头的行
grep -n '^[0-9]' test.txt
显示以数字结尾的行
grep -n '[0-9]$' test.txt
显示d后面跟大于2个e再跟一个p的行
grep -n 'de\{2,\}p' test.txt

或者

egrep -n 'de{2,}p' test.txt

注意: 逗号不能有空格

显示 th 后面跟 in 或者 e 的行
grep -E 'th(in|e)' test.txt
显示两个 the 包含的字符的行
grep -E '(the).*?\1' test.txt
显示 home 目录下所有目录
ls -lh /home | grep '^d'
显示 \a 的行
fgrep '\a' test.txt

说明: fgrep 是把任何的字符都当作普通的字符,如果使用 grep 来搜索,不会匹配 \a ,只会匹配 a

【上一篇】如何在 CentOS 6 的VPS上建立和使用 yum 仓库【翻译】

【下一篇】Linux下grep命令的12个例子【翻译】