grep
是 Linux 中用于文本搜索的强大工具,可以在文件中搜索指定的模式,并输出包含该模式的行。以下是 grep
命令的所有选项及其功能的详细说明,并附带示例和注释:
基本使用
grep [OPTION]... PATTERN [FILE]...
- PATTERN:要匹配的模式。默认是基本正则表达式(BRE)。
正则表达式选择和解释
-
-E, --extended-regexp
:将PATTERN
视为扩展正则表达式(ERE),允许使用更复杂的正则表达式语法,如+
和?
。grep -E "pattern[0-9]+" filename # 查找包含模式 'pattern' 后跟一个或多个数字的行
-
-F, --fixed-strings
:将PATTERN
视为固定字符串,不作为正则表达式处理。grep -F "fixed_string" filename # 查找包含固定字符串 'fixed_string' 的行,而不进行正则匹配
-
-G, --basic-regexp
:将PATTERN
视为基本正则表达式(BRE)。这是grep
的默认模式。grep -G "pattern" filename # 使用基本正则表达式模式进行匹配(默认模式)
-
-P, --perl-regexp
:将PATTERN
视为 Perl 兼容正则表达式(PCRE),支持 Perl 风格的正则表达式。grep -P "\d{2,4}" filename # 查找包含2到4个数字的行(Perl 风格正则表达式)
-
-e, --regexp=PATTERN
:指定用于匹配的模式。grep -e "pattern" filename # 查找包含指定模式 'pattern' 的行
-
-f, --file=FILE
:从文件FILE
中读取模式。每行一个模式。grep -f patterns.txt filename # 从 patterns.txt 中读取模式,并在 filename 中查找匹配
-
-i, --ignore-case
:忽略大小写。grep -i "pattern" filename # 查找包含 'pattern'(忽略大小写)的行
-
-w, --word-regexp
:强制模式只匹配完整的单词。grep -w "word" filename # 查找包含完整单词 'word' 的行
-
-x, --line-regexp
:强制模式匹配整行。grep -x "exact line" filename # 查找完全匹配 'exact line' 的整行
-
-z, --null-data
:数据行以 0 字节而不是换行符结束。grep -z "pattern" filename # 处理以 0 字节结束的行(通常用于处理二进制数据)
杂项
-
-s, --no-messages
:抑制错误信息。grep -s "pattern" filename # 如果文件不存在或发生错误,不显示错误信息
-
-v, --invert-match
:选择不匹配的行。grep -v "pattern" filename # 查找不包含 'pattern' 的行
-
-V, --version
:显示版本信息并退出。grep -V # 显示 grep 的版本信息
-
--help
:显示帮助文本并退出。grep --help # 显示 grep 的帮助信息
输出控制
-
-m, --max-count=NUM
:在匹配到 NUM 次后停止。grep -m 3 "pattern" filename # 只显示前 3 次匹配的行
-
-b, --byte-offset
:打印输出行的字节偏移量。grep -b "pattern" filename # 在每行匹配项前显示字节偏移量
-
-n, --line-number
:打印行号。grep -n "pattern" filename # 显示匹配行的行号
-
--line-buffered
:每行输出时刷新输出缓冲区。grep --line-buffered "pattern" filename # 实时输出匹配结果,每行刷新缓冲区
-
-H, --with-filename
:对每个匹配项打印文件名。grep -H "pattern" filename # 显示匹配行所在的文件名
-
-h, --no-filename
:抑制文件名前缀(当搜索多个文件时)。grep -h "pattern" file1 file2 # 显示匹配行,不显示文件名
-
--label=LABEL
:使用LABEL
作为标准输入文件名前缀。grep --label="myfile" "pattern" filename # 将标准输入文件名标记为 'myfile'
-
-o, --only-matching
:仅显示匹配的部分。grep -o "pattern" filename # 只显示匹配到的模式部分,而不是整行
-
-q, --quiet, --silent
:抑制所有正常输出。grep -q "pattern" filename # 仅返回退出状态,抑制正常输出
-
--binary-files=TYPE
:假设二进制文件的类型;TYPE
为 ‘binary’, ‘text’, 或 ‘without-match’。grep --binary-files=text "pattern" filename # 将二进制文件视为文本文件进行处理
-
-a, --text
:等同于--binary-files=text
。grep -a "pattern" filename # 处理二进制文件时,将其视为文本
-
-I
:等同于--binary-files=without-match
。grep -I "pattern" filename # 在处理二进制文件时忽略匹配
-
-d, --directories=ACTION
:处理目录的方式;ACTION
为 ‘read’, ‘recurse’, 或 ‘skip’。grep -d recurse "pattern" directory/ # 递归处理目录中的文件
-
-D, --devices=ACTION
:处理设备、FIFO 和套接字的方式;ACTION
为 ‘read’ 或 ‘skip’。grep -D read "pattern" filename # 读取设备、FIFO 和套接字的内容
-
-r, --recursive
:类似于--directories=recurse
。grep -r "pattern" directory/ # 递归地查找目录中的文件
-
-R, --dereference-recursive
:类似于-r
,但会跟踪所有符号链接。grep -R "pattern" directory/ # 递归查找,包括跟踪符号链接
-
--include=FILE_PATTERN
:只搜索匹配FILE_PATTERN
的文件。grep -r --include="*.txt" "pattern" directory/ # 仅在 .txt 文件中搜索模式
-
--exclude=FILE_PATTERN
:跳过匹配FILE_PATTERN
的文件和目录。grep -r --exclude="*.log" "pattern" directory/ # 跳过 .log 文件的搜索
-
--exclude-from=FILE
:跳过与FILE
中的任何文件模式匹配的文件。grep -r --exclude-from="exclude.txt" "pattern" directory/ # 跳过 exclude.txt 中指定模式的文件
-
--exclude-dir=PATTERN
:跳过匹配PATTERN
的目录。grep -r --exclude-dir="tmp" "pattern" directory/ # 跳过 tmp 目录中的文件
-
-L, --files-without-match
:仅打印没有匹配项的文件名。grep -L "pattern" filename1 filename2 # 显示不包含 'pattern' 的文件名
-
-l, --files-with-matches
:仅打印包含匹配项
的文件名。
grep -l "pattern" filename1 filename2
# 显示包含 'pattern' 的文件名
-
-c, --count
:仅打印每个文件中匹配行的计数。grep -c "pattern" filename # 显示每个文件中匹配 'pattern' 的行数
-
-T, --initial-tab
:使制表符对齐(如果需要)。grep -T "pattern" filename # 如果输出中包含制表符,则对齐制表符
-
-Z, --null
:在文件名后打印 0 字节。grep -Z "pattern" filename # 在输出的每个文件名后加上 0 字节,通常用于处理二进制数据
上下文控制
-
-B, --before-context=NUM
:打印 NUM 行的前导上下文。grep -B 3 "pattern" filename # 显示匹配行及其前 3 行
-
-A, --after-context=NUM
:打印 NUM 行的尾随上下文。grep -A 3 "pattern" filename # 显示匹配行及其后 3 行
-
-C, --context=NUM
:打印 NUM 行的前后上下文(前导和尾随)。grep -C 3 "pattern" filename # 显示匹配行及其前后各 3 行
-
-NUM
:等同于--context=NUM
。grep -5 "pattern" filename # 显示匹配行及其前后各 5 行
-
--group-separator=SEP
:使用SEP
作为组分隔符。grep -C 3 --group-separator="--" "pattern" filename # 在匹配结果之间使用 '--' 作为分隔符
-
--no-group-separator
:使用空字符串作为组分隔符。grep -C 3 --no-group-separator "pattern" filename # 在匹配结果之间不使用任何分隔符
-
--color[=WHEN], --colour[=WHEN]
:使用标记突出显示匹配字符串;WHEN
为 ‘always’, ‘never’, 或 ‘auto’。grep --color=always "pattern" filename # 总是使用颜色标记匹配的字符串
-
-U, --binary
:在行尾不去除 CR 字符(MSDOS/Windows)。grep -U "pattern" filename # 处理 CR 字符(回车符)
-
-u, --unix-byte-offsets
:报告偏移量时不考虑 CR 字符(MSDOS/Windows)。grep -u "pattern" filename # 偏移量计算不考虑 CR 字符
egrep
和 fgrep
-
egrep
:等同于grep -E
,用于扩展正则表达式。egrep "pattern" filename
-
fgrep
:等同于grep -F
,用于固定字符串匹配。fgrep "pattern" filename
egrep
和fgrep
的直接调用已经被弃用,建议使用grep -E
和grep -F
。
文件和标准输入
-
当
FILE
为-
时,grep
从标准输入读取数据。echo "data" | grep "pattern"
-
如果没有指定
FILE
,grep
将读取当前目录(.
),或在给定-r
选项时,读取-
。grep "pattern"
退出状态
- 0:如果至少选择了一行。
- 1:没有选择任何行。
- 2:发生错误(例如语法错误),且未给出
-q
选项。