当前位置:网站首页>shell编程之正则表达式与文本处理器

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

2022-08-10 21:23:00 灌南牛x人

目录

正则表达式

正则表达式定义

正则表达式组成

基础正则表达式元字符

扩展正则表达式

文本处理工具

grep 命令

cut  列截取工具

sort 排序工具

 uniq 去重工具

 tr  修改工具

 总结

引言:正则表达式,又称规则表达式。(Regular Expression),在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式通常被用来检索,替换那些符合某个模式(规则)的文本。

正则表达式

正则表达式定义

正则表达式,又称正规表达式,常规表达式

使用字符串来描述、匹配一系列符合某个规则的字符串

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

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

正则表达式组成

普通字符

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

元字符

在正则表达式中具有特殊意义的专用字符

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

基础正则表达式:BRE

扩展正则表达式: ERE

基础正则表达式元字符

支持的工具: grep、egrep、sed、awk

基础正则表达式是常用的正则表达式部分

元字符作用
*

匹配前面子表达式0次或者多次

例:goo*d,go.*d

[list]

匹配list列表中的一个字符

例:go[loa]d,[a-z],[0-9]匹配任意一位数字

[^list]

匹配任意非list列表中的一个字符

例:[^0-9],[^a-z]匹配任意一位非小写字母

\{n,m\}

匹配前面子表达式n到m次

例:go\{2,3\}d,'[0-9]\{2,3\}'匹配两位到三位数字

\{n,\}

匹配前面子表达式不少于n次

例:go\{2,\}d,'[0-9]\{2,\}'匹配两位及两位以上的数字

\{n\}

匹配前面子表达式n次

例:go\{2\}d,'[0-9]\{2\}'匹配两位数字

.

匹配除\n之外的任何一个字符

例:go.d , g..d

$

匹配字符串结束的位置

例:word$,^$匹配空行

^

匹配字符串开始的位置

例:^a,^the,^#,^[a-z]

\

转义字符,用于取消特殊符号的的含义

例:\!,\n,\$等

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

扩展正则表达式

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

元字符作用
+

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

例:go+d,将匹配至少一个o,如god,good,goood等

匹配前面子表达式0次或一次

例:go?d,匹配将为gd或者god

()

将括号内的字符创作为一个整体

例:g(oo)+d,将匹配oo整体一次以上

|

以或的方式匹配字符条串

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

文本处理工具

grep 命令

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

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

常用选项
-E将样式为延伸的正则表达式来使用。
-c计算符合样式的列数。
-i忽略字符大小写的差别。
-n列出所有匹配的文本行,并显示行号
-o只显示被模式匹配到的字符串
-v显示不包含匹配文本的所有行。
--color=auto可以将找到的关键词部分加上颜色的显示

  -c  统计zmj的行数  不显示内容

  -i  不区分大小写查找文件中所有the的行

我先创了一个测试文件,里面是英文短文

  -v   取反    查找文件中,没有the的行显示出来

 

  将非空行写入到2.txt文件

 

 -n  查找并显示行数 

 若反向选择,如查找不包含“the”字符的行,则需要通过 grep 命令的“-v”选项实现,并配合“-n”一起使用显示行号。

利用中括号“[]”来查找集合字符 

 查找“oo”前面不是“t”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的

首与行尾字节 ^ $,^ 符号,在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!

 可以使用“grep -n‘[^a-z]oo’test.txt”命令实现,其中“a-z”表示小写字母,大写字母则通过“A-Z”表示。 

 查找包含数字的行可以通过“grep -n ‘[0-9]’ ceshi.txt”命令来实现

  基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)

 过滤出以字符和数字开头的行,显示行号 (中括号里取反,中括号外^以.,..开头)

 

过滤出以.结尾的行

因为小数点(.)在正则表达式中也是一个元字符,所以在这里需要用转义字符“\”将具有特殊意义的字符转化成普通字符

 egrep 

当查询空白行时,执行“grep -n‘^$’ test.txt”命令即可  

查找任意一个字符“.”与重复字符“*”

 在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾。

 若查询包含至少两个 o 以上的字符串,则执行“grep -n 'ooo*' test.txt”命令即可

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

  查找连续字符范围“{}”

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

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

 例题

首先查到列出所有log文件并且重定向给grep
使用grep 查找error 的行
使用grep 来查找不包含info 的行

cut  列截取工具

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

常用选项
-b按字节截取
-c

按字符截取,常用于中文

-d指定以什么为分隔截取,默认为制表符
-f通常和-d一起

案例

分割打印passwd第7列 

 分割打印passwd第1列和第7列 

 查看当前登录用户的第4个字节

  -b 与 -c 的区别

  cut只擅长于处理单个字符为间隔的文本,-b只能分割字母,-c既可以分割字母也可以分割中文

sort 排序工具

sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样

语法:sort [选项]  参数

常用选项
-t指定分隔符,默认使用[Tab]吧 键或空格分隔
-k指定排序区域,哪个区间排序
-n按照数字进行排序,默认是以文字形式排序
-u

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

-r

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

-o

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

-f忽略大小写,会将小写的字母都转换为大写字母来进行比较
-b忽略每行前面的空格

案例

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

 以冒号为分隔符,以数字大小对第三列排序(升序)

  以冒号为分隔符,以数字大小对第三列排序(降序)

-u 

 

 uniq 去重工具

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

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

uniq [选项] 参数

常用选项
-c

对重复的行进行计数

-d仅显示重复行
-u仅显示出现一次的行

案例

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

 结合sort 命令排序去重

 结合sort使用,过滤出重复行 (结合cat上面查看的看

  过滤出不重复的行

  查看登陆用户

 查看登陆过系统的用户

 tr  修改工具

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

语法   tr [选项] .. SET1 [SET2]

 从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。

常用选项
-d删除字符
-s删除所有重复出现的字符,只保留第一个

将所有小写改成大写 

 

当字符数量不对等时,相同字符只识别后一个,剩下未对应的全是最后替换字符 

即a-s  p-a(pp相同去后一个a)  le-r   

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

  多个字符替换成一个/

  删除字符a​​​​​​​

删除所有字符的appl 

 

 对p字符去重,只保留第一个 

 查看登陆ip和使用者个数

 查看客户端和监听服务端个数

 总结

本编文章主要讲述了基础正则表达式元字符的用法以及扩展正则表达式元字符的用法,还有grep命令的使用方法和一些参数及案例,其中还有一些文本处理器的常用方法案例(cut、sort、uniq、tr)

原网站

版权声明
本文为[灌南牛x人]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_67565536/article/details/124622591