Grep、Sed、Awk 00 RegExp
“awk、grep、sed 是 linux 操作文本的三大利器,合称文本三剑客,也是必须掌握的 linux 命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属 awk 功能最强大,但也最复杂。grep 更适合单纯的查找或匹配文本,sed 更适合编辑匹配到的文本,awk 更适合格式化文本,对文本进行较复杂格式处理。“
在介绍这三个命令之前,需要对正则表达式有所了解,结合正则表达式来使用,才能发挥这 linux 三剑客的的全部能力。
正则表达式 RegExp
正则表达式: Regual Expression 为一类特殊字符和文本符号共通约定的一种 pattern,其中的一些字符并不表示其本身的含义,而是用来做通配符号。
其中基本正则表达式 BRE 是普遍支持的,而拓展正则表达式 ERE 通常则是需要特殊的参数来启用的。通过正则表达式中特殊符号的辅助,能够更快的过滤,查找,替换,处理字符流等。
除了在 grep、sed、awk 的 linux 三剑客中,在各个语言和各种搜索函数的地方,正则表达式都被普遍支持,应用相当广泛。
基础正则表达式对应的元字符主要有以下几个:
1 |
|
而拓展正则表达式在上述元字符的基础上增加了:
1 |
|
等字符,接下来我们将逐一展开各个元字符的作用。
基础正则表达式 BRE
正则表达式的元字符会起到以下的三个作用,从而定义某种特殊的字符模式:
- 匹配字符(
.
[anychar]
,\
) - 匹配次数(
*
) - 位置锚定(
^
,$
)
粗略的可以划分为以上的三类,而详细的作用则如同下表所示。
字符 | 作用 |
---|---|
^ |
写在 Pattern 的开头,如 ^header ,匹配以 header 开头的行 |
$$` | 写在 Pattern 的结尾,如 `tail$$,将匹配以 tail 结尾的行 |
^$ |
组合符,表示空行 |
\ |
转义符,让特殊的这些元字符不做元字符,而作为普通字符来进行匹配 |
. |
匹配任意一个字符(非空行)一次 |
* |
匹配前一个字符(连续出现)0 次到无穷次 |
.* |
组合符,将匹配一切 |
^.* |
组合符,匹配以任意字符串开头的内容 |
.*$ |
组合符,匹配以任意字符串结尾的内容 |
[abc] |
匹配 [] 集合中的任意字符,a 或 b 或 c,可以写成 [a-c] |
[^abc] |
上述匹配的反向,匹配除了 [] 集合中的任意字符,^表示取反 |
此外还有如下的两种正则:
\<
表示词首。如:\<abc
表示以 abc 为首的词。\>
表示词尾。如:abc\>
表示以 abc 结尾的词。
拓展正则表达式 ERE
拓展表达式拓展了上述三个字符模式的元组,拓展字符支持的如下:
- 匹配字符:
|
,()
- 匹配次数:
+
,?
,{n, m}
- 位置锚定:
字符 | 作用 | |
---|---|---|
+ |
匹配前一个字符(连续出现)1 次到无穷次 | |
[ab]+ |
组合符,匹配 [] 中的 a/b 一次到 N 次 |
|
? |
匹配前一个字符(连续出现)0 次到 1 次 | |
`\ | ` | 或者,表示同时过滤多个字符串 |
() |
分组过滤,括号起来的内容表示一个整体 | |
{n,m} |
匹配前一个字符 n 到 m 次,n, 表示>=n, ,m 表示<=m, n 表示正好为n |
其中表示或者的是|,由于表格的原因显示有问题。
特殊符号表
下面这些特殊匹配的字符,需要用的时候查表即可。
符号 | 匹配字符 |
---|---|
[:alnum:] |
同 [0-9a-zA-Z] 匹配数字和字母 |
[:alpha:] |
同 [a-zA-Z] 匹配大小写字母 |
[:upper:] / [:lower:] |
同 [A-Z] / [a-z] 匹配大/小写字母 |
[:blank:] |
空白字符,空格和制表符 |
[:space:] |
水平和垂直的空白字符,比 blank 的范围更广 |
[:cntrl:] |
不可打印的控制字符(退格,删除,警铃) |
[:digit:] |
十进制数字或 [0-9] |
[:xdigit:] |
十六进制数字 |
[:graph:] |
可打印的非空白字符 |
[:print:] |
可打印字符 |
[:punct:] |
标点符号 |
需要注意的是,使用 zsh 的时候,这些特殊字符可能会出现 zsh no matches found
的错误,这是因为 zsh 把这些特殊符号当成了命令行的参数,而不是 grep 的参数,因此导致失效。
为此可以在 zshrc 中添加以下命令,使其兼容 bash 的模式。
1 |
|
参考资料: zsh下报错“zsh: no matches found:” CSDN
用法补充
分组机制详解
待补充
正则表达式与通配符
参考资料:通配符 | Linux基础概要 (gitbooks.io)
通配符用于通配文件名,正则表达式用于匹配文本内容;且通配符通常只能用于 shell,被 shell 自解释,正则表达式则需要正则引擎进行处理,用在支持正则表达式的引擎或者命令中。
在 Bash 中,通配符只有三个符号:*
,?
, []
通配符 | 作用 |
---|---|
? |
匹配任意的单个字符 |
* |
匹配任意的多个字符 |
** |
匹配任意级别目录(bash 4.0以上版本支持,shopt -s globstar) |
[] |
匹配一个单字符范围,如[a-z],[0-9],特殊用法可以参考上面的特殊符号表,^亦可表示反向 |
注意 \\ 或者 `“ ”` `‘’` 都会使得通配符失效。
一些具体的用法:
1 |
|
Fi
正则部分的基本内容就是上述的这些,后续如果有遇到一些特殊的用法,以及进阶的用法会在上述补充;基础的正则规则了解后,介绍 grep 的使用,并基于 grep 的使用对正则表达式进行练习。
Grep、Sed、Awk 00 RegExp