Linux文本三剑客

文本处理工具均支持正则表达式引擎

  1. grep:文本过滤工具,通过模式pattern工具进行匹配
  2. sed:文本编辑工具,stream editor 流编辑器
  3. awk:Linux文本报告生成器(格式化文本) 本质是gawk,awk是软连接(快捷方式)

正则表达式

基本正则表达式BRE集合

字符 作用 举例/说明
^ 尖角号,用于模式最左边,匹配以某字符串开头的行 ^apple,匹配以apple单词开头的行
$ 美元符,用于模式最右边,匹配以某字符串结尾的行 abc$,匹配以abc结尾的行
^$ 组合符,表示空行 匹配以空字符开头、空字符结尾的行,也就是空行
. 小数点,匹配任意一个有且只有一个字符,不能匹配空格 一行有多个字符的情况呢?是算一个字符还是多个字符然后匹配其中一个?
\ 反斜杠,转义字符,用于还原字符原本的含义 “\.”,输出的结果是一个普通的小数点
* 星号,匹配前一个字符连续出现0次或1次以上,重复0次代表空,即匹配所有内容 a*,表示匹配多个连续的a字符
.* 组合符,匹配所有内容除了空行 .*,输出所有行的内容除了空行
^.* 组合符,匹配任意多个字符开头的内容 挺奇怪的,有点抽象
.*$ 组合符,匹配任意多个字符结尾的内容 挺奇怪的,有点抽象x2
[abc] 中括号,匹配中括号中的任意一个字符,a或b或c,也可以写成[a-c] ^[a-z],用这个不就实现了匹配以任意小写字母开头的行嘛
[^abc] 中括号内带尖角符,匹配除了中括号中的任意一个字符的其它字符 相当于对[abc]的结果取反嘛

补充

\d:表示一个十进制的数字 [0-9] \D:表示非数字 \w:表示一个字 [0-9a-zA-Z_]_ \W:表示除[0-9a-zA-Z_]之外的字符 \s:表示一个空白字符(空格,tab,换页符等) \S:表示一个非空白字符

拓展正则表达式ERE集合

拓展正则必须使用grep -E 才能生效

TIPS:

egrep不推荐使用,使用grep -E代替

grep不加参数时,需要在特殊字符前加转义符\才能识别为正则表达式

字符 作用 说明
+ 加号,匹配前一个字符一次或者多次 a+,表示匹配多个a
[abc]+ 中括号加号组合,匹配中括号中的a或b或c,一次或者多次 也可以写成[a-c]+
? 问号,匹配前一个字符0次或者1次 a?,表示匹配0个a或最多1个a
| 竖杠,表示或者,同时过滤多个字符串 a|b|c
() 小括号,分组过滤,括号中的内容为一个整体 (?)
a{n,m} 表示匹配a字符最少n次,最多m次 任意字符+{最少值,最多值}
a{n,} 表示匹配a字符最少n次
a{,m} 表示匹配a字符最多m次
a{z} 表示匹配a字符正好z次
\> 最右侧,代表精确匹配 ^(abc|123)\>,表示匹配到abc、123的内容结束,不会匹配到abc1、abc2、1234、123d
\< 最左侧,代表精确匹配 案例

awk的功能主要是:

  1. 将文件逐行读入

  2. 以空格、制表符(TAB键)为默认分隔符将每行切片

  3. 切开的部分再进行各种分析

grep命令

全拼:Global search REgular expression and Print out the line.

作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行匹配检查,打印匹配到的行

模式:由正则表达式的元字符文本字符所编写的过滤条件

语法

1
2
grep [option] [pattern] <file>
#命令+选项+模式+操作文件

常见参数[option]

-i 忽略大小写
-o 只输出匹配的内容,仅仅显示匹配到的字符串本身
-v 显示不能被模式匹配到的行,相当于取反,即排除匹配的项
-E 支持使用拓展正则表达式元字符
-q、–quiet、–slient 静默模式,即不输出任何信息

-n 显示匹配行的行号

-c 统计匹配到的行数

–color=auto 为grep过滤结果添加颜色

-w 只过滤单词

其它参数

-m 匹配内容最多出现的次数

-l 只打印匹配到内容的文件名print only names of FILEs containing matches

grep命令之基本正则实践

首先,准备文本文件REg1.txt

1
2
3
4
5
6
7
8
9
10
I am studying REg.
I like grep.

My phone number is +86 123456789000

#我是注释
aoooz
aooz
aoz
az

^ 尖角号,用于模式最左边,匹配以某字符串开头的行

1
2
3
4
5
```

> $ 美元符,用于模式最右边,匹配以某字符串`结尾`的行

```bash

TIPS:

在Linux平台下,所有文件内容行的结尾都有一个$

可以使用cat -A或者cat -En查看

. 小数点,匹配任意一个有且只有一个字符,不能匹配空格

1

* 星号,匹配前一个字符连续出现0次或1次以上,重复0次代表空,即匹配所有内容

1

.* 组合符,匹配所有内容除了空行

1
2
3
4
5
6
7
8
```



> ^.* 组合符,匹配任意多个字符`开头`的内容

```bash

.*$ 组合符,匹配任意多个字符结尾的内容

1
2
3
4
5
6
7
8
```



> [abc] 中括号,匹配中括号中的任意一个字符,a或b或c,也可以写成[a-c]

```bash

[^abc] 中括号内带尖角符,匹配除了中括号中的任意一个字符的其它字符

1
2
3
4
5
6
7
8
```



### grep命令之拓展正则实践
#### \+ 加号,匹配前一个字符一次或者多次 a+,表示匹配多个a

```bash

[abc]+ 中括号加号组合,匹配中括号中的a或b或c,一次或者多次,也可以写成[a-c]+

1

? 问号,匹配前一个字符0次或者1次;a?,表示匹配0个a或最多1个a

1

| 竖杠,表示或者,同时过滤多个字符串,a|b|c

1

() 小括号,分组过滤,括号中的内容为一个整体, (?)

1

a{n,m} 表示匹配a字符最少n次,最多m次,任意字符+{最少值,最多值}

1

a{n,} 表示匹配a字符最少n次

1
 

a{,m} 表示匹配a字符最多m次

1

a{z} 表示匹配a字符正好z次

1