用于

  • 查找文件里符合条件的字符串
  • 过滤标准输入符合条件的字符串

常用示例:

  1. #通过文件内容查询文件
  2. grep -rn "word" *
  3. grep -rn "word" /bin/bash

选项

帮助文档

grep -h
man grep

过滤

指定为正则

忽略大小写

  • -i
  • —ignore-case

需全单词匹配

  • -w
  • —word-regexp ```bash [bae:public-dev7-d /etc/nginx/conf.d]$ grep -w “we” *

[bae:public-dev7-d /etc/nginx/conf.d]$ grep -w “web” * kapi-web.conf: server_name kapi-web.bae.mofanglicai.com.cn; kapi-web.conf: root /home/bae/wwwroot/kapi-web/public;

  1. <a name="oIij3"></a>
  2. #### 需全行匹配
  3. - -x
  4. - --line-regexp
  5. <a name="uep3m"></a>
  6. #### 目录递归查找
  7. - -r
  8. - --recursive
  9. - -d recurse
  10. <a name="TUVaz"></a>
  11. #### 目录处理
  12. - -d<动作>
  13. - --directories=<动作>
  14. 动作列表
  15. - read 读取
  16. - recurse 递归
  17. - skip 跳过
  18. <a name="J745h"></a>
  19. ### 正则
  20. <a name="DfDqY"></a>
  21. #### 多个匹配项
  22. - -e<正则>
  23. - --regexp=<正则>
  24. grep -e 'good' -e 'bad' *<br />grep
  25. <a name="FZP0V"></a>
  26. #### 扩展正则
  27. - -E
  28. - --extended-regxp
  29. <a name="JxMQZ"></a>
  30. #### 正则文件
  31. - -f<规则文件>
  32. - --file=<规则文件>
  33. 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  34. <a name="VzzQO"></a>
  35. #### 非正则
  36. - -F
  37. - --fixed-regexp
  38. 相当于fgrep 命令,不能使用正则
  39. <a name="N2Nf9"></a>
  40. ### 非符合条件
  41. <a name="JizhM"></a>
  42. #### 不符合条件的行
  43. - -v
  44. - --invert-match
  45. <a name="Djlbg"></a>
  46. #### 不符合条件的文件名称列表
  47. - -L
  48. - --files-without-match
  49. ```bash
  50. [bae:public-dev7-d /etc/nginx/conf.d]$ grep -FL "web." *
  51. app.conf
  52. cms-api.conf
  53. data-api.conf
  54. git-hook.conf

格式化

文件名

不展示文件名

  • -h
  • —no-filename
  1. [bae:public-dev7-d /etc/nginx/conf.d]$ grep -h "web." *
  2. server_name kapi-web.bae.mofanglicai.com.cn;
  3. access_log /home/bae/wwwlogs/access.kapi-web.log access if=$loggable;
  4. error_log /home/bae/wwwlogs/error.kapi-web.log info;
  5. access_log /home/bae/wwwlogs/access.web.log access if=$loggable;
  6. error_log /home/bae/wwwlogs/error.web.log info;

展示文件名(默认)

  • -H
  • —with-filename
    1. [bae:public-dev7-d /etc/nginx/conf.d]$ grep -H "web." *
    2. kapi-web.conf: server_name kapi-web.bae.mofanglicai.com.cn;
    3. kapi-web.conf: access_log /home/bae/wwwlogs/access.kapi-web.log access if=$loggable;
    4. kapi-web.conf: error_log /home/bae/wwwlogs/error.kapi-web.log info;
    5. koudai-web.conf: access_log /home/bae/wwwlogs/access.web.log access if=$loggable;
    6. koudai-web.conf: error_log /home/bae/wwwlogs/error.web.log info;

文件列表

  • -l
  • —files-with-matches

所在行号

  • -n
  • —line-number
  1. [bae:public-dev7-d /etc/nginx/conf.d]$ grep -n "web." *
  2. kapi-web.conf:12: server_name kapi-web.bae.mofanglicai.com.cn;
  3. kapi-web.conf:14: root /home/bae/wwwroot/kapi-web/public;
  4. kapi-web.conf:54: access_log /home/bae/wwwlogs/access.kapi-web.

只展示符合条件的字符串

默认是展示符合提交的字符串所在的行字符串

  • -o
  • —only_matching
  1. [bae:public-dev7-d /etc/nginx/conf.d]$ grep -o "web." *
  2. kapi-web.conf:web.
  3. kapi-web.conf:web/
  4. kapi-web.conf:web.

不展示任何信息

  • -q
  • —quiet
  • —silent

通过 $? 获取执行结果 0 代表成功,有匹配,1代表失败,没有匹配到数据

上下文

  1. grep -A5 web *
  2. kapi-web.conf: server_name kapi-web.bae.mofanglicai.com.cn;
  3. kapi-web.conf- index index.html index.htm index.php;
  4. kapi-web.conf- root /home/bae/wwwroot/kapi-web/public;
  5. kapi-web.conf-
  6. kapi-web.conf- add_header 'Access-Control-Allow-Origin' "$http_origin";
  7. kapi-web.conf- add_header 'Access-Control-Allow-Credentials' 'true';

: 代表命中的行 -代表上下文行

上下文多少行

  • -C<行数>
  • —context=<行数>

上文多少行

  • -A<行数>
  • —after-context=<行数>

下文多少行

  • -B<行数>
  • —before-context=<行数>

统计

计算次数

以文件为单位计算符合字符串的次数

  • -c
  • —count
grep -c web *

kapi-web.conf:4
koudai-evolution-h5.conf:0
koudai-trade.conf:0
koudai-web.conf:3

正则

正则表达式
基本正则表达式: 默认匹配次数:贪婪模式,尽可能多的去匹配
1)元字符:
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符[0-9],[a-z],[abc]
[^] 匹配指定范围外的任意单个字符
2)字符集合:
纯数字 [[:digit:]]或[0-9]
小写字母 [[:lower:]]或[a-z] 大写字母 [[:upper:]]或[A-Z]
大小写字母 [[:alpha:]]或[a-zA-Z] 数字加字母 [[:alnum:]]或[0-9a-zA-Z]
空白字符 [[:space:]] 非空白字符[^[:space:]]
标点符号 [[:punct:]]
【可以通过man tr查询这些字符集合】
3)匹配次数(贪婪模式):
匹配其前面的字符任意次【0次或多次】
.
任意长度的任意字符
. 表示.本身 \逃逸符
\? 匹配其前面的字符0次或1次
x{m} 匹配其前面的字符“x”m次(精确匹配)
x{m,} 匹配其前面的字符“x”至少m次 【{1,} 至少一次,多了不限】
x{m,n}:匹配其前面的字符“x”至少m次,至多n次 【{0,3} 最多3次,少了不限】
4)位置锚定:
^ 锚定行首,此字符后面的任意内容必须出现在行首 【# grep ‘^r..t’ /etc/passwd】
$ 锚定行尾,此字符前面的任意内容必须出现在行尾【# grep ‘login$’ /etc/passwd】
^$ 空白行【# grep ‘^$’ /etc/inittab 】
\<或\b 锚定词首,其后面的任意字符必须作为”单词的”首部出现 【# grep “\\>或\b 锚定**词尾**,其前面的任意字符必须作为"单词的"尾部出现【# grep "root\>“ test2.txt】
\或\bxxx\b 锚定单词例如 \
5)分组: \(\) 后向引用
\(ab\)# grep “\(b\)“ test.txt
\1 引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 引用第二个左括号以及与之对应的右括号所包括的所有内容
\3 引用第三个左括号以及与之对应的右括号所包括的所有内容

扩展正则表达式:
+ 匹配其前面的字符至少1次 类似:{1,}
? 匹配紧挨在其前面的字符0次或1次 类似:\? 【不需要下斜线 \?】
{m,n} 匹配前面字符至少m次至多n次 {1,}表示1至无限 {0,3}表示0-3 【不需要下斜线 {}】
() 分组 \1, \2, \3, … 【不需要下斜线 】
| 或者 【C|cat: C或cat # grep -E “C|cat” test4.txt 】 (C|c)at: Cat或cat# grep -E “(C|c)at” test4.txt
注意:对于 \<或\b >或\b 使用扩展正则也不能去掉 \
* 注意正则表达式和扩展正则表达式的区别
5、常用示例
示例1:*
1、以数字结尾
# grep”[[:digit:]]$” /etc/rc.sysinit # grep”[0-9]$” /etc/rc.sysinit
2、以数字结尾,前面有一个或多个空白字符
# grep”[[:space:]][0-9]$” /etc/rc.sysinit # grep”[[:space:]]{1,}[0-9]$” /etc/rc.sysinit # grep-E “[[:space:]]+[0-9]$” /etc/rc.sysinit
3、以数字结尾,之前的内容中有一个空格或多个空格
# grep”[[:space:]]{1,}.
[0-9]$” /etc/rc.sysinit # grep-E “[[:space:]]+.*[0-9]$” /etc/rc.sysinit