grep 初级学习手册(修订版)
一、认识 grep
什么是 grep
安装与验证# 检查是否安装 grep –version # 安装命令 # Ubuntu/Debian: apt install grep # CentOS/RHEL: yum install grep # 基本测试 echo “Hello World” | grep “Hello”
基本概念
模式(Pattern):要搜索的文本或正则表达式
输入源:可以是文件、标准输入或管道
输出:匹配的行或相关信息
二、基本语法与选项
1. 基本用法格式
1 2 3 4 5 6 7 8 9
| grep &
命令 | grep &
grep &
|
2. 模式选择和解释选项
选项长选项说明-E–extended-regexp使用扩展正则表达式-F–fixed-strings将模式视为固定字符串(不使用正则表达式)-G–basic-regexp使用基本正则表达式(默认)-P–perl-regexp使用Perl兼容正则表达式-e–regexp=PATTERN指定模式进行匹配-f–file=FILE从文件中读取模式-i–ignore-case忽略大小写-w–word-regexp强制模式只匹配整个单词-x–line-regexp强制模式只匹配整行-z–null-data数据行以0字节结尾,而非换行符
3. 输出控制选项
选项长选项说明-m–max-count=NUM匹配NUM行后停止-b–byte-offset显示匹配行的字节偏移量-n–line-number显示行号-H–with-filename显示文件名-h–no-filename不显示文件名前缀-o–only-matching只显示匹配的部分-q–quiet, –silent静默模式,不输出正常结果-L–files-without-match只显示不包含匹配的文件名-l–files-with-matches只显示包含匹配的文件名-c–count只显示每个文件的匹配行数-T–initial-tab使制表符对齐-Z–null在文件名后输出0字节
4. 上下文控制选项
选项长选项说明-B–before-context=NUM显示匹配行前NUM行-A–after-context=NUM显示匹配行后NUM行-C–context=NUM显示匹配行前后NUM行-NUM等同于–context=NUM
5. 杂项选项
选项长选项说明-s–no-messages抑制错误消息-v–invert-match反向匹配(显示不匹配的行)-V–version显示版本信息–help显示帮助信息-a–text等同于–binary-files=text-I等同于–binary-files=without-match-r–recursive递归搜索目录-R–dereference-recursive递归搜索并跟随所有符号链接-U–binary不去除行尾的CR字符(MSDOS/Windows)
三、基本搜索操作
1. 简单文本搜索
1 2 3 4 5 6 7 8 9 10 11 12
| grep "error" application.log
grep "warning" *.log
grep -r "exception" /var/log/
cat file.txt | grep "pattern"
|
2. 大小写处理
1 2 3 4 5 6 7 8 9
| # 区分大小写(默认) grep "Error" log.txt
# 忽略大小写 grep -i "error" log.txt
# 完全匹配大小写 grep -w "ERROR" log.txt
|
3. 行号和上下文
1 2 3 4 5 6 7 8 9 10 11
| # 显示行号 grep -n "error" log.txt
# 显示匹配行的前后几行 grep -A 3 "error" log.txt # 显示匹配行及其后3行 grep -B 3 "error" log.txt # 显示匹配行及其前3行 grep -C 3 "error" log.txt # 显示匹配行前后各3行
# 使用数字简写 grep -3 "error" log.txt # 等同于-C 3
|
四、正则表达式详解
1. 基本正则表达式(BRE)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| grep "^start" file.txt grep "end$" file.txt
grep "a.b" file.txt
grep "a*" file.txt grep "a\+" file.txt grep "a\{2,4\}" file.txt
grep "[abc]" file.txt grep "[0-9]" file.txt grep "[a-z]" file.txt
|
2. 扩展正则表达式(ERE)
1 2 3 4 5 6
| grep -E "pattern1|pattern2" file.txt grep -E "a+" file.txt grep -E "a{2,4}" file.txt grep -E "(group)+" file.txt
|
3. Perl兼容正则表达式(PCRE)
1 2 3 4 5
| grep -P "\d+" file.txt grep -P "\w+" file.txt grep -P "(?<=pattern).*" file.txt
|
4. 字符类和特殊字符
1 2 3 4 5 6 7 8 9 10 11 12 13
| grep "[[:digit:]]" file.txt grep "[[:alpha:]]" file.txt grep "[[:alnum:]]" file.txt grep "[[:space:]]" file.txt grep "[[:upper:]]" file.txt grep "[[:lower:]]" file.txt
grep "\." file.txt grep "\*" file.txt grep "\\" file.txt
|
五、实用搜索技巧
1. 多模式搜索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # OR 操作(使用扩展正则) grep -E "error|warning|critical" log.txt
# 使用多个-e选项 grep -e "error" -e "warning" log.txt
# 从文件读取模式 echo -e "error\nwarning\ncritical" > patterns.txt grep -f patterns.txt log.txt
# AND 操作(管道组合) grep "error" log.txt | grep "database"
# NOT 操作 grep -v "debug" log.txt
|
2. 精确匹配
1 2 3 4 5 6 7 8 9
| grep -w "cat" file.txt
grep -x "exact line" file.txt
grep -F ".*[0-9].*" file.txt
|
3. 文件和目录操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| grep -r --include="*.log" "error" /var/log/
grep -r --exclude="*.tmp" "pattern" /path/
grep -r --exclude-dir="backup" "pattern" /home/
grep -l "pattern" *.txt
grep -L "pattern" *.txt
grep -a "text" binary_file grep -I "pattern" *
|
六、输出控制选项详解
1. 计数和限制
1 2 3 4 5 6 7 8 9 10 11 12
| # 只显示匹配行数 grep -c "error" log.txt
# 显示前N个匹配 grep -m 5 "error" log.txt
# 静默模式(只返回状态码) grep -q "pattern" file.txt && echo "Found"
# 显示字节偏移 grep -b "pattern" file.txt
|
2. 颜色和格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 彩色显示匹配项 grep --color=always "error" log.txt grep --color=auto "error" log.txt # 自动检测终端 grep --color=never "error" log.txt # 不使用颜色
# 只显示匹配的部分 grep -o "error" log.txt
# 不显示文件名 grep -h "pattern" file1.txt file2.txt
# 显示文件名 grep -H "pattern" single.txt
|
3. 分组和分隔符
1 2 3 4 5 6
| grep -A 2 -B 2 --group-separator="---" "error" log.txt
grep -A 2 -B 2 --no-group-separator "error" log.txt
|
七、高级文件处理
1. 目录和文件类型处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| grep -r "pattern" /path/
grep -R "pattern" /path/
grep -d read "pattern" directory/ grep -d skip "pattern" directory/ grep -d recurse "pattern" directory/
grep -D read "pattern" /dev/sda grep -D skip "pattern" /dev/sda
|
2. 二进制文件处理
1 2 3 4 5 6 7 8 9
| # 处理二进制文件的方式 grep --binary-files=text "pattern" file # 视为文本文件 grep --binary-files=binary "pattern" file # 视为二进制文件 grep --binary-files=without-match "pattern" file # 跳过匹配
# 快捷选项 grep -a "pattern" binary_file # 等同于--binary-files=text grep -I "pattern" * # 等同于--binary-files=without-match
|
3. 特殊输入处理
1 2 3 4 5 6
| grep -z "pattern" null_terminated_file
grep -U "pattern" windows_file
|
八、常见使用场景
1. 日志分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| grep "ERROR" application.log
grep -A 5 "ERROR" application.log
grep -c "ERROR" application.log
grep "2024-01-15" access.log
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.log
|
2. 系统管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ps aux | grep "nginx"
grep -n "port" /etc/nginx/nginx.conf
grep "username" /etc/passwd
systemctl list-units | grep "running"
netstat -tuln | grep ":80"
|
3. 代码搜索
1 2 3 4 5 6 7 8 9 10 11 12
| # 在源代码中搜索函数 grep -r "function_name" /path/to/source/
# 查找TODO注释 grep -r "TODO" /path/to/project/
# 查找特定文件类型中的内容 grep -r --include="*.py" "import" /path/to/python/code/
# 查找函数定义 grep -r "^def " --include="*.py" /path/to/project/
|
4. 网络和安全
1 2 3 4 5 6 7 8 9
| grep "Failed password" /var/log/auth.log
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" firewall.log
grep -i "security\|attack\|breach" /var/log/messages
|
九、实用示例集
1. 文件内容搜索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| grep "important" document.txt
grep "configuration" *.conf
grep -r "database" /etc/
grep -i "Error" log.txt
grep -B 2 -A 2 "ERROR" application.log
|
2. 行处理技巧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| grep "^$" file.txt
grep -v "^$" file.txt
grep "^[A-Z]" file.txt
grep "[0-9]" file.txt
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt
|
3. 组合使用
1 2 3 4 5 6 7 8 9 10 11 12
| # 统计匹配行数并显示 grep -c "error" log.txt && grep "error" log.txt
# 查找并显示上下文 grep -B 2 -A 2 "exception" application.log
# 多条件过滤 cat data.txt | grep "pattern1" | grep "pattern2"
# 排除多个模式 grep -v -E "(debug|info|trace)" log.txt
|
4. 高级搜索技巧
1 2 3 4 5 6 7 8 9 10 11 12
| grep -v "^$" file.txt | sort | uniq -d
grep -o ".*" file.txt | awk '{print length, $0}' | sort -nr | head -1
grep -E "^.{10,50}$" file.txt
grep -E "https?://[^\s\"]+" file.txt
|
十、常见问题解决
1. 特殊字符处理
1 2 3 4 5 6 7 8
| grep "file\.txt" documents.txt grep "price\$" products.txt grep "a\*b" patterns.txt
grep -F "file.txt" documents.txt
|
2. 性能优化
1 2 3 4 5 6 7 8 9 10 11 12
| grep -m 100 "pattern" largefile.txt
grep -F "literal_string" file.txt
grep -r --include="*.log" "error" /var/
grep -m 1 "pattern" largefile.txt
|
3. 编码和格式问题
1 2 3 4 5 6 7 8 9
| grep -a "pattern" file.txt
grep -U "pattern" windows_file
grep -z "pattern" null_terminated_file
|
4. 错误处理
1 2 3 4 5 6
| grep -s "pattern" *.txt
grep -r --exclude-dir="/proc" "pattern" /
|
十一、快速参考表
基本选项速查
1 2 3 4 5 6 7 8 9 10 11 12
| -i --ignore-case 忽略大小写 -v --invert-match 反向匹配 -n --line-number 显示行号 -c --count 只显示匹配行数 -l --files-with-matches 只显示文件名 -L --files-without-match 只显示不匹配的文件名 -r --recursive 递归搜索 -E --extended-regexp 扩展正则表达式 -F --fixed-strings 固定字符串匹配 -w --word-regexp 整词匹配 -x --line-regexp 整行匹配
|
常用正则表达式
1 2 3 4 5 6 7 8 9 10
| ^pattern 行首匹配 pattern$ 行尾匹配 . 任意单字符 * 前一字符0次或多次 \+ 前一字符1次或多次 \{n,m\} 前一字符n到m次 & & (pattern1|pattern2) OR操作(扩展正则)
|
实用组合示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| grep -n -A 3 -B 3 "ERROR" application.log
grep -r -l "TODO" /path/to/project/
grep -c -E "ERROR|WARNING|CRITICAL" log.txt
grep
grep -m 10 -i "error" largefile.log
grep -E -o "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt
|
退出状态码
1 2 3 4
| 0 找到匹配的行 1 未找到匹配的行 2 发生错误(除非使用-q选项)
|
这个修订版手册基于grep –help的完整输出,涵盖了所有主要选项和功能。掌握这些内容后,你可以高效地进行各种文本搜索和处理工作。
相关阅读