Grep 例程大全

Grep 例程大全

📚 Grep 基础语法

复制代码
grep [选项] 模式 [文件...]
grep [选项] -e 模式1 -e 模式2 [文件...]
grep [选项] -f 模式文件 [文件...]

🔧 常用选项

选项 说明
-i 忽略大小写
-v 反向匹配(显示不匹配的行)
-n 显示行号
-c 统计匹配行数
-l 只显示包含匹配的文件名
-L 只显示不包含匹配的文件名
-h 不显示文件名(多文件时)
-H 总是显示文件名
-r 递归搜索目录
-R -r,但跟踪符号链接
-w 匹配整个单词
-x 匹配整行
-o 只输出匹配的部分
-q 静默模式(不输出)
-s 不显示错误信息
-E 使用扩展正则表达式
-F 固定字符串(禁用正则)
-P Perl正则表达式(功能最强)
-A n 显示匹配行及后n行
-B n 显示匹配行及前n行
-C n 显示匹配行及前后各n行
--color 高亮显示匹配部分

🔍 基础搜索

1. 简单文本搜索

复制代码
# 基本搜索
grep "pattern" file.txt

# 多个文件
grep "pattern" file1.txt file2.txt

# 当前目录所有txt文件
grep "pattern" *.txt

# 忽略大小写
grep -i "pattern" file.txt

# 显示行号
grep -n "pattern" file.txt

2. 递归搜索

复制代码
# 递归搜索当前目录
grep -r "pattern" .

# 递归搜索,只显示文件名
grep -rl "pattern" .

# 递归搜索特定类型文件
grep -r "pattern" --include="*.py" .
grep -r "pattern" --include="*.{py,js}" .

# 排除某些目录
grep -r "pattern" --exclude-dir={.git,node_modules} .
grep -r "pattern" --exclude-dir=.git --exclude-dir=node_modules .

📝 模式匹配

1. 基本正则表达式

复制代码
# 任意单个字符
grep "a.b" file.txt      # a后跟任意字符再跟b

# 行首
grep "^start" file.txt

# 行尾
grep "end$" file.txt

# 空行
grep "^$" file.txt

# 包含空格的行
grep "[[:space:]]" file.txt

# 数字
grep "[0-9]" file.txt
grep "[[:digit:]]" file.txt

# 字母
grep "[a-zA-Z]" file.txt
grep "[[:alpha:]]" file.txt

# 单词字符(字母、数字、下划线)
grep "[[:alnum:]_]" file.txt
grep "\w" file.txt      # 需要 -P 或 -E

2. 扩展正则表达式(-E)

复制代码
# 使用扩展正则
grep -E "pattern1|pattern2" file.txt
grep -E "(abc|def)" file.txt

# 量词
grep -E "a{3}" file.txt      # 3个a
grep -E "a{3,5}" file.txt    # 3-5个a
grep -E "a{3,}" file.txt     # 至少3个a
grep -E "a+" file.txt        # 1个或多个a
grep -E "a*" file.txt        # 0个或多个a
grep -E "a?" file.txt        # 0个或1个a

# 分组
grep -E "(abc)+" file.txt    # abc出现一次或多次

3. Perl正则表达式(-P)

复制代码
# 使用Perl正则(功能最强)
grep -P "\d+" file.txt         # 数字
grep -P "\s+" file.txt         # 空白字符
grep -P "\w+" file.txt         # 单词字符
grep -P "\bword\b" file.txt    # 单词边界

# 非贪婪匹配
grep -P "a.*?b" file.txt       # 匹配最短的a...b

# 向前向后查找
grep -P "abc(?=def)" file.txt  # 匹配后面是def的abc
grep -P "(?<=abc)def" file.txt # 匹配前面是abc的def
grep -P "abc(?!def)" file.txt  # 匹配后面不是def的abc
grep -P "(?<!abc)def" file.txt # 匹配前面不是abc的def

🎯 精确匹配

1. 单词匹配

复制代码
# 全单词匹配(-w)
grep -w "word" file.txt        # 匹配 "word",不匹配 "words"
grep -w "is" file.txt          # 匹配 "is",不匹配 "this"

# 整行匹配(-x)
grep -x "exact line" file.txt  # 只匹配完全相同的行

2. 固定字符串(-F)

复制代码
# 禁用正则,按字面搜索
grep -F "a.b" file.txt         # 搜索 "a.b",不把 . 当通配符
grep -F ".*" file.txt          # 搜索 ".*",不匹配任意字符

# 搜索特殊字符
grep -F "$PATH" file.txt       # 搜索 "$PATH"
grep -F "[test]" file.txt      # 搜索 "[test]"

📊 上下文显示

1. 显示上下文

复制代码
# 显示匹配行及后2行
grep -A 2 "pattern" file.txt

# 显示匹配行及前2行
grep -B 2 "pattern" file.txt

# 显示匹配行及前后各2行
grep -C 2 "pattern" file.txt

# 组合使用
grep -A 1 -B 1 "pattern" file.txt  # 前后各1行

# 带行号
grep -n -C 2 "pattern" file.txt

2. 只显示匹配部分

复制代码
# 只输出匹配的部分(-o)
grep -o "pattern" file.txt

# 统计每个匹配的数量
grep -o "pattern" file.txt | wc -l

# 提取IP地址
grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt

# 提取邮箱
grep -o -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt

🔄 组合使用

1. 管道组合

复制代码
# 统计出现频率
grep -o "pattern" file.txt | sort | uniq -c | sort -nr

# 过滤ps输出
ps aux | grep "python" | grep -v "grep"

# 搜索压缩文件
zgrep "pattern" file.gz
bzcat file.bz2 | grep "pattern"

# 多级过滤
grep "error" log.txt | grep -v "warning" | grep -n "fatal"

2. 多模式匹配

复制代码
# 使用 -e 指定多个模式
grep -e "pattern1" -e "pattern2" file.txt

# 使用 -f 从文件读取模式
grep -f patterns.txt file.txt

# 同时使用多个选项
grep -rin "error" --include="*.log" .

📈 统计和过滤

1. 统计功能

复制代码
# 统计匹配行数
grep -c "pattern" file.txt

# 统计多个文件的匹配总数
grep -c "pattern" *.txt

# 统计匹配次数(-o配合wc)
grep -o "pattern" file.txt | wc -l

# 显示匹配的文件名
grep -l "pattern" *.txt

# 显示不匹配的文件名
grep -L "pattern" *.txt

2. 过滤排除

复制代码
# 排除特定模式
grep -v "exclude" file.txt

# 排除多个模式
grep -v -e "pattern1" -e "pattern2" file.txt

# 排除空行和注释
grep -v "^$" file.txt | grep -v "^#"

# 排除目录
grep -r "pattern" . --exclude-dir=.git --exclude-dir=node_modules

# 排除文件类型
grep -r "pattern" . --exclude="*.min.js" --exclude="*.min.css"

🛠️ 实用例程

1. 日志分析

复制代码
# 提取特定时间段的日志
grep "2024-01-15 1[0-2]:" access.log

# 查找错误和警告
grep -E "(ERROR|WARN|FATAL)" app.log

# 查找HTTP状态码
grep -E "HTTP/1\.[01]\" [4-5][0-9][0-9]" access.log

# 统计IP访问次数
grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log | sort | uniq -c | sort -nr

# 查找慢查询(>5秒)
grep "execution time: [5-9][0-9][0-9][0-9]" db.log

2. 代码搜索

复制代码
# 查找函数定义
grep -n "def " *.py
grep -n "function " *.js

# 查找TODO/FIXME注释
grep -r -n "TODO\|FIXME\|XXX" --include="*.{py,js,jsx,ts,tsx}" .

# 查找未使用的导入(Python)
grep -r "import " *.py | grep -v "^\s*#" | cut -d: -f2 | sort | uniq

# 查找console.log(调试语句)
grep -r "console\.log\|print(" --include="*.{js,py}" .

# 查找硬编码的字符串
grep -r '"\(password\|secret\|key\)"' --include="*.py" .

3. 配置文件处理

复制代码
# 查找有效配置(非注释行)
grep -v "^#" config.conf | grep -v "^$"

# 查找特定配置项
grep -E "^[[:space:]]*server_name" nginx.conf

# 查找环境变量定义
grep -E "^export [A-Z_]+=" .bashrc

# 检查重复配置
grep -E "^[[:space:]]*[a-zA-Z]" config.conf | sort | uniq -d

4. 系统管理

复制代码
# 查找运行中的进程
ps aux | grep "[a]pache"      # 技巧:用 [] 排除grep自身
ps aux | grep -i "mysql"

# 查找特定用户进程
ps aux | grep "^username"

# 查找大文件
find . -type f -size +100M | grep -v ".git"

# 检查端口占用
netstat -tulpn | grep ":80"

# 查找特定权限的文件
ls -la | grep "^d[rwx-]\{9\}.*root"

5. 数据处理

复制代码
# 提取CSV特定列(第3列为"error"的行)
awk -F',' '$3 == "error"' file.csv | grep "pattern"

# 提取JSON值(简单情况)
grep -o '"name":"[^"]*"' data.json

# 提取XML标签内容
grep -o '<title>[^<]*</title>' file.xml

# 提取URL
grep -o -E "https?://[a-zA-Z0-9./?=_%:-]*" file.txt

# 提取版本号
grep -o -E "[0-9]+\.[0-9]+(\.[0-9]+)?" file.txt

🎪 高级技巧

1. 彩色输出

复制代码
# 启用颜色(默认自动检测)
grep --color=auto "pattern" file.txt

# 强制启用颜色
grep --color=always "pattern" file.txt | less -R

# 自定义颜色
GREP_COLORS='mt=01;31' grep "pattern" file.txt  # 红色粗体
# 可用颜色: mt=匹配文本, ms=选择匹配, mc=上下文匹配, sl=选择行, cx=上下文行, rv=反转视频, fn=文件名, ln=行号, bn=字节偏移, se=分隔符

2. 二进制文件处理

复制代码
# 在二进制文件中搜索文本
grep -a "text" binary_file

# 搜索时忽略二进制文件
grep -I "pattern" *  # 等价于 --binary-files=without-match

# 强制当作文本处理
grep --binary-files=text "pattern" file

3. 多字节字符支持

复制代码
# 处理UTF-8等编码
grep -P "[\x{4e00}-\x{9fff}]" file.txt  # 匹配中文字符
grep -P "[\p{Han}]" file.txt            # 匹配汉字(Perl类)

# Unicode字符类
grep -P "\p{L}" file.txt                # 任何字母
grep -P "\p{N}" file.txt                # 任何数字
grep -P "\p{P}" file.txt                # 任何标点

4. 性能优化

复制代码
# 快速搜索(固定字符串)
grep -F "exact_string" large_file.txt

# 限制搜索深度
grep -r --max-depth=2 "pattern" .

# 使用fgrep(固定字符串grep)
fgrep "fixed_string" file.txt

# 并行搜索(使用GNU parallel)
find . -name "*.log" -type f | parallel grep -H "pattern" {}

📋 实用单行命令

1. 文件处理

复制代码
# 删除空行
grep -v "^$" file.txt > newfile.txt

# 提取注释
grep "^#" config.conf > comments.txt

# 提取非注释配置
grep -v "^#" config.conf | grep -v "^$" > clean_config.conf

# 查找重复行
grep -n "^.*$" file.txt | sort -k2 | uniq -df1

# 统计单词出现次数
grep -o -w "word" file.txt | wc -l

2. 网络和安全

复制代码
# 查找SSH登录尝试
grep "Failed password" /var/log/auth.log

# 查找可疑活动
grep -E "(invalid user|authentication failure)" /var/log/secure

# 提取访问IP
grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/nginx/access.log | sort | uniq

# 查找明文密码
grep -r -i "password[[:space:]]*=" --include="*.{py,js,json,yml,yaml}" .

3. 开发调试

复制代码
# 查找未捕获的异常
grep -r "except:" --include="*.py" . | grep -v "#"

# 查找print语句(调试残留)
grep -r "print(" --include="*.py" .

# 查找过长的行(>80字符)
grep -n "^.\{81,\}$" *.py

# 查找魔法数字
grep -r -E "\b[0-9]{3,}\b" --include="*.{py,js,java}" .

🎓 组合工具

1. 与 find 组合

复制代码
# 查找包含文本的文件
find . -name "*.txt" -exec grep -l "pattern" {} \;

# 查找并处理
find . -type f -name "*.log" -exec grep -H "error" {} \;

# 使用xargs提高性能
find . -name "*.py" -type f | xargs grep -l "import os"

2. 与 sed/awk 组合

复制代码
# 提取后处理
grep "pattern" file.txt | awk '{print $1, $3}'

# 替换匹配内容
grep -l "old_pattern" *.txt | xargs sed -i 's/old_pattern/new_pattern/g'

# 统计列数据
grep "success" log.txt | awk '{sum += $3} END {print sum}'

3. 与 sort/uniq 组合

复制代码
# 统计频率
grep -o "pattern" file.txt | sort | uniq -c | sort -nr

# 去重匹配
grep -h "pattern" *.log | sort -u

# 查找共同行
grep -f file1.txt file2.txt | sort

📚 特殊技巧

1. 排除自身

复制代码
# 搜索进程时排除grep自身
ps aux | grep "[p]ython"      # 技巧!匹配 "python" 但 "[p]ython" 不匹配自身
ps aux | grep "python" | grep -v "grep"  # 传统方法

# 原因:[p]ython 匹配 "python",但 "grep [p]ython" 不匹配

2. 多个文件类型

复制代码
# 搜索多种文件
grep -r "pattern" --include="*.cpp" --include="*.h" .

# 使用glob模式
grep -r "pattern" --include="*.{cpp,h,cc}" .

# 排除多种文件
grep -r "pattern" --exclude="*.min.js" --exclude="*.min.css" .

3. 行号技巧

复制代码
# 显示匹配行及前后范围
grep -n -C 3 "pattern" file.txt

# 只显示行号
grep -n "pattern" file.txt | cut -d: -f1

# 显示行号范围
grep -n "pattern" file.txt | awk -F: '{print $1}' | paste -sd,

⚠️ 注意事项

1. 正则表达式差异

复制代码
# 基本正则 vs 扩展正则
grep "a\{3\}" file.txt      # 基本正则,需要转义{}
grep -E "a{3}" file.txt     # 扩展正则,不需要转义
grep -P "a{3}" file.txt     # Perl正则,不需要转义

# 常见元字符转义
grep "\.txt$" file.txt      # 转义点号匹配 ".txt"
grep -F ".txt" file.txt     # 或使用固定字符串

2. 性能考虑

复制代码
# 大文件搜索技巧
grep -m 10 "pattern" large.log    # 找到10个匹配后停止

# 使用更快的算法
grep -F "string" large.txt        # 固定字符串比正则快

# 避免不必要的递归
grep -r --exclude-dir=.git "pattern" .

3. 编码问题

复制代码
# 处理不同编码
grep -a "pattern" file          # 当作文本处理
grep -U "pattern" file          # 处理Windows换行符
grep --unicode-mode "pattern" file  # Unicode模式

# 设置语言环境
LANG=C grep "pattern" file      # 使用C语言环境(最快)

📖 速查表

常用模式

模式 说明 示例
^ 行首 ^start
$ 行尾 end$
. 任意单个字符 a.b
* 0次或多次 a*b
+ 1次或多次(需-E) a+b
? 0次或1次(需-E) a?b
{n} 恰好n次(需-E) a{3}
{n,} 至少n次(需-E) a{3,}
{n,m} n到m次(需-E) a{3,5}
[abc] 字符集 [aeiou]
[^abc] 否定字符集 [^0-9]
` ` 或(需-E)
\(\) 分组(基础) \(ab\)+
() 分组(扩展) (ab)+(需-E)

字符类

等价 说明
[[:alnum:]] [a-zA-Z0-9] 字母数字
[[:alpha:]] [a-zA-Z] 字母
[[:digit:]] [0-9] 数字
[[:lower:]] [a-z] 小写字母
[[:upper:]] [A-Z] 大写字母
[[:space:]] [ \t\r\n\v\f] 空白字符
[[:blank:]] [ \t] 空格和制表符
[[:punct:]] [!"#$%&'()*+,./:;<=>?@[\]^_{|}~-]` 标点符号
[[:graph:]] [[:alnum:][:punct:]] 可见字符
[[:print:]] [[:alnum:][:punct:] ] 可打印字符
[[:cntrl:]] [\x00-\x1F\x7F] 控制字符
[[:xdigit:]] [0-9a-fA-F] 十六进制数字

这个大全涵盖了 grep 的绝大多数用法,从基础搜索到高级技巧都有示例。掌握这些例程,你就能高效地处理文本搜索的各种需求!

相关推荐
ICscholar15 小时前
ExaDigiT/RAPS
linux·服务器·ubuntu·系统架构·运维开发
sim202015 小时前
systemctl isolate graphical.target命令不能随便敲
linux·mysql
米高梅狮子16 小时前
4. Linux 进程调度管理
linux·运维·服务器
再创世纪17 小时前
让USB打印机变网络打印机,秀才USB打印服务器
linux·运维·网络
fengyehongWorld18 小时前
Linux ssh端口转发
linux·ssh
知识分享小能手19 小时前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的Shell编程详细知识点(含案例代码)(17)
linux·学习·ubuntu
Xの哲學20 小时前
深入解析 Linux systemd: 现代初始化系统的设计与实现
linux·服务器·网络·算法·边缘计算
龙月20 小时前
journalctl命令以及参数详解
linux·运维
EndingCoder21 小时前
TypeScript 的基本类型:数字、字符串和布尔
linux·ubuntu·typescript
YJlio21 小时前
Kali Linux 外置无线网卡接入与识别排障(VMware 环境|合规学习版)
linux·网络·学习