正则表达式概述
在讲sed和awk之前,先要了解什么是正则表达式。正则表达式分为“基础正则表达式”和“扩展正则表达式”。正则表达式是一个字符串处理的标准依据,是使用单个字符搜索、匹配一系列符合某个语法规则的字符串。由a~z以及特殊字符(元字符)组成。如果要以正则表达式的方式处理字符串,就必须使用支持正则表达式的工具。如下表:
文本处理工具 | 基础正则表达式 | 扩展正则表达式 |
---|---|---|
vi编辑器 | 支持 | |
grep | 支持 | |
egrep | 支持 | 支持 |
sed | 支持 | |
awk | 支持 | 支持 |
基础正则表达式
基础正则表达式是常用的正则表达式部分。下表列出常用的元字符及作用。
元字符 | 作用 |
---|---|
\ | 转义字符,用于取消特殊符号的含义,如:!、\n等 |
^ | 匹配字符串的开始位置,如^hello,匹配以hello开头的行 |
$ | 匹配字符串的结束位置,如world$,匹配以world结尾的行 |
. | 匹配除了\n(换行)以外的任意一个字符 |
[list] | 匹配list列表中的一个字符,如[0-9]匹配任意一个数字 |
[^list] | 匹配不在list列表中的一个字符,如[^0-9]匹配除了0-9以外的任意一个字符 |
{n} | 匹配前面的子表达式n次,如[0-9]{2}匹配两位数字 |
{n,} | 匹配前面的子表达式最少n次,如[0-9]{2}匹配两位数字或者两位以上的数字 |
{n,m} | 匹配前面的子表达式最少n次,最多m次如[a-z]{2,3}匹配两到三位的小写字母 |
* | 匹配前面的表达式0次或者多次 |
以/etc/passwd文件为例,我备份了一下做了一些修改
[root@localhost ~]# cp -p /etc/passwd /root/passwd.bak
下面以grep工具,对基本元字符的使用做一下介绍。
对于过滤的表达式如果匹配到会标红。
扩展正则表达式
扩展正则表达式是基础正则表达式的扩充与深化。常用的扩展元字符如下表:
元字符 | 作用 |
---|---|
+ | 匹配前面的子表达式至少1次,例如:ab+c,将匹配b最少一次 |
? | 匹配前面的子表达式0次或者1次,例如:ab?c,将匹配ac或者abc |
() | 将()中的字符串作为一个整体来匹配,例如:a(bc)d,将匹配ad或者abcd |
| | 以或的方式匹配字符串,例如:abc|abd,将匹配abc或者abd |
下面以grep工具,对扩展元字符的使用做一下介绍。使用grep工具需要配合“ -E ”选项才能使用扩展元字符,egrep工具与“grep -E”功能相同,所以基本都用egrep工具结合扩展元字符。
Sed工具
基本语法
- sed -e ‘编辑指令’ 文件1 文件2 …
- sed -n -e ‘编辑指令’ 文件1 文件2 …
- sed -i -e ‘编辑指令’ 文件1 文件2 …
常用选项
- -e 指定要执行的命令,只有一个执行命令时可以省略。
- -n 只输出执行编辑指令之后的行,读入时不显示。
- -i 直接编辑文件,而不输出结果。
常用指令
- -p 输出指定行
- -d 删除指定行
- -s 替换字符串,用法与vi编辑器相同,格式:s/就字符串/新字符串/g
- -r 读取指定文件
- -w 保存为文件
- -i 在当前行前面插入一行或多行
- -a 在当前行后面插入一行或多行
Awk工具
基本语法
- awk 选项 ‘模式或条件{编辑指令}’ 文件名
- 模式决定何时对数据进行操作,例如BEGIN,END;模式也可以为条件语句、复合语句或正则表达式。
- awk -f 脚本文件 文件名
常见内置变量
- FS:指定每行文本以什么字段分隔,默认为空格
- OFS:指定以什么字段连接文本
- NF:当前处理的行的字段个数
- NR:当前处理的行号(序号)
- $0:当前处理行的整行的文本内容
- $n:当给处理行的第n个字段