用于
- 查找文件里符合条件的字符串
- 过滤标准输入符合条件的字符串
常用示例:
#通过文件内容查询文件grep -rn "word" *grep -rn "word" /bin/bash
选项
帮助文档
过滤
指定为正则
忽略大小写
- -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;
<a name="oIij3"></a>#### 需全行匹配- -x- --line-regexp<a name="uep3m"></a>#### 目录递归查找- -r- --recursive- -d recurse<a name="TUVaz"></a>#### 目录处理- -d<动作>- --directories=<动作>动作列表- read 读取- recurse 递归- skip 跳过<a name="J745h"></a>### 正则<a name="DfDqY"></a>#### 多个匹配项- -e<正则>- --regexp=<正则>grep -e 'good' -e 'bad' *<br />grep<a name="FZP0V"></a>#### 扩展正则- -E- --extended-regxp<a name="JxMQZ"></a>#### 正则文件- -f<规则文件>- --file=<规则文件>指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。<a name="VzzQO"></a>#### 非正则- -F- --fixed-regexp相当于fgrep 命令,不能使用正则<a name="N2Nf9"></a>### 非符合条件<a name="JizhM"></a>#### 不符合条件的行- -v- --invert-match<a name="Djlbg"></a>#### 不符合条件的文件名称列表- -L- --files-without-match```bash[bae:public-dev7-d /etc/nginx/conf.d]$ grep -FL "web." *app.confcms-api.confdata-api.confgit-hook.conf
格式化
文件名
不展示文件名
- -h
- —no-filename
[bae:public-dev7-d /etc/nginx/conf.d]$ grep -h "web." *server_name kapi-web.bae.mofanglicai.com.cn;access_log /home/bae/wwwlogs/access.kapi-web.log access if=$loggable;error_log /home/bae/wwwlogs/error.kapi-web.log info;access_log /home/bae/wwwlogs/access.web.log access if=$loggable;error_log /home/bae/wwwlogs/error.web.log info;
展示文件名(默认)
- -H
- —with-filename
[bae:public-dev7-d /etc/nginx/conf.d]$ grep -H "web." *kapi-web.conf: server_name kapi-web.bae.mofanglicai.com.cn;kapi-web.conf: access_log /home/bae/wwwlogs/access.kapi-web.log access if=$loggable;kapi-web.conf: error_log /home/bae/wwwlogs/error.kapi-web.log info;koudai-web.conf: access_log /home/bae/wwwlogs/access.web.log access if=$loggable;koudai-web.conf: error_log /home/bae/wwwlogs/error.web.log info;
文件列表
- -l
- —files-with-matches
所在行号
- -n
- —line-number
[bae:public-dev7-d /etc/nginx/conf.d]$ grep -n "web." *kapi-web.conf:12: server_name kapi-web.bae.mofanglicai.com.cn;kapi-web.conf:14: root /home/bae/wwwroot/kapi-web/public;kapi-web.conf:54: access_log /home/bae/wwwlogs/access.kapi-web.
只展示符合条件的字符串
默认是展示符合提交的字符串所在的行字符串
- -o
- —only_matching
[bae:public-dev7-d /etc/nginx/conf.d]$ grep -o "web." *kapi-web.conf:web.kapi-web.conf:web/kapi-web.conf:web.
不展示任何信息
- -q
- —quiet
- —silent
通过 $? 获取执行结果 0 代表成功,有匹配,1代表失败,没有匹配到数据
上下文
grep -A5 web *kapi-web.conf: server_name kapi-web.bae.mofanglicai.com.cn;kapi-web.conf- index index.html index.htm index.php;kapi-web.conf- root /home/bae/wwwroot/kapi-web/public;kapi-web.conf-kapi-web.conf- add_header 'Access-Control-Allow-Origin' "$http_origin";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 “\
\
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
