前言:这个命令你必须会!
(重要的事情说三遍)Linux工程师的命根子是文本处理!文本处理!文本处理!!!而grep就是这命根子的核心武器。今天咱们不整虚的,直接上硬核实战技巧,保证你学完就能用,用了就停不下来~
一、基础篇:这些用法你肯定见过(但可能用错了)
1.1 基本搜索姿势
grep "error" app.log
这谁不会啊?但90%的人不知道:双引号在搜索带空格的内容时是必须的! 比如grep "fatal error"
才能正确匹配,否则会搜出所有包含fatal或error的行(惊不惊喜?)
1.2 必须掌握的四大金刚参数
-i
(忽略大小写):grep -i "warning"
连WaRnInG都能抓到-v
(反向选择):grep -v "success"
专治各种成功案例(找失败日志神器)-n
(显示行号):grep -n "login"
精准定位到代码行-c
(统计次数):grep -c "404"
快速统计接口错误次数
(偷偷说:把这四个参数组合使用效果更炸裂!比如grep -incv
组合拳)
二、进阶篇:正则表达式骚操作
2.1 通配符的正确打开方式
.
匹配任意字符:grep "192.168..1"
找局域网IP*
重复前字符:grep "goo*gle"
连gooooooogle都不放过[]
字符集合:grep "[Tt]est"
大小写通吃
2.2 精准定位必杀技
^
开头锚定:grep "^2023"
抓取今年日志$
结尾锚定:grep "error$"
行尾有error的才匹配\b
单词边界:grep "\berror\b"
精准匹配单词(避免匹配到error404这种)
(实战案例:grep "^[A-Za-z].*ing$" novel.txt
找以字母开头、ing结尾的句子,写英文小说必备!)
三、高阶玩法:当grep遇到管道
3.1 组合技示范
ps aux | grep nginx | grep -v grep | awk '{print $2}'
这个经典组合:
- 列出所有进程
- 过滤nginx相关
- 排除grep自身
- 提取进程ID
(亲测有效!杀进程不用再记pid了)
3.2 日志分析三板斧
cat app.log | grep "ERROR" | cut -d' ' -f3- | sort | uniq -c | sort -nr
分解动作:
- 过滤错误日志
- 截取关键信息
- 排序统计
- 按出现次数倒序
(用这招找高频错误,运维小哥直呼内行!)
四、实战中的骚操作
4.1 递归搜索全家桶
grep -r "TODO" /project --include=*.{java,py}
-r
递归搜索--include
指定文件类型--exclude
排除测试文件
(程序员摸鱼神器:统计项目里还有多少TODO没写)
4.2 二进制文件也不怕
grep -a "magic string" binary_file
-a
参数让grep把二进制当文本处理(找编译后的字符串彩蛋专用)
4.3 上下文关联搜索
grep -C 3 "core dumped" system.log
-C 3
显示匹配行的前后3行-B 2
前两行-A 1
后一行
(看报错再也不怕找不到上下文了!)
五、避坑指南(血泪教训)
5.1 正则表达式陷阱
- 特殊字符记得转义:
grep "3\.14"
匹配小数 - 不要用
.*
过度匹配:grep "^start.*end$"
可能匹配整段内容
5.2 性能优化技巧
- 大文件搜索先用
-m 100
限制匹配次数 - 复杂正则表达式先用小文件测试
- 避免在循环中调用grep(改用xargs)
六、冷知识:grep的隐藏技能
6.1 彩色输出
alias grep='grep --color=auto'
(永久生效就写入~/.bashrc,终端立马变彩虹)
6.2 同时搜索多个模式
grep -e "error" -e "warning" app.log
或者用|
符号:
grep "error\|warning" app.log
6.3 快速文件列表
grep -rl "config" /etc
-l
参数只显示包含匹配的文件名(找配置文件位置超方便)
结语:你的搜索武器库升级了吗?
grep就像瑞士军刀,看起来简单,实际深不可测。记得上次我用grep -P '\d{2,}'
处理复杂数字匹配时(-P启用Perl正则),隔壁同事都惊了:原来grep还能这么玩?!
(最后送个彩蛋:试试grep --help | grep -i color
,你会发现新大陆~)