grep 是 Linux 下最常用的文本搜索命令,经常结合管道符 | 使用——即在前面命令的执行结果中查找包含指定字符串的内容。
基础用法:结合管道过滤
ps -ef 列出进程很多,用 grep 过滤出 redis 相关进程:
$ ps -ef | grep redis
root 10748 10733 0 21:14 pts/21 00:00:00 redis-server *:6379
root 10754 10733 0 21:14 pts/21 00:00:00 grep --color=auto redis
排除包含 auto 的结果,用 -v:
$ ps -ef | grep redis | grep -v auto
root 10748 10733 0 21:14 pts/21 00:00:00 redis-server *:6379
统计结果数量,用 -c:
$ ps -ef | grep redis -c
2
在指定文件中查找关键字
$ grep "test" aaa/bbb/linux_command_debug.md
int test(int a,int b)
test(a,b);
显示行号,用 -n:
$ grep -n "test" aaa/bbb/linux_command_debug.md
18:int test(int a,int b)
27: test(a,b);
指定或排除文件
搜索所有 .md 文件:
$ grep -n "test" *.md
排除 .txt 文件:
$ grep -rn "test" --exclude=*.txt
排除条件较多时,写入文件 skip.txt:
*.txt
test.md
$ grep -rn "test" --exclude-from=skip.txt
排除指定目录,用 --exclude-dir:
$ grep -rn "test" --exclude-dir=aaa
查找包含指定关键字的文件
在当前目录下递归查找包含 int main(void) 的文件:
$ grep -rn "int main(void)"
aaa/bbb/c_main_func.md:49:int main(void)
aaa/bbb/c_array.md:104:int main(void)
只显示文件名,用 -l:
$ grep -rln "int main(void)"
aaa/bbb/c_main_func.md
aaa/bbb/c_array.md
aaa/bbb/pc-lint.md
查找不包含指定关键字的文件,用 -L:
$ grep -rLn "int main(void)"
注意:不带
-r参数时 grep 会暂停等待控制台输入,使用时要记得带上相关参数。
忽略大小写
用 -i(--ignore-case):
$ grep -rni "int MAIN(void)"
aaa/bbb/c_main_func.md:49:int main(void)
显示不包含关键字的行
用 -v:
$ grep -rnv "int main(void)"
显示关键字前后内容
用 -A(after)和 -B(before)显示前后 N 行,日志分析时非常有用:
$ grep -rn "int main(void)" -A 1 -B 1
aaa/bbb/c_array.md-103-}
aaa/bbb/c_array.md:104:int main(void)
aaa/bbb/c_array.md-105-{
指定规则文件搜索
多个关键字写入 key.txt:
int main(void)
test
$ cat filename | grep -f key.txt
正则表达式搜索
grep 支持正则,例如查找以 t 开头、以 t 结尾的行:
$ grep -rn ^t.*t$
key.txt:2:test
其中 ^t 表示以 t 开头,t$ 表示以 t 结尾。需要扩展正则可用 egrep。
常用参数速查
| 参数 | 作用 |
|---|---|
-v |
显示不包含匹配关键字的行 |
-l |
显示包含匹配关键字的文件 |
-L |
显示不包含匹配关键字的文件 |
-r |
递归搜索 |
-i |
忽略大小写 |
-n |
显示关键字所在行号 |
-A n |
显示关键字后 n 行 |
-B n |
显示关键字前 n 行 |
-c |
统计匹配数量 |
--exclude |
排除某些文件 |
--exclude-dir |
排除某些目录 |
-f |
指定规则文件 |