运维人的宝藏命令:fgrep,简单粗暴但好用到哭
不管搜什么,一搜就用grep,一搜就用正则,遇到 .*[] 还要疯狂转义,大文件一卡半天,搜个固定字符串却绕了大弯。
今天聊一个被严重低估的命令:fgrep。它不是小众玩具,而是 grep 家族里最快、最稳、最省心的那一个 ,专门用来搜固定字符。学会它你又多掌握一个命令,多学个命令就多一种方法。
一、fgrep含义
fgrep=fixed-string grep(固定字符串匹配)等价于grep -F。它和普通grep 最核心的区别只有一句:fgrep不解析任何正则,所有字符都按原文匹配。
你搜 .它就真的搜 .;你搜 *,它就真的搜 *;你搜 [a-z],它就真的搜 [a-z]不用转义、不用顾虑、不会误匹配。
二、fgrep比grep优势
1.超快:大文件多关键词,速度明显更快
fgrep 使用专门的多模式匹配算法(Aho-Corasick),不跑正则引擎、不做回溯,在大日志、大文本里搜固定串,速度经常比普通grep加正则转义快很多。你搜 10 个关键词,100 万行日志:grep 要一条条正则判断,而fgrep 直接明文匹配。
2.超稳:特殊字符不用转义
这是 fgrep 日常最实用的点。下面以搜ip:192.168.1.1为例子来进行演示
grep直接搜索地址
grep "192.168.2.104" 123.txt
grep默认=grep -G = BRE(基础正则),“.” 在 BRE里=元字符 = 匹配任意一个字符,所以直接搜索ip地址可能会出现错误,需要进行转义。
grep "192\.168\.2\.104" 123.txt
用fgrep:
fgrep "192.168.2.104" 123.txt
3.超准:只匹配你写的,不会意外命中
grep一不小心就因为 .* 匹配到不该匹配的内容。fgrep完全不存在:写什么,搜什么,匹配什么。
三、常用的6种fgrep用法
1.基础搜索
fgrep "root=/dev/mapper/centos-root" messages-20260416
对于路径这种使用grep需要转义的搜索,使用fgrep命令能够快速搜索出结果。
fgrep "" messages-20260416
2.忽略大小写
fgrep -i "root_image=/vmlinuz-3.10.0-957.el7.x86_64" messages-20260416
3.只输出匹配行号
fgrep -n "BOOT_IMAGE=/vmlinuz-3.10.0-957.el7.x86_64" messages-20260416
4.反向匹配
fgrep -v error messages-20260416
搜索文件里不包含error的行。
5.只匹配整个单词
fgrep -w "root" /etc/passwd
搜索文件里root的整单词。
6.从文件读取关键词
把要搜的串一行一个放keys.txt
error
warn
timeout
connection refused
批量搜索:
fgrep -f keys.txt app.log
四、什么时候必须用fgrep?
fgrep整体比较简单,如果遇到满足下面任意一条,建议优先用 fgrep:
你要搜的是固定字符串(ip、路径、错误信息、日志关键词),不想转义,写正则;
文本里包含 . * + ? [ ] ( ) | 等正则敏感符号;文件很大、行数很多(提速明显);
一句话:搜明文=fgrep;搜规则 = grep -E
五、别混淆:一张图分清 grep/egrep/fgrep
六、总结
1. 别再把fgrep当成弱鸡命令
很多人以为 fgrep 功能少、只能简单搜词,其实它支持绝大多数常用参数:
-i 忽略大小写
-v 反选
-n 显示行号
-c 统计行数
-l 只显示文件名
-f 批量匹配。
参数用法跟 grep 几乎完全一样,只是关闭了正则解析,搜索更纯粹、更快。
2.一个小提醒:fgrep不支持正则
如果你需要:
匹配多个关键词:error|warn|fail匹配数字范围:[0-9]+\.[0-9]+模糊规则:^root|^docker使用grep -E 或egrep例如:grep -E 'error|warn'
fgrep 做不到,也不应该去做—— 术业有专攻。其实日常运维50%的场景,其实都是在搜固定字符串,fgrep 才是那个被低估、但最实用的神器。
七、命令记忆总结
fgrep = 搜明文、不玩正则;优点:快、稳、不用转义;最佳场景:IP、路径、日志关键词、批量关键词和正则敏感的字符。记忆口诀:搜规则用 grep -E,搜明文用 fgrep(grep -F)在大多数现代Linux发行版中,fgrep是grep -F的别名或等效命令。两者可互换使用,但了解其含义能帮你做出最佳选择。
下次搜日志、查配置、过滤文本,别再硬写转义了。试试 fgrep,你会回来感谢这一行命令。
留言评论