shell脚本之正则表达式与grep

目录

  • 一、正则表达式
    • 1、正则表达式的定义
    • 2、grep命令
    • 3、基础正则表达式
    • 4、扩展正则表达式
  • 二、文本处理器
    • 1、cut
    • 2、sort
    • 3、uniq
    • 4、tr
  • 总结

一、正则表达式

1、正则表达式的定义

  • 什么是正则表达式:
    正则表达式,又称规则表达式,(英语:Regular Expression)在代码中常简写为 regex、regexp 或 RE ,计算机科学的一个概念。

  • 作用:
    正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本

  • 正则表达式不只有一种,而且 Linux 中不同的程序可能会使用不同的正则表达式,如:
    工具:
    grep、 sed 、awk、 egrep
    正则表达式——通常用于判断语句中,用来检查某一字符串是否满足某一格式

  • 正则表达式是由普通字符与元字符组成
    普通字符:包括大小写字母、数字、标点符号及一些其他符号
    元字符:是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式

  • LINUX 中常用的有两种正则表达式引擎
    基础正则表达式:BRE
    扩展正则表达式:ERE

2、grep命令

格式

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

常用选项

选项 含义
-E 开启扩展(Extend)的正则表达式
-c 计算找到 ‘搜寻字符串’ 的次数
-i 忽略大小写的不同,所以大小写视为相同
-o 只显示被模式匹配到的字符串
- - color=auto 可以将找到的关键词部分加上颜色的显示
-n 顺便输出行号
-v 反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!(反向查找,输出与查找条件不相符的行)

例子文件lizi.txt
shell脚本之正则表达式与grep_第1张图片

1、统计root字符总行数

[root@ky19cl zzbds]# grep -c root /etc/passwd
2

在这里插入图片描述
2、不区分大小写查找

[root@ky19cl zzbds]# ls
lizi.txt
[root@ky19cl zzbds]# grep -i 'the' lizi.txt 

在这里插入图片描述

3、将非空行输入到test.txt文件中

[root@ky19cl zzbds]# grep -v "root"  passwd|grep -v "^$" > test.txt

shell脚本之正则表达式与grep_第2张图片

4、过滤ip(ens33)

[root@ky19cl zzbds]# ifconfig ens33 | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"|head -1
192.168.159.50

shell脚本之正则表达式与grep_第3张图片

3、基础正则表达式

常见元字符

特殊字符 含义
(反斜杠)\ 将特殊字符进行转义,忽略其特殊意义
^ 匹配行首,^ 则是匹配字符串的开始 ^tux 匹配以 tux 开头的行
$ 匹配行尾,$ 则是匹配字符串的结尾 tux$ 匹配以tux结尾的行
. 匹配除换行符\r\n之外的任意单个字符
[list] 匹配list列表中的一个字符 例: go[ola]d,[abc]、[a-z]、[a-z0-9]
[ ^list ] 匹配任意不在list列表中的一个字符 例: [ ^a-z ]、[ ^0-9 ]、 [ ^A-Z0-9 ]
* 匹配前面子表达式0次或者多次 例:goo*d、go.*d
\ {n \ } 匹配前面的子表达式n次, 例: go{2}d、’[0-9]{2}'匹配两位数字
\ {n, \ } 匹配前面的子表达式不少于n次,例: go{2,}d、’ [0-9]{ 2, \ }'匹配两位及两位以上数字
\ {n,m \ } 匹配前面的子表达式n到m次, 例: go{2,3)d、’[0-9]{2,3}'匹配两位到三位数字

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

以例子lizi.txt为检索文件操作
1、[list]:匹配list列表中的一个字符 例: go[ola]d,[abc]、[a-z]、[a-z0-9]

[root@ky19cl zzbds]# grep -n "sh[io]rt" lizi.txt 
1:he was short and fat.
2:He was wearing a blue polo shirt with black pants. 

在这里插入图片描述
在这里插入图片描述

2、[ ^list ]:匹配任意不在list列表中的一个字符 例: [ ^a-z ]、[ ^0-9 ]、 [ ^A-Z0-9 ]其中 ^ 为取反

[root@ky19cl zzbds]# grep -n "[^w]oo" lizi.txt 
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
12:#woood #
13:#woooooood 
15:I bet this place is really spooky late at night! 

在这里插入图片描述

[root@ky19cl zzbds]# grep -n "[^a-z]oo" lizi.txt 
3:The home of Football on BBC Sport online.

在这里插入图片描述
shell脚本之正则表达式与grep_第4张图片
3、^: 匹配行首
shell脚本之正则表达式与grep_第5张图片

在这里插入图片描述
shell脚本之正则表达式与grep_第6张图片
在这里插入图片描述
4、$:匹配行尾
以点结尾(需要转义)
shell脚本之正则表达式与grep_第7张图片
显示空行
在这里插入图片描述
5、.: 匹配除换行符\r\n之外的任意单个字符
在这里插入图片描述

6、* :匹配前面子表达式0次或者多次 例:goo*d、go.*d
shell脚本之正则表达式与grep_第8张图片
之间的任意字符
shell脚本之正则表达式与grep_第9张图片
7、\ {n \ }、\ {n, \ }和\ {n,m \ }
n个
shell脚本之正则表达式与grep_第10张图片
n个或大于n个
在这里插入图片描述
n个到m个之间
在这里插入图片描述

4、扩展正则表达式

  • 通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用 范围更广的扩展正则表达式

  • 与基础正则表达式类型相同,扩展正则表达式也包含多个元字符,常见的扩展正则表达 式的元字符主要包括以下几个:

元字符 作用
+ 重复一个或者一个以上的前一个字符
零个或者一个的前一个字符
I(管道符) 使用或者(or)的方式找出多个字符
() 查找“组”字符串
()+ 辨别多个重复的组

二、文本处理器

1、cut

cut:列截取工具

使用说明:

  • cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

  • 如果不指定 file 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

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

格式:

cut [选项]  参数

常用选项

选项 作用
-b 按字节截取
-c 按字符截取,常用于中文
-d 指定以什么为分隔符截取,默认为制表符
-f 指定第几列,通常和-d一起

例子
1、-d 与 -f
[root@ky19cl zzbds]# cat passwd | cut -d ‘:’ -f 7
shell脚本之正则表达式与grep_第11张图片
用AWK也可以实现
[root@ky19cl zzbds]# cat passwd | awk -F’:’ ‘{print $7}’

shell脚本之正则表达式与grep_第12张图片
在这里插入图片描述

2、-b
[root@ky19cl zzbds]# who | cut -b 4
在这里插入图片描述
3、-c(中文)

2、sort

sort:排序工具

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

格式:

sort [选项] 参数

常用选项

选项 作用
-t 指定分隔符,默认使用[Tab]吧 键或空格分隔
-k 指定排序区域,哪个区间排序
-n 按照数字进行排序,默认是以文字形式排序
-u 等同于 uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功
-r 反向排序,默认是升序,-r就是降序
-o 将排序后的结果转存至指定文件

例子
1、默认以字母升序排列
shell脚本之正则表达式与grep_第13张图片
2、-n -t -k
以数字,冒号,第三列排序
shell脚本之正则表达式与grep_第14张图片
3、-r (反向排序)
shell脚本之正则表达式与grep_第15张图片
4、-o (生成指定文件)
shell脚本之正则表达式与grep_第16张图片
5、-u(去重)
shell脚本之正则表达式与grep_第17张图片

3、uniq

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

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

格式:

uniq [选项] 参数

常用选项

选项 作用
-c 对重复的行进行计数
-d 仅显示重复行
-u 仅显示出现一次的行

制作例子文档
shell脚本之正则表达式与grep_第18张图片

例子
1、-c:对重复的行进行计数(连续)
shell脚本之正则表达式与grep_第19张图片
扩展与sort命令
shell脚本之正则表达式与grep_第20张图片
2、-d:仅显示重复行
在这里插入图片描述
3、-u:仅显示出现一次的行
shell脚本之正则表达式与grep_第21张图片
shell脚本之正则表达式与grep_第22张图片

[root@ky19cl zzbds]# last | awk '{print $1}'|sort|uniq|grep -v "^$"|grep -v wtmp
[root@ky19cl zzbds]# last |cut -d ' ' -f 1|sort|uniq|grep -v "^$"|grep -v wtmp

shell脚本之正则表达式与grep_第23张图片

4、tr

tr:替换工具

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

格式:

tr [选项]  'SET1'  'SET2'
 
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出

常用选项

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

shell脚本之正则表达式与grep_第24张图片

例子
1、替换
shell脚本之正则表达式与grep_第25张图片

shell脚本之正则表达式与grep_第26张图片
shell脚本之正则表达式与grep_第27张图片
shell脚本之正则表达式与grep_第28张图片

2、-d:删除字符
shell脚本之正则表达式与grep_第29张图片
在这里插入图片描述

3、-s:删除所有重复出现的字符,只保留第一个
shell脚本之正则表达式与grep_第30张图片
扩展
1、本机登录与ip

[root@ky19cl zzbds]# ss -nt | tr -s ' '|cut -d ' ' -f5|cut -d ':' -f1|sort|uniq -c

在这里插入图片描述
2、连接主机数与监听
shell脚本之正则表达式与grep_第31张图片

[root@ky19cl zzbds]# ss -nta|grep -v '^State'|cut -d ' ' -f1|sort|uniq -c

在这里插入图片描述

总结

在生产上,我们编写shell脚本的时候我们会运用正则表达式或者这些文本处理工具来得到我们的条件进行shell脚本的编写,还是非常实用的。

你可能感兴趣的:(正则表达式,bash,linux)