在Linux系统中,grep(Global Regular Expression Print)是一个用于在文本文件中搜索字符串或正则表达式的命令行工具。它可以有效地查找包含特定模式的行,并将其打印出来。今天,我们结合以下示例,深入了解一下grep命令的详细使用方法。
grep是什么
基本语法
grep [选项] PATTERN [FILE...]
# PATTERN:要搜索的字符串或正则表达式。
# FILE:要搜索的文件名,多个文件用空格分隔。
其中每个[选项]所代表的意思如下:
正则表达式选择与解析:
-E, --extended-regexp PATTERN 是一个扩展正则表达式(ERE)
-F, --fixed-strings PATTERN 是一系列用换行符分隔的固定字符串
-G, --basic-regexp PATTERN 是一个基本正则表达式(BRE)
-P, --perl-regexp PATTERN 是一个Perl正则表达式
-e, --regexp=PATTERN 使用PATTERN进行匹配
-f, --file=FILE 从FILE中获取PATTERN
-i, --ignore-case 忽略大小写差异
-w, --word-regexp 强制PATTERN仅匹配完整的单词
-x, --line-regexp 强制PATTERN仅匹配完整的行
-z, --null-data 数据行以0字节结束,而不是换行符
其他选项:
-s, --no-messages :不显示错误消息
-v, --invert-match :选择非匹配的行
-V, --version :显示版本信息并退出
--help :显示此帮助文本并退出
输出控制:
-m, --max-count=NUM 匹配NUM次后停止
-b, --byte-offset 输出每行时打印字节偏移量
-n, --line-number 输出每行时打印行号
--line-buffered 每行输出时刷新输出
-H, --with-filename 为每条匹配结果打印文件名
-h, --no-filename 输出时不显示文件名前缀
--label=LABEL 使用LABEL作为标准输入文件名前缀
-o, --only-matching 只显示与模式匹配的文件部分
-q, --quiet, --silent 关闭所有常规输出
--binary-files=TYPE 假设二进制文件为TYPE; TYPE为'binary'、'text'或'without-match'
-a, --text 相当于--binary-files=text
-I 相当于--binary-files=without-match
-d, --directories=ACTION 处理目录的方式;ACTION为'read'、'recurse'或'skip'
-D, --devices=ACTION 处理设备、FIFO和套接字的方式;ACTION为'read'或'skip'
-r, --recursive 相当于--directories=recurse
-R, --dereference-recursive 同样,但跟踪所有符号链接
--include=FILE_PATTERN 仅搜索匹配FILE_PATTERN的文件
--exclude=FILE_PATTERN跳过匹配 FILE\_PATTERN 的文件和目录。
--exclude-from=FILE 跳过任何文件模式匹配的文件。
--exclude-dir=PATTERN 匹配 PATTERN 的目录将被跳过。
-L, --files-without-match 仅打印包含匹配项的 FILE 的名称。
-l, --files-with-matches 仅打印包含匹配项的 FILE 的名称。
-c, --count 仅打印每个 FILE 中匹配行的计数。
-T, --initial-tab 使制表符对齐(如果需要的话)。
-Z, --null 打印 FILE 名称后面的 0 字节。
上下文控制:
-B, --before-context=NUM 打印NUM行的前置上下文
-A, --after-context=NUM 打印NUM行的后置上下文
-C, --context=NUM 打印NUM行的输出上下文
-NUM 与--context=NUM相同
--group-separator=SEP 使用SEP作为分组符
--no-group-separator 使用空字符串作为分组符
--color[=WHEN],
--colour[=WHEN] 使用标记来突出匹配的字符串;WHEN是'always'、'never'或'auto'
命令使用
grep "hello" example.txt
grep -i "hello" example.txt
grep -n "error" example.txt
grep -v "foo" example.txt
grep -r "main" .
统计文件 example.txt 中包含 "test" 的行数
grep -c "test" example.txt
grep -o "pattern" file.txt
grep -C 2 "hello" example.txt
grep "^start" example.txt
grep "end$" example.txt
grep -E "start|end" example.txt
grep "start\|end" example.txt #如果不加-E就要用转义符
grep -f pattern文件 被搜索的文件
ERROR
WARNING
data.txt文件的内容:
INFO Starting the application
WARNING Low disk space
ERROR Failed to load module
INFO User logged in
FATAL System crash
执行:
grep -f pattern.txt data.txt
-A 捕获该字段出现的行,以及下一行:
grep -A1 "WARNING" data.txt
-B 捕获该字段出现的行,以及上一行:
grep -B1 "WARNING" data.txt
grep -C1 "WARNING" data.txt