从零开始学shell之grep命令
前言
grep命令是我们在平时工作中经常使用的命令。grep全称是Global Regular Expression Print,表示全局正则表达式输出。grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
使用
命令格式
grep [option] pattern file
grep 可以使用 -v 否定模式。-A n显示搜索模版的后n行。然后是搜索模版,最后是文件名。文件名可以使用通配符,搜索多个文件。
参数 [option]
常用参数
- -a 不忽略二进制的数据
- -A n (after) 显示符合模版的那一行之外,同时显示之后n的内容。
- -B n (before) 显示符合模版的一行之外,同时显示之前n行的内容
- -C n (context) 显示附和模版的一行之外,同时显示前后n行的内容
- -v 显示未匹配的行
- -i 忽略大小写
- -n 显示行号
- -o 只显示被模式匹配到的字符串
- -c 显示有多少行被统计到了 等价于使用wc -l。
- -r 循环搜索模式。对当前目录和子目录进行搜索。
- -d read|skip|recurse 文件夹操作。默认操作是read,也就是grep会把文件夹和文件一样处理,但是这样报错。skip,也就是忽略文件夹,这样无法对子目录进行搜索。recurse,搜索子目录模式,等价于-r参数。
- -P Perl兼容模式。egrep是posix的兼容模式,这个很怪的。Java的正则表达式是Perl模式。
搜索结果的文件筛选
-l 包含匹配项的文件名会被显示
-L 不包含匹配项的文件名会被显示
--null 显示0字节大小的额文件名
搜索文件的筛选
--include [pattern] 符合条件的文件才会被搜索
--exclude [pattern] 符合条件的文件会被排除搜索
--include-dir [pattern] 符合条件的文件夹才会被搜索
--exclude-dir [pattern] 符合条件的文件夹会被排除搜索
ps:exclude的优先级比include高,exclude-dir同理。
提高性能的方法
如果不需要正则匹配可以使用fgrep,不经过正则匹配引擎,提高性能。另外可以通过--mmap 参数使用mmap函数代替read函数,读取输入。
命令家族
fgrep:快速grep命令,固定模式的字符串匹配,不支持正则表达式,所以速度快
egrep:扩展的正则表达式匹配,等同于grep -E。
zgrep:可以对gzip压缩的文件进行搜索
Ps:
- 参数支持组合使用比如:-inwo,忽略大小写显示行号只匹配单词并且只显示被匹配到的字符串。
- 一般为了不让机器负载过大。grep的数据都是tail后通过管道传递过来的。
退出状态码
0 一行或多行被匹配
1 没有匹配行
>1 错误退出
总结
grep的常用参数和我自己总结的一些技巧。还需要继续学习,fighting。