57. 高级文本处理 - grep、egrep

开篇词

我们可以使用 Linux 提供的 grep 工具来基于基本的或扩展的正则表达式来查找匹配的行。
 

grepegrep 命令选项

这里是 grepegrep 命令的一些选项:

匹配器选择

选项用途
-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 可以是 neveralwaysauto
-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 次。

交替

交替用途
|匹配管道左至右侧的值并返回其中之一。

后引用及子表达式

子表达式用途
\nn 是指向匹配的第 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 管理员手册:既简单又深刻

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snow Hide(雪诺海德)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值