一、正则表达式
正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符。它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。
被vim、sed、awk、grep调用
正则表达式 其实只是用来匹配行的一个工具,用来查找符合条件的行;
grep使用时 不同加// 双斜杠括住正则表达式。grep 使用正则表示式只负责找到它,直接在引号中使用正则表达式;
sed使用时得加//
awk使用时也得加
1.1基本正则表达式
正则表达式由元字符组成,那么这些元字符都有哪些,分别代表了什么含义呢?
元字符 | 含义 |
---|---|
^ | 行首定位符 |
$ | 行尾定位符 |
. | 匹配任意单个字符 |
* | 匹配前导符0到多次 |
[ ] | 匹配指定范围内的一个字符 |
[^] | 匹配不在指定组内的字符 |
\ | 用来转义元字符 |
< | 词首定位符 |
> | 词尾定位符 |
() | 组合/替换 |
x{m} | 字符x重复出现m次 |
我们接下来以grep为例进行逐个讲解
1.1.1 ^ 行首定位符
^x 查找以x为开头的行
exp:
1.1.2 $ 行尾定位符
x$ 查找以x为结尾的行
exp:
1.1.3 . 匹配任意单个字符
. 代表任意字符都可以
exp:
1.1.4 * 匹配前导符 0 到 多次
查找 在 * 前的字符出现了0 到多次的 行
exp:
前导符为o
1.1.5 .* 匹配所有字符
这是 * 和 . 的组合,意思是 任意字符出现了 0 到多次, 那么可以认为是任意文件,即输出文件中所有内容;
1.1.6 [ ] 匹配指定范围内的一个字符
例如 [ a-z ] 就是任意一个小写字母 ; [ A-Z] 匹配任意一个大写字母 ; [ 0-9 ] 匹配任意一个数字
exp:
1.1.7 [^] 取反 匹配不在指定组内的字符
exp:
1.1.8 \ 用来转义元字符
exp:
这就是 \ 的作用,用来转义,把具有特殊含义的字符给脱去特殊意义,而是仅仅作为一个字符而已。
1.1.9 < 词首定位符
用来确定单次的开始部分
exp:
1.1.10 > 词尾定位符
exp:
1.1.11 ()
(…) 匹配稍后使用的字符的标签
格式为 / 括号把要匹配的字符分成几部分/ \ 后面的数字代表前面的第几个括号里的东西放在这/
1.1.12 x{m} 代表 x 出现了m 次
1.1.13 x{m,} 字符x重复出现m次以上
1.1.14 x{m,n} 字符x重复出现m到n次
1.2扩展正则表达式
元字符 | 含义 |
---|---|
+ | 匹配1~n个前导字符 |
? | 匹配0~1个前导字符 |
a 管道符b | 匹配a或b |
() | 组字符 |
使用扩展正则表达式 要用 egrep 或者 grep -e 命令 文件
接下来以grep为例
1.2.1 + 匹配1到n个前导字符
与 * 类似,只不过范围不一样而已,
exp:
1.2.2 ? 匹配0到1个前导字符
1.2.3 a管道符b 匹配 a 或者b
1.2.4 () 组字符
可与 管道符一起使用
exp:
二、grep
过滤,查找文档中的内容 。 在上一节以grep为例,不再细讲
== grep 使用正则表达式时不用加// ,也就是双斜杠 ==
grep 后面使用单双引号都可以
== grep 需要在使用正则表达式时加上e 为egrep 或者使用 grep -e ==
2.1 分类
grep 支持正则表达式的元字符
egrep 既支持正则表达式元字符又支持扩展表达式元字符
2.2 参数
2.2.1 -q 静默
即不会有任何反应
exp:
2.2.2 -v 取反
exp:
2.2.3 -R 查看目录下的相关信息
exp:
2.2.4 -o 找到关键词即可
exp:
2.2.5 -Cx x代表数字 意为查找相关行的上下x行
exp:
2.2.6 -Bx 前x行 ; -Ax 后x行
exp:
2.2.7 -n 过滤并且带行号
三、sed
sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;
3.1格式
1 .sed 选项 '(范围,不加默认为所有行)命令 针对的对象 ’ 文件 # 选项 例如 -r -ri -r是针对正则表达式的 ;-ri 是 直接进行修改文件的
2 .sed 选项 –f 脚本 文件
3.2示例
命令 | 含义 |
---|---|
d | 删除 |
s | 替换某个 |
r | 读文件 |
w | 写文件 |
a | 追加 |
i | 插入命令 |
c | 替换整行 |
n | 获取下一行 |
! | 取反 |
e | 多重编辑 |
hHGgx | 暂存编辑 |
示例:
3.2.1 d 删除
sed -r ’ /匹配行/d’ 文件
3.2.2 s 替换
格式 sed -r ‘s/要替换的匹配行/替换成什么/’ 注意这里的替换仅为替换每行出现的第一个字符,全局替换要加g
3.2.3 r 读取新文件
在当前文件中,读取其他文件“部分”内容。
3.2.4 w 另存为
sed -r ’ (范围,不加默认为整个文档)w 另存到哪个文件 ’ 文件
3.2.5 a 追加
sed -r ’ (范围,不加默认为每一行都执行) a 追加对象 ’ 文件
3.2.6 i 插入命令
sed -r ’ (范围,不加默认为每一行都执行) i 插入对象 ’ 文件
3.2.7 c 整行替换
sed -r ’ (范围 ,不加默认为每一行) c 要替换成什么 ’ 文件
3.2.8 获取下一行
通常和其他命令一起使用
大括号{} 里 加入其他命令
3.2.9 ! 取反
对范围取反,和其他命令一起使用, sed -r ’ 范围 ! 命令 ’ 文件
3.2.10 e 多重编辑
用于同时执行多条命令 sed -r -e ’ 命令1 ’ -e ’ 命令2’ -e ‘命令3’ … 文件 针对一个文件处理多条命令
四、awk
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。
数据可以来自标准输入、一个或多个文件,或其它命令的输出。
它支持用户自定义函数和动态正则表达式等先进功能,
awk的处理文本和数据的方式是这样的,
它逐行扫描文件,从第一行到最后一行,
寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕)。
语法:BEGIN{} {} END{}
BEGIN{} begin发生在行处理前执行的命令(注意大写);
{} 行处理时具体执行的命令,读一行执行一次;
END{} 行处理后执行的命令
awk由模式和动作两部分组成
模式:可以是条件测试,正则,复合语句
动作:可以是打印,计算等。 比如print
以下都为动作
4.1 内部变量
内部变量设置在行处理模式之前 也即在BEGIN里
4.1.1FS OFS
FS 输入字段分隔符 以什么作为分割点
OFS 输出字段分隔符 以什么作为输出时的分割点
4.1.2 RS ORS
RS 输入记录(行)分隔符,默认换行符 默认是以空格作为行分割符,这里重新定义
ORS 输出记录(行)分隔符,默认换行符
4.1.3 FNR NR
FNR 多文件独立编号
NR 多文件汇总编号
4.2 格式化输出
4.2.1 print
例如 {print $1,$2 " 编辑想要输出的内容 ,配合变量使用 "…} 行处理模式时,print 默认以空格作为字段分割符
4.2.2 printf
补充: \n 为换行符
加上管道符:
4.3 模式 找某一行
awk由模式和动作两部分组成
模式:可以是条件测试,正则,复合语句
动作:可以是打印,计算等。 比如print
任何awk语句都由模式和动作组成。模式部分决定动作语句何时触发及触发事件。
如果省略模式部分,动作将时刻保持执行状态。每一行都会有动作。
模式可以是任何条件语句或复合语句或正则表达式。有模式的话,就是对模式对应的行进行动作。
接下来我们看模式
4.3.1 以正则表达式为寻找
4.3.2 以数值寻找
运算符 含义 示例
/# < 小于 x<y
/# <= 小于或等于 x<=y
/# == 等于 x==y
/# != 不等于 x!=y
/# >= 大于等于 x>=y
/# > 大于 x>y
awk ’ 比较 ’ 文件
4.3.3 以字符串寻找
补: 字符要加双引号
4.3.4 多条件查询
&& 代表两边条件同时满足
|| 代表两边条件有一个满足即可
4.4 awk 脚本编程
4.4.1条件判断
4.4.1.1 if单分支语句
语法:{if(表达式){语句;语句;…}}
4.4.1.2 双分支语句
语法:{if(表达式){语句;语句;…}else{语句;语句;…}}
4.4.1.3 多分支语句
语法:{if(表达式1){语句;语句;…}else if(表达式2){语句;语句;…}else if(表达式3){语句;语句;…}else{语句;语句;…}}
4.4.2 循环
与行处理模式之前的BEGIN结合使用
4.4.2.1 while
语法1: awk 'BEGIN {while (条件){执行语句}}’
语法2:awk -F: ‘{while (条件){执行语句}}’ 文件
4.4.2.2 for
语法1: awk 'BEGIN{for(初值,条件,步长){执行}}'
语法2: awk -F: ‘{for(初值,条件,步长){执行}}’ 文件
4.4.3 数组
为了她苦练这吉他
当初调断了几根弦
为了弹她爱听的歌
手上长满了茧