文本三剑客之grep
用法简介:
1 | grep [OPTIONS] PATTERN [FILE...] |
PATTERN 可以是普通字符串或正则表达式(取决于选项)。若省略 FILE,则从标准输入读取。
常用选项说明:
1 | -E # 使用扩展正则表达式(等同 egrep) |
常见示例与说明:
在文件中查找字符串(精确匹配子串):
1
grep 'root' /etc/passwd
忽略大小写:
1
grep -i 'error' /var/log/syslog
显示行号:
1
grep -n 'TODO' src/*.c
反选(不包含该模式的行):
1
grep -v '^#' file.conf # 去除注释行
只输出匹配到的部分:
1
grep -o -E '[0-9]{4}-[0-9]{2}-[0-9]{2}' logfile
计数匹配行数:
1
grep -c 'pattern' files/*
列出包含匹配的文件名:
1
grep -l 'main' -R .
列出不包含匹配的文件名:
1
grep -L 'TODO' -R .
上下文显示(行号 + 上下文):
1
2grep -n -C 2 'exception' app.log # 每个匹配显示前后2行
grep -A 3 'start' script.sh # 显示匹配行及其后3行使用扩展正则表达式(|、+、?、()):
1
grep -E 'error|warning' /var/log/syslog
使用固定字符串搜索(更快,禁用正则解析):
1
grep -F 'a+b' file.txt
使用 PCRE(高级正则特性,如前瞻):
1
grep -P '(?<=id=)\d+' file
注意:并非所有系统的 grep 都支持 -P。
与 find / xargs 组合(递归并过滤文件名):
1
2
3find . -name '*.log' -print0 | xargs -0 grep -H 'ERROR'
# 或者使用 --include/--exclude:
grep -R --include='*.py' 'def ' .在二进制文件中搜索时避免”Binary file matches”提示:
1
grep --binary-files=text 'pattern' *
进阶与性能提示:
- 对于大规模代码库或日志,考虑使用专门工具(ripgrep rg、The Silver Searcher ag)以获得更好性能。
- 使用 -F(固定字符串)比正则快;避免未必要的正则分组或回溯。
- 对于多模式搜索,使用 -E 将多个模式合并比多次调用 grep 更高效。
- 使用 –exclude-dir、–include 控制递归时的搜索范围,减少 I/O。
常见正则片段:
- 匹配邮箱(简单示例):[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}
- 匹配 IPv4(简化):([0-9]{1,3}.){3}[0-9]{1,3}
- 匹配日期 YYYY-MM-DD:\b[0-9]{4}-[0-9]{2}-[0-9]{2}\b
小结示例集:
1 | # 在 /etc 中搜索包含 root 的文件,并显示文件名与行号 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Kymlin's Blog!
评论


