grep <Global search Regular Expression and Printout in line>:
在给出文件列表或标准输入之后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配的文本。
工作原理:
对输入(如文件、键盘)的每一行文本,grep命令进行如下操作:
1. 将改行文本读入相应的缓冲区,该缓冲区又被成为模式空间。
2. 对模式空间应用正则表达式进行对比。
3. 如果匹配,则改行信息从模式空间被复制到标准输出。
grep命令会对每一行文本重复以上3个步骤,其语法格式如下:
grep [选项] 字符模式 [文件名1,文件名2…]
grep在一个或多个文件(文件名1,文件名2….)中搜索字符模式。如果该模式包含空格,则必须加上引号。
与正则表达式:
正在表达式元字符集有两种版本:基本集和扩展集。grep的正则表达式元字符集使用的是基本集,egrep使用的是正则表达式元字符的扩展集。Linux中使用GNU版本的grep,可以通过-E、-F命令行选项来使用egrep和fgrep的功能。
Grep的正则表达式元字符集及说明如下表所示:
元字符 | 说明 | 例子 |
^ | 行首定位符,用于指定匹配字符串的头部 | ‘^grep’匹配所有以grep开头的行 |
$ | 行尾定位符,用于指定匹配字符串的尾部 | ‘grep$’匹配所有以grep结尾的行 |
. | 匹配任意一个字符 | ‘g..p’匹配所有第一个字符是g,紧跟两个字符,最后以p结尾的字符串 |
* | 匹配0个或多个前导字符 | ‘*grep’匹配所有一个或多个空格后紧跟grep的行 |
[] | 表示匹配指定范围内的其中一个字符 | ‘[Gg]rep’匹配Grep和grep |
[^] | 匹配不在指定范围内的字符 | ‘[^A-FH-Z]rep’匹配不包含A-F和H-Z的字母开头,后紧跟rep |
\< | 词首定位符 | ‘\<grep’匹配以grep开头的单词的行 |
\> | 词尾定位符 | ‘grep\>’ 匹配以grep结尾的单词的行 |
x\{m\} | 重复字符x,m次 | ‘o\{5\}’匹配包含5个o的行 |
x\{m,\} | 重复字符x,至少m次 | ‘o\{5,\}’匹配至少有5个o的行 |
x\{m,n\} | 重复字符x,至少m次,不多于n次 | ‘o\{5,10\}’匹配5~10个o的行 |
常用grep选项及功能说明
元字符 | 说明 |
-b | 在每行前打印字符偏移量(偏移的字符数) |
-c | 只打印匹配的总行数,不打印匹配内容 |
-n, --line-number | 在匹配的行前面打印行号 |
-V, --version | 显示软件版本信息 |
-v, --revert-match | 反索引,只显示不匹配的行 |
-i , --ignore-case | 忽略大小写差别 |
-h , --no-filename | 当搜索多个文件时,不显示匹配文件名前缀 |
-s , --silent | 不显示关于不存在或者无法读取文件的错误信息 |
-l , --files-with-matches | 打印匹配模板的文件清单(grep –l ‘include’ *.c) |
-L, --files-without-matches | 打印不匹配模板的文件清单(grep -L ‘include’ *.c) |
-w , --word-regexp | 使得grep只匹配按照单词方式匹配字符模式的行。(grep –m msg test.c) |
grep的退出状态
grep还可以用shell脚本,因为grep通过返回一个状态值来说明搜索的状态。如果模式搜索成功,则返回0;如果搜索不成功,则返回1;如果搜索的文件不存在,则返回2。利用这些返回值就可进行一些自动的文本处理工作。
eg: 在/etc/passwd文件中搜索“bbb”。如果没有找到,退出状态为1;如果找到退出状态为0;如果/etc/passwd不存在,退出状态为2.
> grep ‘bbb’ /etc/passwd
> echo $?
可打印返回值
egrep: 表示扩展grep (extend grep)
该命令执行效率比grep高,但需要占用较大内存空间,用于搜索更复杂的正则表达式。egrep与GNU grep 的-E选项相同,都能够使用正则表达式元字符的扩展集。
元字符 | 说明 |
+ | 匹配一个或多个先前的字符。eg: ’[a-z]+able’的字符串,匹配“loveable”、“enable”等。 |
array|banana|cle | 匹配‘array’或‘banana’或‘cle’。以单词为单位或。 |
fgrep:
该命令行语法格式和grep相似,但是它不识别任何正则表达式元字符,因为它搜索字符串而不是正则表达式的模式。fgrep命令使用快速压缩算法。与grep的-F选项相同。