开篇词
我们可以使用 Linux 提供的 grep
工具来基于基本的或扩展的正则表达式来查找匹配的行。
grep
及 egrep
命令选项
这里是 grep
及 egrep
命令的一些选项:
匹配器选择
选项 | 用途 |
---|---|
-E 或 --extended-grep |
当 PATTERNS 作扩展正则表达式。 |
-F 或 --fixed-strings |
当 PATTERNS 作固定字符串而不是正则表达式。 |
-G 或 --basic-regexp |
当 PATTERNS 作基本正则表达式。 |
-P 或 --perl-regexp |
当 PATTERNS 作 Perl 兼容的正则表达式(PCREs)。 |
匹配器控制
选项 | 用途 |
---|---|
-e PATTERNS 或 --regexp=PATTERNS |
当 PATTERNS 作模式。 |
-f FILE 或 --file=FILE |
从 FILE 获取模式,可以多次使用或与 -e (--regexp) 选项相结合。 |
-i 或 --ignore-case |
无视大小写,匹配大写及小写。 |
-v 或 --invert-regexp |
输出未匹配的行。 |
-w 或 --word-regexp |
只输出与整个词匹配的行,并在与 -x 选项一起使用时无效。 |
-x 或 --line-regexp |
只输出与整个行匹配的行。 |
普通输出控制
选项 | 用途 |
---|---|
-c 或 --count |
输出匹配与未匹配的行数而不是其内容。 |
‑‑color[=WHEN] 或 ‑‑colour[=WHEN] |
根据颜色识别匹配内容。WHEN 可以是 never 、always 或 auto 。 |
-m NUM 或 ‑‑max-count=NUM |
输出前 NUM 个的匹配并忽略余下匹配。 |
-o 或 ‑‑only-matching |
只输出匹配内容,并在不同行输出它们。 |
-q 或 ‑‑quiet 或 ‑‑silent |
如果有内容匹配,则退出码为 0,而当没有匹配的内容时,退出码为 1. |
-s 或 ‑‑no-message |
压制像没有文件或文件不可读等错误消息。 |
输出行前缀控制
选项 | 用途 |
---|---|
-n 或 --line-number |
给匹配或未匹配的行加上行号前缀。 |
上下文行控制
选项 | 用途 |
---|---|
-A NUM 或 --after-xontext=NUM |
输出匹配行后的 NUM 行尾随上下文。将使用 -- 分隔符来分隔匹配的相邻组。 |
-B NUM 或 --before-context=NUM |
输出匹配行前的 NUM 行主导上下文。将使用 -- 分隔符来分隔匹配的相邻组。 |
-C NUM 或 --context=NUM |
输出 NUM 行输出上下文。将使用 -- 分隔符来分隔匹配的相邻组。 |
正则表达式
这里是 grep
命令的一些正则表达式。
字符种类及括号表达式
表达式 | 用途 |
---|---|
[0123456789] 或 [0-9] 或 [:digit:] |
匹配任意单个数字。 |
[:alnum:] 或 [0-9A-Za-z] |
匹配任意单个字母及数字。 |
[:aplha:] 或 [A-Za-z] |
匹配任意单个字母。 |
[:lower:] |
匹配任意单个小写字母。 |
[:upper:] |
匹配任意单个大写字母。 |
[:punct:] |
匹配任意标点符号。 |
[:space:] |
匹配任意空白字符。 |
锚定
锚 | 用途 |
---|---|
^ |
匹配行起始位置的空白字符串。 |
$ |
匹配行末尾位置的空白字符串。 |
反斜线字符及特殊表达式
表达式 | 用途 |
---|---|
\< |
匹配单词起始位置的空字符串。 |
\> |
匹配单词末尾位置的空字符串。 |
\b |
匹配单词末尾位置的空字符串。 |
\B |
匹配不位于单词末尾位置的空字符串。 |
重复
重复 | 用途 |
---|---|
. |
匹配任意单个字符。 |
? |
匹配前一项最多一次并且可选。 |
* |
匹配前一项零或多次。 |
+ |
匹配前一项一或多次。 |
{n} |
匹配前一项 n 次。 |
{n,} |
匹配前一项 n 或多次。 |
{,m} |
匹配前一项最多 m 次。 |
{n,m} |
匹配前一项至少 n 次,但不可多于 m 次。 |
交替
交替 | 用途 |
---|---|
| |
匹配管道左至右侧的值并返回其中之一。 |
后引用及子表达式
子表达式 | 用途 |
---|---|
\n |
n 是指向匹配的第 n 组的单个数字。 |
基本与扩展正则表达式
基本 | 扩展 |
---|---|
\? |
? |
\+ |
+ |
\{ |
{ |
\| |
| |
\( |
( |
\) |
) |
基本正则表达式例子
我们在开始之前,准备一些测试内容:
printf '%s\n' \
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam nisi tellus,' \
'egestas sed dolor nec, eleifend venenatis mi. Mauris ac ligula' \
'scelerisque libero interdum varius. Aenean nec arcu nec turpis' \
'commodo mollis. Morbi suscipit felis libero, eu sollicitudin justo' \
'condimentum id. Praesent eu metus rutrum, varius leo malesuada,' \
'varius sapien. Vestibulum blandit, dolor bibendum bibendum ultricies,' \
'ipsum velit pretium arcu, eu maximus augue massa vitae justo. Etiam' \
'elit sapien, placerat quis libero a, tincidunt ornare erat. Praesent eu nibh' \
'ac sem mattis tincidunt. Aliquam erat volutpat. Nulla egestas dui ac urna' \
'convallis, vel egestas lectus ultrices. Morbi sit amet quam eget tortor' \
'laoreet laoreet id non libero.' > grep_file
匹配以指定内容起始的行
cat vim_file | grep '^e'
匹配以指定内容结尾的行
cat vim_file | grep 'a$'
匹配包含任意指定字符串的行
cat vim_file | grep 'do\|ma' # 基本正则表达式中需要有反斜线 \
扩展正则表达式例子
egrep
命令等价于 grep -E
。
我们在开始之前,准备一些测试内容:
printf '%s\n' \
'These are IPs for related computers' \
'PC1 IP is: 192.168.0.1' \
'PC2 IP is: 192.168.1.2' \
'PC3 IP is: 192.168.10.255' \
'PC4 IP is: unknown' > egrep_file
匹配 IPv4 地址
匹配 0 至 255 之间的数字
该表达式匹配 0 至 255 及它们之间的任意数值:
cat egrep_file | egrep '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
匹配 (0-255).(0-255).(0-255). 格式
该表达式匹配 0 至 255 及它们之间的任意数值三次,每次都后跟一个点 .
:
cat egrep_file | egrep '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}'
匹配 (0-255).(0-255).(0-255).(0-255) 格式的 IP 地址
该表达式匹配 0 至 255 及它们之间的任意数值四次,每次都后跟一个点 .
,除了最后一个匹配:
cat egrep_file | egrep '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
我所撰写的英文版本
57. Advanced Text Processing - grep, egrep
引用
参见
上一篇:
想看手册的其他内容?请访问该手册的所属专栏:《Linux 管理员手册:既简单又深刻》