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 次。

交替

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

后引用及子表达式

子表达式 用途
\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 管理员手册:既简单又深刻

发布了182 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104489829