从零开始学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]

常用参数

  1. -a  不忽略二进制的数据
  2. -A n (after) 显示符合模版的那一行之外,同时显示之后n的内容。
  3. -B n (before) 显示符合模版的一行之外,同时显示之前n行的内容
  4. -C n (context) 显示附和模版的一行之外,同时显示前后n行的内容
  5. -v 显示未匹配的行
  6. -i 忽略大小写
  7. -n 显示行号
  8. -o 只显示被模式匹配到的字符串
  9. -c 显示有多少行被统计到了 等价于使用wc -l。
  10. -r 循环搜索模式。对当前目录和子目录进行搜索。
  11. -d  read|skip|recurse 文件夹操作。默认操作是read,也就是grep会把文件夹和文件一样处理,但是这样报错。skip,也就是忽略文件夹,这样无法对子目录进行搜索。recurse,搜索子目录模式,等价于-r参数。
  12. -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:

  1. 参数支持组合使用比如:-inwo,忽略大小写显示行号只匹配单词并且只显示被匹配到的字符串。
  2. 一般为了不让机器负载过大。grep的数据都是tail后通过管道传递过来的。

退出状态码

0  一行或多行被匹配
1  没有匹配行
>1 错误退出

总结

grep的常用参数和我自己总结的一些技巧。还需要继续学习,fighting。