目录
一、正则表达式
1.引言--什么是正则表达式
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本
正则表达式不只有一种,而且 LINUX 中不同的程序可能会使用不同的正则表达式,如:
工具:grep sed awk egrep
1.1正则表达式的功能
(1)正则表达式---通常用于判断语句中,用来检查某一字符串是否满足某一格式
(2)正则表达式是由普通字符与元字符组成
(3)普通字符包括大小写字母、数字、标点符号及一些其他符号
(4)元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
2.基础正则表达式(BRE)
基础正则表达式常见元字符:(支持的工具:grep、egrep、sed、awk)
2.1特殊字符
特殊字符 | 描述 | 示例及解释 |
\ | 转义符,将特殊字符进行转义,忽略其特殊意义 | a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义 |
^ | 匹配行首 | ^tux匹配以'tux`开头的行 |
$ | 匹配行尾 | tux$匹配以tux结尾的行 |
. | 匹配除换行符\r\n之外的任意单个字符 | a.b匹配a和b之间任意一个字符 |
[list] | 匹配list列表中的一个字符 | go[ola]d匹配gold、good、goad,也可以是[a-z]匹配所有小写字母 |
[^list] | 匹配任意不在list列表中的一个字符 | [^a-z]匹配任意非小写字母的字符 |
* | 匹配前面子表达式0次或者多次 | goo*d匹配god、good、gooooood |
\{n\} | 匹配前面的子表达式n次 | go\{2\}d~匹配good、[0-9]\{2\} 匹配两位数字 |
\{n,\} | 匹配前面的子表达式不少于n次 | go\{2,\}d匹配good、goood等、[0-9]\{2,\}匹配两位及两位以上数字 |
\{n,m\} | 匹配前面的子表达式n到m次 | go\{2,3\}d匹配good、goood、[0-9]\{2,3\}`匹配两位到三位数字 |
注:egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”
2.2定位符
^ 匹配输入字符串开始的位置
$ 匹配输入字符串结尾的位置
2.3非打印字符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
3.扩展正则表达式(ERE)
通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式
下面举几个例子说明:
+ 作用:重复一个或者一个以上的前一个字符
? 作用:零个或者一个的前一个字符
| 作用:使用或者(or)的方式找出多个字符
() 作用:查找“组”字符串
()+ 作用:辨别多个重复的组
4.元字符操作的案列
查找特定字符以及反向选择
利用中括号“[]”来查找集合字符以及查找包含重复单个字符
大小写字母查找"a-z"或"A-Z"以及数字查找
查找行首“^”与行尾字符“$”
“^”符号在元字符集合“[]”符号内外的作用是不一样的
查找任意一个字符“.”与重复字符“*”
查找连续字符范围“{}”
二、命令小工具
1.cut:列截取工具
用法:
cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出
如果不指定File参数,cut命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一
选项 | 功能 |
-b | 按字节截取 |
-c | 按字符截取,常用于中文 |
-d | 指定以什么为分隔符截取,默认为制表符 |
-f | 通常和-d一起 |
2.sort排序
是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样
选项 | 功能 |
-t | 指定分隔符,默认使用[Tab]吧 键或空格分隔 |
-k | 指定排序区域,哪个区间排序 |
-n | 按照数字进行排序,默认是以文字形式排序 |
-u | 等同于uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功 |
-r | 反向排序,默认是升序,-r就是降序 |
-o | 将排序后的结果转存至指定文件 |
3.uniq去重
主要用于去除连续的重复行
注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重
选项 | 功能 |
-c | 对重复的行进行计数 |
-d | 仅显示重复行 |
-u | 仅显示出现一次的行 |
4.tr删除
它可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符
选项 | 功能 |
-d | 删除字符 |
-s | 删除所有重复出现的字符,只保留第一个 |
cat fruit | tr " ' " '/'
如果想替换单引号则需要用双引号把单引号引起来,反斜杠转义也不行
三、文本三剑客
1.grep命令
grep [选项]… 查找条件 目标文件
常用选项 | 功能 |
-E | 开启扩展(Extend)的正则表达式 |
-c | 计算找到 '搜寻字符串' 的次数 |
-i | 忽略大小写的不同,所以大小写视为相同 |
-o | 只显示被模式匹配到的字符串 |
-v | 反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!(反向查找,输出与查找条件不相符的行) |
--color=auto | 可以将找到的关键词部分加上颜色的显示 |
-n | 顺便输出行号 |
2.sed命令
2.1什么是sed
sed命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等
2.2sed的特点
(1)文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等
(2)可在无交互的情况下实现相当复杂的文本处理操作
(3)被广泛应用于Shel脚本,以完成自动化处理任务
(4)sed依赖于正则表达式
2.3sed的原理
读入新的一行内容到缓存空间;从指定的操作指令中取出第一条指令,判断是否匹配 pattern ;如果不匹配,则忽略后续的编辑命令,回到第 2 步继续取出下一条指令;如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第 2 步继续取出下一条指令;当所有指令都应用之后,输出缓存行的内容;回到第 1 步继续读入下一行内容;当所有行都处理完之后,结束
2.4常用的操作选项
sed [ 选项 ] ' 操作 ' 参数
选项 | 功能 |
-e |
进行多次编辑
|
-n |
取消默认输出
|
-f |
指定
sed
文件名
|
-i |
直接在源文件中修改
|
-r |
使用扩展正则表达式
|
命令动作 | 功能 |
p |
打印输出
|
d |
删除指定行
|
i |
在指定行之前插入内容
|
a |
在指定行后面插入内容
|
c |
替换指定行所有内容
|
s |
搜索替换
|
2.4.1打印输出
sed默认不支持扩展正则,如果要支持,需要加-r选项
2.4.2增加内容
2.4.3删除
2.4.4替换和搜索替换
这里有个注意点:
c指令是整行替换
s指令是关键词替换
常用的选项:g: 行内全局替换p: 显示替换成功的行w: 将替换成功的行保存至文件中I,i: 忽略大小写
2.4.5插入文件
2.4.6另存为到文件
2.4.7同时编辑
2.4.8分组操作
2.4.9读取完退出
正常情况下 sed 会在读取完所有数据行之后退出,但是我们可以随时使用 q 指令来提前退出 sed
2.4.10sed脚本
3.awk
3.1.概述
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作
3.2工作原理
当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出如果没有定义匹配条件默认是匹配所有数据行, awk 隐含循环,条件匹配多少次动作就会执行多少次逐行读取文本,默认以空格或 tab 键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令
(1)BEGIN 语句设置计数和打印头部信息,在任何动作之前进行(2)END 语句输出统计结果,在完成动作之后执行AWK 执行的流程非常简单:读( Read )、执行( Execute )与重复( Repeat )
3.3基本语法
命令格式:awk 选项 模式或条件 { 操作 } 文件 1 文件 2 ...awk -f 脚本文件 文件 1 文件 2 ..格式: awk 关键字 选项 命令部分 '{xxxx}' 文件名AWK 支持两种不同类型的变量:内建变量 ( 可直接使用 ) ,自定义变量 awk 内置变量(预定义变量)
FS |
指定每行文本的字段分隔符,默认为空格或制表位
|
NF |
当前处理的行的字段个数。在执行过程中对应于当前的字段数,
NF
:列的个数
|
NR |
当前处理的行的行号(序数)在执行过程中对应于当前的行号
|
$0 |
当前处理的行的整行内容
|
$n |
当前处理行的第
n
个字段(第
n
列)。比如
: $1
表示第一个字段,
$2
表示第二个字段
|
FILENAME |
被处理的文件名
(
当前输入文件的名)
|
FNR |
各文件分别计数的行号
|
OFS |
输出字段分隔符(默认值是一个空格)
|
ORS |
输出记录分隔符(默认值是一个换行符)
|
RS |
行分隔符(数据记录分隔,默认为
\n
,即每行为一条记录 )
|
3.4常用案例
3.4.1内建变量
awk
包含几个特殊的内建变量(可直接用)如下所示
| |
FS |
指定每行文本的字段分隔符,默认为空格或制表位
|
NF |
当前处理的行的字段个数
|
NR |
当前处理的行的行号(序数)
|
$0 |
当前处理的行的整行内容
|
$n |
当前处理行的第
n
个字段(第
n
列)
|
FILENAME |
被处理的文件名
|
RS | 行分隔符(数据记录分隔,默认为\n,即每行为一条记录 ) |
patterm和' '不会显示任何东西
print:多打印一遍
字符串引用要添加双引号
重定向输出,文件里有多少行就重新输出多少行
3.4.2内置变量
awk
常用内置变量
| |
$1 |
代表第一列
|
$2 |
代表第二列以此类推
|
$0 |
代表整行
|
NF |
一行的列数
|
NR |
行数
|
扩展生产案例:网卡的IP、流量;根分区的可用量
3.4.3其他内置变量
FS |
输入字段的分隔符,默认是空格
|
OFS |
输出字段的分隔符,默认也是空格
|
FNR |
读取文件的记录数(行号),从
1
开始,新的文件重新重
1
开始计数
|
RS |
输入行分隔符,
默认为换行符
|
ORS |
输出行分隔符,
默认也是为换行符
|
3.5BEGIN、END运算
逐行执行开始之前执行什么任务,结束之后再执行什么任务,用 BEGIN 、 ENDBEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次END一般用来做汇总操作,仅在读取完数据记录之后执行一次
模糊匹配,用~表示包含,!~表示不包含
关于数值与字符串的比较比较符号: == != <= >= < >
逻辑运算 && ||&& 和 || 是逻辑运算符,用于组合多个条件并控制程序流程&& 要求所有条件都为真时才为真,否则为假|| 只要有一个条件为真就为真,全为假时才为假
3.6awk高级用法
3.7awk if语句
3.8BEGIN END循环
awk 还支持 for 循环、 while 循环、函数、数组等第一步:运行 BEGIN{ commands } 语句块中的语句第二步:从文件或标准输入 (stdin) 读取一行。然后运行 pattern{ commands } 语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成第三步:当读至输入流末尾时,运行 END{ commands } 语句块
(1)BEGIN 语句块在 awk 开始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打印输出表格的表头等语句通常能够写在BEGIN 语句块中(2)END 语句块在 awk 从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总都是在END 语句块中完毕,它也是一个可选语句块(3)pattern 语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供 pattern 语句块,则默认运行{ print } ,即打印每个读取到的行。 awk 读取的每一行都会运行该语句块
3.9awk数组
BEGIN 中的命令只执行一次awk数组 的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号
3.10awk循环
筛选日志文件
总结
grep 和 egrep 文本过滤 ( 更适合单纯的查找或匹配文本 )sed 流编辑器 实现编辑的 ( 更适合编辑匹配到的文本 )awk 文本报告生成器 实现格式化文本输出 ( 更适合格式化文本,对文本进行较复杂格式处理 )