1. 基本概念
grep(缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。Windows系统下类似命令FINDSTR。
1.1. 基本语法
搜索标准输出(即文本流)
$ grep [options] search_string
在文件中搜索确切的字符串:
$ grep [options] search_string path/to/file
打印 myfile.txt 中包含字符串“hello”的行
$ grep 'hello' myfile.txt
1.2. 参数选项
选项 | 示例 | 说明 |
-i | grep -i ^DA demo.txt | 忘记区分大小写 |
-w | grep -w "of" demo.txt | 仅搜索完整的单词 |
-A | grep -A 3 'Exception' error.log | 匹配字符串后显示 3 行 |
-B | grep -B 4 'Exception' error.log | 在匹配字符串前显示 4 行 |
-C | grep -C 5 'Exception' error.log | 在匹配字符串周围显示 5 行 |
-r | grep -r 'github.io' /var/log/nginx/ | 递归搜索 (在子目录内) |
-v | grep -v 'warning' /var/log/syslog | 返回所有与模式不匹配的行 |
-e | grep -e '^al' filename | 使用正则表达式 (以'al'开头的行) |
-E | grep -E 'ja(s|cks)on' filename | 扩展正则表达式 (包含 jason 或 jackson 的行) |
-c | grep -c 'error' /var/log/syslog | 计算匹配数 |
-l | grep -l 'robot' /var/log/* | 打印匹配文件的名称 |
-o | grep -o search_string filename | 只显示字符串的匹配部分 |
-n | grep -n "go" demo.txt | 显示匹配的行号 |
2. 示例说明
2.1. 搜索命令行历史记录
history | grep passwd # 查询输入过 passwd 命令的记录
2.2. 搜索结果中包括或者排除指定文件
# 目录中所有的 .php 和 .html 文件中
# 递归搜索字符 "test()"
grep "test()" . -r --include *.{php,html}
# 在搜索结果中排除所有 README 文件
grep "test()" . -r --exclude "README"
# 在搜索结果中排除 filelist 文件列表里的文件
grep "test()" . -r --exclude-from filelist
2.3. 搜索多个文件并查找匹配文本在哪些文件中
grep -l "text" file1 file2 file3...
2.4. 输出包含匹配字符串的行数 -n 选项
grep "text" -n file_name
cat file_name | grep "text" -n
#多个文件
grep "text" -n file_1 file_2
2.5. 多级目录中对文本进行递归搜索
grep "text" . -r -n
2.6. 忽略匹配样式中的字符大小写
echo "hello world" | grep -i "HELLO"
2.7. 统计文件或文本中包含匹配字符串的行数 -c 选项
grep -c "text" file_name