Shell 编程正则表达式与文本处理器

西特张

关注

阅读 228

2022-05-05

目录

前言

一、正则表达式

1.1 概述

1.1.1 正则表达式定义

1.1.2  正则表达式的分类

1.1.3   Linux中文本处理工具

1.2  基础正则表达式

 1.3  扩展正则表达式

二、 扩展命令

 2.1  cut命令

2.2 sort 命令

2.3 uniq  命令

2.4  tr 命令 

三、总结


前言

 

Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。熟练使用这三个工具可以提升运维效率。Linux 三剑客以正则表达式作为基础,而在Linux系统中,支持两种正则表达式,分别为“标准正则表达式”和“扩展正则表达式”。三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列。

一、正则表达式

1.1 概述

1.1.1 正则表达式定义

正则表达式,又称规则表达式。(英语:Regular Expression),在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本,正则表达式不只有一种,而且 Linux 中不同的程序可能会使用不同的正则表达式,如:支持的工具:grep sed awk egrep

通常用于判断语句中,用来检查某一 字符串是否满足某一格式

正则表达式是由普通字符与元字符组成

普通字符包括大小写字母、数字、标点符号及一些其他符号

元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式

1.1.2  正则表达式的分类

正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用正则表达式最基础的部分。在Linux系统中常见的文件处理工具中grep与sed支持基础正则表达式,而egrep与awk支持扩展正则表达式。

Linux 中常用的有两种正则表达式引擎

基础正则表达式:BRE

扩展正则表达式: ERE

1.1.3   Linux中文本处理工具

文本处理工具

基础正则表达式

扩展正则表达式

Vi 编辑器

支持

Grep

支持

Egrep

支持

支持

Sed

支持

Awk

支持

支持

1.2  基础正则表达式

基础正则表达式是常用的正则表达式部分 处理普通字符外,常见到以下元字符

元字符

作用

\

转义字符,\!、\n等

^

匹配字符串开始的位置,例如:^a、^the、^#

$

匹配字符串结束的位置,例如:word$

.

匹配除\n之外的任意的一个字符,例如:go.d、g..d

*

匹配前面子表达式0次或者多次,例如:goo*d、go.*d

[list]

匹配list列表中的一个字符,例如:go[o|a]d、[abc]、[a-z]、[a-z0-9]

[^list]

匹配任意不在list列表中的一个字符,例如:[^a-z]、[^0-9]、[^a-z0-9]

\{n,m\}

匹配前面的子表达式n到m次,例如:go\{2,3\}d

\{n\}

匹配前面的字表达式n次,例如:[0-9]\{2\}匹配两位数字

\{n,\}

匹配前面的字表达式不少于n次,例如:[0-9]\{2,\}匹配两位及两位以上数字

注:   egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”

egrep -E -n 'wo{2}d' test.txt   //-E 用于显示文件中符合条件的字符

案例:以gerp 工具介绍基础正则表达式

grep命令使用正则表达式来搜索文本,并且把匹配的文本打印出来。

格式:grep [选项]..... 查找条件   目标文件

常用选项:

-c  :只打印匹配的文本行的次数,不显示文本内容。

-i  : 匹配时忽略字母大小写

-n : 列出所有匹配的文本行,并显示行号

-v  : 只显示不匹配的文本行,反向选择,显示与搜索字符串不相符的行。

-E  : 开启扩展(extend)的正则表达式

--color=auto :可以将找到的关键词部分加上颜色的显示

-o  :  只显示被模式匹配的字符串

案例: 筛选文件中包含root的行 /etc/passwd 文件为例

统计root字符总行数

筛选出以root开头,以bash结尾的行

筛选出不包含root的行

筛选出ens33 里的IP     使用  -o 选项   head -1 显示开头的第一个

筛选出r  和d  之间有两个字符的行筛选bin前面不是s的行

筛选出空白的行

 筛选出含te 或ts 的行

查找0字符出现1次已上的行

查找多个模式时用-e 参数

 筛选出文件包含的the不区分大小写的行  -n :显示行号; -i:不区分大小写

筛选文件中sh带有i或o的字符的行 

若想要查询oo、ooo、oooo等资料,则需要使用星号(*)元字符。但需要注意的是,“*”代表的是重复零个或者多个前面单字符。“o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符,所以执行“grep -n 'o*' test.txt”命令将会文本中所有的内容都输出打印。如果是“oo*”,则第一个o必须存在,第二个以上的字符串,则执行“grep -n 'oo*' test.txt”命令即可

 查找两个oo前面不是w的字符串

查找包含数字的行

 查找以小写字母的开头的行,通过“^[a-z]”规则来过滤(大写是A-Z)注意^是在[]外面哦,

“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]” 符号外则代表定位行首

查询w 和d 之间任意两个字符 

查询以w开头,d结尾,中间至少包含一个o的字符串

查询w开头,d结尾。中间的字符可有可无的字符串

 查询w开头,d结尾,中间包含的2~5个o的字符串

查询w开头,d结尾,中间包含的2个或2个以上的o字符串

 或者使用egrep  命令时不需要用\转义符

 1.3  扩展正则表达式

通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用  范围更广的扩展正则表达式。例如,使用基础正则表达式查询除文件中空白行与行首为“#”之外的行(通常用于查看生效的配置文件),执行“grep -v‘^$’test.txt | grep -v‘^#’”即可实现。这里需要使用管道命令来搜索两次。如果使用扩展正则表达式, 可以简化为“egrep-v‘^$|^#’test.txt”,其中,单引号内的管道符号表示或者(or)。

grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。awk 命令在后面的小节进行讲解,这里我们直接使用 egrep 命令。egrep 命令与 grep 命令的用法基本相似。

egrep 命令是一个搜索文件获得模式,使用该命令可以搜索文件中的任意字符串和符号,也可以搜索一个或多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字或一个句子。

扩展正则表达式是对基础正则表达式的扩充与深化。

常用的扩展元字符及作用:

元素符号

作用

+

匹配前面子表达式1次以上

例:go+d,将匹配至少一个o

零个或者一个的前一个字符;0次或1次

go?d,将匹配 gd 或 god

|

使用或者(or)的方式找出多个字符

例:good|food,将匹配good或food

例:g(oo|la)d,将匹配good或glad

()

将括号例的字符串作为一个整体

例:(xyz)+,将匹配xyz整体一次以上,如xyzxyz

()+

辨别多个重复的组

例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思

案例:以egrep为工具,介绍扩展正则表达式

匹配至少包含一个0的行

匹配包含root 或ntp的行

匹配rt或者rot的行

 过滤文件中的空白的行与#开头的行

二、 扩展命令

 2.1  cut命令

cut:列截取工具

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一

常用选项:

-b:按字节截取

-c:按字符截取,常用于中文

-d:指定以什么为分隔符截取,默认为制表符

-f:通常和-d一起

案例:截取字符

方法一:截取/etc/passwd下以:为分隔符的第7列

方法二:使用awk 打印第7列

 截取/etc/passwd下以:为分隔符的第1和3列

查看当前登录的用户  使用who 命令

 截取第一列的字节   -b 选项

截取第3列的字符(常用于中文)

注意:cut只擅长于处理单个字符为间隔的文本

2.2 sort 命令

sort  命令是一个以行为单位对文件内容进行排序的工具,可以根据不同的数据类型来排序

例如数据和字符的排序方法不一样

sort [选项] 参数

常用选项:

-t:指定分隔符,默认使用[Tab]吧 键或空格分隔

-k:指定排序区域,哪个区间排序

-n:按照数字进行排序,默认是以文字形式排序

-u:等同于 uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功

-r:反向排序,默认是升序,-r就是降序

-o:将排序后的结果转存至指定文件

-f: 忽略大小写,会将小写的字母都转换为大写字母来进行比较

-b: 忽略每行前面的空格
案例:

sort passwd    //不加任何选项默认按第一列升序,字母的话就是从a到z由上而下显示

sort -n -t:  -k3  passwd   //以冒号为分隔符,以数字大小对第三列排序(升序)

sort -nr -t: -k3 passwd   //以冒号为分隔符,以数字大小对第三列排序(降序)

sort -nr -t: -k3 passwd -o passwd.bak    //将输结果不在屏幕上输出而是输出到passwd.bak文件

 sort -u passwd.bak     //去掉文件中重复的行(重复的行可以是不连续的)

2.3 uniq  命令

主要用于去除连续的重复行

注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重

(1)语法

uniq [选项] 参数

(2)常用选项

-c:对重复的行进行计数;

-d:仅显示重复行;

-u:仅显示出现一次的行

案例:创建一个水果类型的文件

统计重复行的次数,不连续的重复行他不算做重复行

结合sort使用,过滤出重复行

 结合sort使用,过滤出不重复的行

结合sort使用,去重  。也可以直接用sort -u

查看登陆过系统的用户

2.4  tr 命令 

tr:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符

tr命令常用来对来自标准输入的字符进行替换、压缩和删除

用法:tr [选项]    参数

常用选项

-d :删除字符

-s  :删除所有重复出现的字符,只保留第一个

案例:把小写的字符替换大写的字符

替换是一一对应的字母的关系

把替换的字符用单引号引起来,包括特殊字符

 删除所有a

tr -d 'apple'    //把所有含有这5个字母的都删除 

tr -d '\n'       //删除换行符

tr -s 'p'       //对p字符去重,只保留第一个

tr -s '\n'   //遇到多个回车只保留一个回车,相当于去除空行

查询主机有几台机器登录, 删除所有的重复字符只保留一个,列出空格作为分隔符,第5列,列出:分割第一列,在排序,计数重复的行数

查看当前主机的连接状态

三、总结

1.shell编程正则表达式分为:基础正则表达式和扩展基础表达式

2.grep与sed支持基础正则表达式

3.egrep与awk支持扩展正则表达式

精彩评论(0)

0 0 举报