grep 命令
介绍
Linux grep命令用于查找文件里符合条件的字符串。
语法格式
1
| $ grep [option][pattern][file1,file2]
|
1
| $ command | grep [option][pattern]
|
参数([option])
选项 |
含义 |
-v |
不显示匹配行信息 |
-i |
搜索时忽略大小写 |
-e |
指定字符串做为查找文件内容的样式 |
-E |
支持扩展正则表达式 |
-f |
指定规则文件,其内容含有一个或多个规则样式,按照规则文件查找 |
-F |
不按正则表达式匹配,将样式视为固定字符串的列表 |
-n |
显示行 |
-o |
只显示匹配PATTERN 部分 |
-r |
递归搜索 |
-c |
只显示匹配行的总数 |
-w |
匹配整词 |
-l |
只显示文件名,不显示内容 |
-s |
不显示错误信息 |
-A n |
输出匹配行的后n行 |
-B n |
输出匹配行的前n行 |
-C n |
输出匹配行的前后n行 |
示例
1 2 3 4
| i love java i love JAVA I LOVE JAVA i lovelove java
|
在app.txt文件中查找字符 “java”
1 2 3
| $ grep java app.txt i love java i lovelove java
|
在不同文件中查找 “java” 和 “root” 字符,使用-e参数,我们可以查找多个模式。
1 2 3 4 5
| $ grep -e "java" app.txt -e "root" /etc/passwd app.txt:i love java app.txt:i lovelove java /etc/passwd:root:x:0:0:root:/root:/bin/bash /etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
|
匹配/etc/passwd文件中以nologin字符结尾的行
1 2 3 4 5 6
| $ grep "nologin$" /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin
|
-e 选项中我们指定了两个-e选项,一个是 -e “java” 另外一个是 -e “root” 我们可以把这个两个搜索的词,写到一个文件中,按照文件中定义的模式进行搜索
定义文件 grep_file_pattern
1 2 3 4 5
| # 匹配以root开头的行、以nologin结尾的行、包含vagrant字符的行 $ cat grep_file_pattern ^root nologin$ vagrant
|
使用 grep_file_pattern 文件进行搜索
1 2 3 4 5 6 7 8
| $ grep -f grep_file_pattern /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash
|
使用-F”选项,则查找的字符当做普通字符来处理,比如:”^i” 如果不加-F选项,则匹配到包含ja的字符行,加了-F选项,只匹配 “^i” 的字符
1 2 3 4 5 6 7
| # 不加-F选项,匹配以 i 开头的行 $ grep "^i" app.txt i love java i love JAVA i lovelove java # 加-F选项,匹配包含字符 "^i" 的行,输出结果为空 $ grep -F "^i" app.txt
|
输出 app.txt 文件中不包含 “java” 字符的行
1 2 3
| $ grep -v java app.txt i love JAVA I LOVE JAVA
|
使用-i选项,则忽略匹配字符的大小写,java或JAVA字符都能匹配到
1 2 3 4 5
| $ grep -i java app.txt i love java i love JAVA I LOVE JAVA i lovelove java
|
使用-n选项,则匹配到的行的内容,前面会加上对应的行号
1 2 3
| $ grep -n java app.txt 1:i love java 4:i lovelove java
|
使用-E选项,支持 | 等的扩展表达式,意思是匹配包含java或者JAVA字符的行,如果不加-E选项,则 “java|JAVA” 就看作一个整体的字符来处理
1 2 3 4 5 6 7 8
| # 加-E选项 $ grep -E "java|JAVA" app.txt i love java i love JAVA I LOVE JAVA i lovelove java # 不加-E选项,输出结果为空 $ grep "java|JAVA" app.txt
|
使用-r参数,递归/etc/目录下包含 “vagrant”字符的行
1 2 3 4 5 6
| $ grep -r vagrant /etc/ /etc/group:vagrant:x:1000:vagrant /etc/sudoers.d/vagrant:%vagrant ALL=(ALL) NOPASSWD: ALL /etc/passwd-:vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash /etc/gshadow:vagrant:!!::vagrant /etc/gshadow:docker:!::vagrant
|
使用-l参数,输出包含”vagrant”字符的文件名
1 2 3
| $ grep -l vagrant /etc/passwd /etc/shadow app.txt /etc/passwd /etc/shadow
|
使用-o参数,只显示匹配 LOVE 字符
1 2
| $ grep -o -n LOVE app.txt 3:LOVE
|
使用-C参数,输出匹字符”dbus”行的前后 2 行
1 2 3 4 5 6
| $ grep -C 2 dbus /etc/passwd nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
|
1
| $ grep ^$ /data/log/nginx.log
|