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

正则表达式

正则表达式概述

​ 正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。

正则表达式的定义
  • 正则表达式又称正规表达式、常规表达式。

  • 正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

  • 正则表达式是由普通字符与元字符组成的文字模式,模式用于描述在搜索文本时要匹配的一个或多个字符串

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

    • 元字符:那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符在目标对象中的出现模式。常见元字符如下:

      元字符作用
      ^匹配输入字符串的开启位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^”字符本身,请使用"^"
      $匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配'\̲n̲'或‘\r’。要匹配""字符本身,请使用“$”
      .匹配除“\r\n”之外的任何单个字符
      \反斜杠,又叫转义字符,去除其紧跟的元字符或通配符的特殊意义
      *匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“ \ *”
      []字符集合。匹配所包含的一个任意字符。
      [^]赋值字符集合。匹配未包含的一个任意字符。
      [n1-n2]字符范围。匹配指定范围内的任意一个字符
      {n}n是一个非负整数,匹配确定的n次
      {n,}n是一个非负整数,至少匹配n次
      {n,m}m和n均为非负整数,其中n<=m,最少匹配n次且最多匹配m次
  • Linux常见的文本处理器

    • 支持基础正则表达式
      • grep
      • sed
    • 支持扩展正则表达式
      • egrep
      • awk
基础正则表达式
基础正则表达式:grep
基础正则表达式示例
#创建测试文件
[root@localhost ~]# vim test
#添加以下内容
he was short and fat.
he was weating a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
PI=3.14
a wood cross!
Actions speak louder than words

#woood #
#woooooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
1.查找特定字符
#查看包含the的行
[root@localhost ~]# grep -ni 'the' test
3:The home of Football on BBC Sport online.
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword.
-n :显示行号
-i :不区分大小写
#查看不包含the的行
[root@localhost ~]# grep -niv 'the' test
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.
6:PI=3.14
7:a wood cross!
#...省略部分内容
-v :反转查找

#利用[]查找集合字符
[root@localhost ~]# grep -n 'sh[io]rt' test
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.
#[]:中不管有几个字符,都只匹配一个,表示其中的任何字符

#查找字母oo前不是字母w的内容
[root@localhost ~]# grep -n '[^w]oo' test
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
10:#woood #
11:#woooooooood #
13:I bet this place is really spooky late at night!
#查看字母oo前不是消息字母的内容
[root@localhost ~]# grep -n '[^a-z]oo' test
3:The home of Football on BBC Sport online.

#字母前直接用"^"表取反
#[] 前用"^",表示以括号中的字符开头
2.查找首行与行尾
  • 行首:" ^"
  • 行尾:" $"
#查看以字母开头的行
[root@localhost ~]# grep -n '^[a-zA-Z]' test
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.
3:The home of Football on BBC Sport online.
#...省略部分内容
#查看以非字母开头的行
[root@localhost ~]# grep -n '^[^a-zA-Z]' test
10:#woood #
11:#woooooooood #

#查看以点为结尾的行
[root@localhost ~]# grep -n '\.$'  test
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
14:Misfortunes never come alone/single.
15:I shouldn't have lett so tast.
#查询空行
[root@localhost ~]# grep -n '^$' test
9:

3.查找任意字符和重复字符
  • 小数点" . "在正则表达式中是一个元字符,代表任意一个字符。一个点即代表一个字符
  • " * "也是一个元字符,代表重复字符。代表的重复零个或多个前面的单字符
#查找包含四字符单词的行,以w开头,d结尾
[root@localhost ~]# grep -n 'w..d' test
5:google is the best tools for search keyword.
7:a wood cross!
8:Actions speak louder than words
#查询包含两个o的字符
[root@localhost ~]# grep -n 'ooo*' test
#前两个oo为条件,表示包含两个o,而o*表示后面有零个或多个重复的o
4.查找连续字符范围
  • 使用限制范围的字符"{}“。因为”{}“在Shell中具有特殊意义,所以在使用”{}“字符时,需要利用转义字符” \ “,将”{}"字符转换为普通字符
#查询包含两个oo的字符
[root@localhost ~]# grep -n 'o\{2\}' test
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
#以w开头,d结尾中间有2-5个o
[root@localhost ~]# grep -n 'wo\{2,5\}d' test
7:a wood cross!
10:#woood #

扩展正则表达式

  • grep命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用egrep命令或awk命令

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

  • 常用的扩展正则表达式元字符包括以下:

    元字符作用
    +重复一个或一个以上的前一个字符
    ?零个或一个的前一个字符
    |使用或者(or)的方式找出多个字符
    ()查找"组"字符串
    ()*辨别多个重复的组
#查询除空行和开头为“#”的其他所有行
[root@localhost ~]# grep -v '^$' /etc/ssh/sshd_config | grep -v '^#'
#可使用扩展正则表达式改造为
[root@localhost ~]# egrep -v '^$|^#' /etc/ssh/sshd_config

文本处理器:sed

  • sed可以读取文本,并根据指定的条件对文本内容进行编辑,最后输出所有行或者仅输出处理的某些行
  • sed也可以在五交互的情况下实现相当负载的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务
  • sed的工作流程主要包括读取、执行、显示三个过程
    • 读取:sed从输入流中读取一行内容并存储到临时的缓冲区中(又称模式空间:pattem space)
    • 执行:默认情况下,所有sed命令都在模式空间中顺序执行,除非指定了行的地址,否则sed命令将会在所有行上依次执行
    • 显示:发送修改后的内容到输出流。在方式数据后,模式空间将被情空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直到所有内容被处理完
  • sed常用命令选项主要包括以下几种:
选项描述
-e表示用指定命令或脚本来处理输入的文本文件
-f表示用指定的脚本文件夹来处理输入的文本文件
-h显示帮助
-n表示仅显示处理后的结果
-i直接编辑文本文件
  • sed常用操作:
操作描述
a增加,在当前行下面增加一行指定的内容
c替换,将选的行替换为指定内容
d删除,删除选定的行
i插入,在选锭行上面插入一行指定内容
p打印,如果同时指定行,表示打印指定行:如过不指定行,则表示打印所有内容:如果有非打印字符,则以ASCII码输出。其通常于“-n”选项一起使用
s替换,替换指定字符
y字符转换
sed示例
输出符合条件的文本
#输出所有内容
[root@localhost ~]# sed -n 'p' test
#输出第三行
[root@localhost ~]# sed -n '3p' test
#输出3~5行
[root@localhost ~]# sed -n '3,5p' test
#输出所有奇数行
[root@localhost ~]# sed -n 'p;n' test
#输出所有偶数行
[root@localhost ~]# sed -n 'n;p' test
#输出第5行到第10行之间的奇数行
[root@localhost ~]# sed -n '5,10{p;n}' test
#输出第5行到文件尾之间的奇数行
[root@localhost ~]# sed -n '5,${p;n}' test
#输出包含“the”行的
[root@localhost ~]# sed -n '/the/p' test
#输出包含“the”行的行号
[root@localhost ~]# sed -n '/the/=' test
=用来输出行号
#查找某个单词所在的行
[root@localhost ~]# sed -n '/\<wood\>/p' test
删除符合条件的文本
  • 不加-i的情况下,仅仅只是在输出中删除,实际并没有删除内容
#删除空行
[root@localhost ~]# sed '/^$/d' test
#删除第三行
[root@localhost ~]# nl text | sed '3d'
#使用nl能更方便查看是否成功

#删除以 . 为结尾的行
[root@localhost ~]# sed '/\.$/d' test
#注意:有特殊的符号需使用转义符“ \ ”
替换符合条件的文本
  • 不加-i的情况下,仅仅只是在输出中替换
#替换the单词
[root@localhost ~]# sed 's/the/THE/' test
#替换整个文本的the
[root@localhost ~]# sed 's/the/THE/g' test
迁移符合条件的文本

使用sed命令迁移符合条件文本,通常用以下参数:

  • H:复制到剪切板
  • g:将剪切板中的内容覆盖到指定行
  • G:将剪切板中的内容追加到指定行
  • w:保存文件
  • r:读取指定文件
  • a:追加指定内容
#将包含the的单词移动到末行
[root@localhost ~]# sed '/the/{H;d};$G' test
#追加内容到第3行下
[root@localhost ~]# sed '3a NIHAO' test

awk工具

​ awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
在这里插入图片描述

awk常见用法

​ 通常情况下 awk 所使用的命令格式如下所示,其中,单引号加上大括号“{}”用于设置对数据进行的处理动作。

#过滤并输出文件中符合条件的内容
awk 选项 '模式或条件{编辑指令}' 文件1 文件2... 
#从脚本中调用编辑指令,过滤并输出内容
awd -f 脚本文件 文件1 文件2...
awk特殊的内建变量:
变量描述
FS指定每行文本的字段分割符,默认为空格或制表符
NF当前处理的行的字段个数
NR当前处理的行的行号(序数)
$0当前处理的行的整行内容
$n当前处理行的第n个字段
FILENAME被处理的文件名
RS数据记录风格,默认为\n,即每行为一条记录
awk示例
  • -F:间隔符号选项
#将grep于awk结合过滤第七列的内容
[root@localhost ~]# free | grep Mem | awk '{print $7}'
651284
#过滤passwd内容
[root@localhost ~]# awk -F ":"  '{print}' /etc/passwd 
#指定过滤第三行到第十行
[root@localhost ~]# awk -F ":" 'NR==3,NR==10{print}' /etc/passwd
#显示该文件的奇数行
[root@localhost ~]# awk -F ":" '(NR%2)==1{print}' /etc/passwd
#显示该文件的偶数行
[root@localhost ~]# awk -F ":" '(NR%2)==0{print}' /etc/passwd
#显示以sshd开头的
[root@localhost ~]# awk '/^sshd{print}' /etc/passwd

常用工具

sort工具

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

  • 常用选项如下:

    选项描述
    -f忽略大小写
    -b忽略每行前面的空格
    -M按照月份进行排序
    -n按照数字进行排序
    -r反向排序
    -u等同于uniq,表示相同的数据仅显示一行
    -t指定分隔符,默认使用[Tab]键分隔
    -o<输出文件>:将排序后的结果转存至指定文件
    -k指定排序区域
sort示例
#创建测试文件
[root@localhost ~]# vim ceshi
#排序
[root@localhost ~]# sort ceshi
[root@localhost ~]# sort ceshi 
aaa
aaa
bbb
bbb
ccc
ccc
ddd
#反向排序
[root@localhost ~]# sort -r ceshi 
ddd
ccc
ccc
bbb
bbb
aaa
aaa

uniq工具

  • Uniq 工具在 Linux 系统中通常与 sort 命令结合使用,用于报告或者忽略文件中的重复行

  • 命令格式如下:uniq [选项] 参数

  • 常用选项如下:

    选项参数
    -c进行计数
    -d仅显示重复行
    -u仅显示出现一次的行
uniq示例
#去重查询
[root@localhost ~]# sort ceshi | uniq 
aaa
bbb
ccc
ddd
#计算重复的次数
[root@localhost ~]# sort ceshi | uniq -c
[root@localhost ~]# sort ceshi | uniq  -c
      2 aaa
      2 bbb
      2 ccc
      1 ddd

tr工具

  • tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后 变成另一组字符。

  • 常用选项如下:

    选项描述
    -c取代所有不属于第一字符集的字符
    -d删除所有属于第一字符集的字符
    -s把连续重复的字符以单独一个字符表示
    -t先删除第一字符集较第二字符集多出的字符

q -c
[root@localhost ~]# sort ceshi | uniq -c
2 aaa
2 bbb
2 ccc
1 ddd


### tr工具

- tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后 变成另一组字符。

- 常用选项如下:

  | 选项 | 描述                                   |
  | ---- | -------------------------------------- |
  | -c   | 取代所有不属于第一字符集的字符         |
  | -d   | 删除所有属于第一字符集的字符           |
  | -s   | 把连续重复的字符以单独一个字符表示     |
  | -t   | 先删除第一字符集较第二字符集多出的字符 |

  
  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值