grep命令

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行
示例
  • 准备文本文件app.txt
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
  • -e

在不同文件中查找 “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
  • -f

-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

使用-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
  • -v

输出 app.txt 文件中不包含 “java” 字符的行

1
2
3
$ grep -v java app.txt
i love JAVA
I LOVE JAVA
  • -i

使用-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

使用-n选项,则匹配到的行的内容,前面会加上对应的行号

1
2
3
$ grep -n java app.txt
1:i love java
4:i lovelove java
  • -E

使用-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

使用-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

使用-l参数,输出包含”vagrant”字符的文件名

1
2
3
$ grep -l vagrant /etc/passwd /etc/shadow app.txt
/etc/passwd
/etc/shadow
  • -o

使用-o参数,只显示匹配 LOVE 字符

1
2
$ grep -o -n LOVE app.txt
3:LOVE
  • -C

使用-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