grep
是 Linux 系统中一个功能非常强大的文本搜索工具,用于从输入中筛选出符合特定模式的文本行。grep
支持正则表达式,是日常开发与运维工作中不可或缺的命令之一。
grep [选项] '搜索模式' [文件...]
'搜索模式'
:可以是普通文本或正则表达式文件
:要查找的目标文件,可以是多个;若不指定则默认从标准输入读取grep 'error' /var/log/syslog
解释:列出 /var/log/syslog
文件中所有包含 “error” 的行。
tail -f /var/log/syslog | grep 'network'
解释:实时查看日志中包含 “network” 的条目,非常适用于调试网络问题。
选项 | 含义 |
---|---|
-i |
忽略大小写 |
-v |
反向匹配(显示不匹配的行) |
-n |
显示匹配行的行号 |
-r 或 -R |
递归搜索目录 |
-l |
只列出匹配的文件名 |
-c |
仅显示匹配的行数 |
-o |
仅输出匹配的部分 |
-E |
使用扩展正则表达式(相当于使用 egrep ) |
grep -i 'error' log.txt
输出会包含 “Error”、“ERROR”、“error” 等形式。
grep -l 'TODO' *.py
列出所有包含 “TODO” 的 Python 文件名。
grep -n 'failed' /var/log/auth.log
输出格式为:行号:匹配内容
。
grep 'Listen' /etc/httpd/conf/httpd.conf
输出:
Listen 80
Listen 443
解释:列出 Apache 配置文件中定义监听端口的行。
grep -c 'timeout' /var/log/app.log
输出:
12
解释:说明 timeout
出现了 12 次。
grep -r 'main' .
输出示例:
./main.c:int main() {
./utils/helper.c:void main_loop() {
解释:遍历当前目录及子目录,查找含 “main” 的行,并显示其文件路径。
grep -Eo '192\.[0-9]+\.[0-9]+\.[0-9]+' access.log
输出:
192.168.1.1
192.0.2.5
解释:使用正则匹配 IP 地址,仅输出匹配的部分。
find
结合,递归过滤文件内容find . -name "*.log" -exec grep 'OutOfMemory' {} \;
解释:查找当前目录下所有 .log
文件中包含 “OutOfMemory” 的行。
dmesg | grep -i usb | wc -l
解释:统计内核信息中关于 “usb” 的日志条数。
grep --color=auto 'ssh' /var/log/auth.log
grep -A 2 -B 2 'ERROR' app.log
-A 2
:显示匹配行后两行-B 2
:显示匹配行前两行grep
没有返回预期的结果?可能原因:大小写不一致
解决方案:使用 -i
忽略大小写
grep -i 'keyword' file.txt
解决方案:确认文件编码使用 file
命令
file filename
必要时转换编码:
iconv -f gbk -t utf-8 file.txt -o newfile.txt
解决方案:使用 -E
或 egrep
,正则表达式 pattern1|pattern2
grep -E 'error|fail' log.txt
grep
是 Linux 中文本处理最常用的工具之一,适用于:
-i
以避免大小写问题tail
、cat
、less
、find
使用效果更佳grep
效率-r
和 --color=auto
提高可读性掌握 grep
,就是掌握了处理文本数据的“放大镜”和“筛子”,是 Linux 用户不可或缺的必备技能!