grep
是 Linux 和类 Unix 操作系统中一个强大的文本搜索工具,用于在文件或标准输入中查找与指定模式匹配的行。它支持正则表达式,可以快速定位文件中的特定内容。
以下是对 grep
命令的详细介绍,包括基本用法、常用选项和示例。
基本语法
1 | grep [选项] "搜索模式" [文件...] |
- 搜索模式:指定要查找的文本模式(可以是字符串或正则表达式)。
- 文件:要搜索的文件,可以是一个或多个文件。如果不指定文件,则从标准输入(
stdin
)读取数据。 - 选项:控制搜索行为,例如忽略大小写、递归搜索、显示行号等。
常用选项
选项 | 功能 |
---|---|
-i |
忽略大小写匹配。 |
-v |
反向匹配,显示不符合模式的行。 |
-r 或 -R |
递归搜索目录中的所有文件。 |
-n |
显示匹配行的行号。 |
-c |
仅显示匹配的行数。 |
-l |
仅显示包含匹配内容的文件名。 |
-L |
仅显示不包含匹配内容的文件名。 |
-o |
仅显示匹配的内容(而非整行)。 |
-w |
匹配整个单词。 |
-x |
匹配整行。 |
-A [行数] |
显示匹配行及其后面指定的行数。 |
-B [行数] |
显示匹配行及其前面指定的行数。 |
-C [行数] |
显示匹配行及其前后指定的行数(等价于 -A 和 -B 的组合)。 |
--color |
高亮显示匹配的内容(通常默认启用)。 |
--include |
只搜索匹配的文件类型(如 --include="*.txt" )。 |
--exclude |
排除特定文件类型(如 --exclude="*.log" )。 |
--exclude-dir |
排除特定目录(如 --exclude-dir="backup" )。 |
详解选项和示例
基本匹配**
-
在文件中搜索包含 "pattern" 的行:
1
grep "pattern" file.txt
-
示例:
如果file.txt
内容为:1
2
3hello world
grep is powerful
pattern matching输出:
1
pattern matching
忽略大小写(-i
)
- 忽略大小写匹配:
1
grep -i "pattern" file.txt
反向匹配(-v
)
- 显示不包含 "pattern" 的行:
1
grep -v "pattern" file.txt
递归搜索(-r
或 -R
)
- 在当前目录及其子目录中递归搜索 "pattern":
1
grep -r "pattern" .
显示行号(-n
)
-
显示匹配行及其行号:
1
grep -n "pattern" file.txt
-
输出示例:
1
3:pattern matching
仅显示匹配文件名(-l
)
- 查找包含 "pattern" 的文件,仅显示文件名:
1
grep -l "pattern" *.txt
统计匹配行数(-c
)
- 显示文件中匹配的行数:
1
grep -c "pattern" file.txt
仅显示匹配内容(-o
)
- 仅显示匹配的部分,而不是整行:
1
grep -o "pattern" file.txt
匹配整个单词(-w
)
- 仅匹配独立的 "pattern" 单词(避免匹配部分单词):
1
grep -w "pattern" file.txt
匹配整行(-x
)
- 仅匹配整行与 "pattern" 完全一致的行:
1
grep -x "pattern" file.txt
显示上下文行(-A
、-B
、-C
)
-
显示匹配行及其后 2 行(
-A
):1
grep -A 2 "pattern" file.txt
-
显示匹配行及其前 2 行(
-B
):1
grep -B 2 "pattern" file.txt
-
显示匹配行及其前后 2 行(
-C
):1
grep -C 2 "pattern" file.txt
排除特定文件或目录
-
排除特定文件类型:
1
grep -r --exclude="*.log" "pattern" .
-
排除特定目录:
1
grep -r --exclude-dir="backup" "pattern" .
结合正则表达式
匹配以 "start" 开头的行:
1 | grep "^start" file.txt |
匹配以 "end" 结尾的行:
1 | grep "end$" file.txt |
匹配包含数字的行:
1 | grep "[0-9]" file.txt |
匹配包含 "error" 或 "fail" 的行:
1 | grep -E "error|fail" file.txt |
grep 的扩展版本
egrep
和 fgrep
egrep
等价于grep -E
,支持扩展正则表达式。fgrep
等价于grep -F
,不支持正则表达式,仅匹配固定字符串。
综合示例
在所有 .log
文件中查找 "error" 并显示行号
1 | grep -n "error" *.log |
递归查找包含 "TODO" 的文件,排除 backup
目录
1 | grep -r --exclude-dir="backup" "TODO" . |
查找包含 "https://" 的行,并仅显示匹配内容
1 | grep -o "https://[a-zA-Z0-9./?=_-]*" file.txt |
在文件中查找错误日志(不区分大小写)并显示上下文 3 行
1 | grep -i -C 3 "error" system.log |
查找某用户的所有进程
结合 ps
使用:
1 | ps aux | grep "username" |
统计文件中出现某单词的次数
1 | grep -o "word" file.txt | wc -l |
查找大写开头的单词
1 | grep -o "\b[A-Z][a-z]*\b" file.txt |
总结
grep
是 Linux 中最常用的文本处理工具之一,适用于从文件或输出中快速搜索指定内容。- 通过选项(如
-i
、-v
、-r
)和正则表达式,可以实现灵活高效的内容过滤。 - 使用时要注意正则表达式的语法,以及结合
grep
的扩展功能(如--exclude
和--include
)以优化搜索效率。