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 的绝大多数用法,从基础搜索到高级技巧都有示例。掌握这些例程,你就能高效地处理文本搜索的各种需求!

相关推荐
杼蛘2 小时前
XXL-Job工具使用操作记录
linux·windows·python·jdk·kettle·xxl-job
CQ_YM2 小时前
Linux进程基础
linux·服务器·进程
_OP_CHEN2 小时前
【Git原理与使用】(五)Git 多人协作:从分支协作到冲突解决,团队开发效率翻倍秘籍
linux·运维·git·团队开发·运维开发·企业级组件·git多人协作
添砖java‘’3 小时前
常见的进程间通信方式详解
linux·c++·操作系统·信息与通信·进程通信
企鹅侠客3 小时前
Linux性能调优:详解CPU使用率计算方式
linux·运维·服务器·性能调优
秋深枫叶红3 小时前
嵌入式第三十四篇——linux系统编程——进程
linux·服务器·数据库·学习
普通网友3 小时前
深入探讨Linux驱动开发:字符设备驱动开发与测试_linux 驱动开发设备号(2)
java·linux·驱动开发
hakuii3 小时前
linux中的一些配置
linux·运维·服务器
时光の尘3 小时前
嵌入式面试八股文(十九)·裸机开发与RTOS开发的区别
linux·stm32·单片机·iic·rtos·spi