shell脚本之正则表达式

本文介绍了Linux shell脚本中的正则表达式基础,包括定义、组成和作用,以及如何使用grep、cut、sort、uniq和tr等命令配合正则表达式进行文本处理。通过实例演示了这些命令的用法,如grep用于搜索匹配行,cut进行列表截取,sort进行排序,uniq去除重复行,tr进行字符替换和删除。

目录

一、正则表达

1.1 正则表达式定义

1.1.1正则表达式组成

1.1.2 作用

1.2 基础正则表达式元字符

二、正则表达式相关命令

2.1 grep命令

2.2 cut :列表截取工具

2.3 sort 排序工具

2.4 uniq :去重复工具

2.5 tr 修改工具

总结


引言: 学会按需求查找,展示东西可以极大的节省时间

1.1 正则表达式定义

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

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

1.1.1正则表达式组成

普通字符:
大小写字母、数字、标点符号及一些其他符号
元字符:
在正则表达式中具有特殊意义的专业字符

1.1.2 作用

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

1.2 基础正则表达式元字符

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

除了普通字符外,常见到以下元字符

符号含义
\转意字符,!,\n等
^匹配字符串结束的位置
$匹配字符串结束的位置
.匹配除\n之外的任意的一个字符
*匹配前面子表达式0次或者多次
[list]匹配list列表中的一个字符
[^list]匹配任意不在list列表中的一个字符
{n,m}匹配前面的子表达式n到m次,有{n},{n,}, {n,m}
+匹配前面子表达式1次以上
匹配前面子表达式0次或者1次
()将括号中的字符串作为一个整体
l以或的方式匹配字条串

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

二、正则表达式相关命令

2.1 grep命令

简介:
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

Unix的grep家族包括 grep、egrep和fgrep 。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

格式:
grep 《选项》……查找条件 目标文件

常用选项与说明

选项说明
V打印grep的版本号
E解释释PATTERN作为扩展正则表达式,也就相当于使用egrep。 或操作
F解释PATTERN作为固定字符串的列表,由换行符分隔,其中任何一个都要匹配。也就相当于使用fgrep。
G将范本样式视为普通的表示法来使用。这是默认值。加不加都是使用grep

匹配控制选项

选项说明
e使用PATTERN作为模式。这可以用于指定多个搜索模式,或保护以连字符( - )开头的图案。指定字符串做为查找文件内容的样式
f指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式
i搜索时候忽略大小写
v反转匹配,选择没有被匹配到的内容
w匹配整词,精确地单词,单词的两边必须是非字符符号(即不能是字母数字或下划线)
x仅选择与整行完全匹配的匹配项。精确匹配整行内容(包括行首行尾那些看不到的空格内容都要完全匹配)
y此参数的效果和指定“-i”参数相同

一般输出控制选项

选项说明
-c抑制正常输出;而是为每个输入文件打印匹配线的计数
–color [= WHEN]让关键字高亮显示
L列出文件内容不符合指定的范本样式的文件名称
l列出文件内容符合指定的范本样式的文件名称
m mun当匹配内容的行数达到num行后,grep停止搜索,并输出停止前搜索到的匹配内容
o只输出匹配的具体字符串,匹配行中其他内容不会输出
q安静模式,不会有任何输出内容,查找到匹配内容会返回0,未查找到匹配内容就返回非0
s不会输出查找过程中出现的任何错误消息

注: -q和-s选项因为与其他系统的grep有兼容问题,shell脚本应该避免使用-q和-s,并且应该将标准和错误输出重定向到/dev/null 代替

输出前缀控制

选项说明
b输出每一个匹配行(或匹配的字符串)时在其前附加上偏移量(从文件第一个字符到该匹配内容之间的字节数)
H在每一个匹配行之前加上文件名一起输出(针对于查找单个文件),当查找多个文件时默认就会输出文件名
h禁止输出上的文件名的前缀。无论查找几个文件都不会在匹配内容前输出文件名
–label = LABEL显示实际来自标准输入的输入作为来自文件LABEL的输入。
n输出匹配内容的同时输出其所在行号
T初始标签确保实际行内容的第一个字符位于制表位上,以便对齐标签看起来很正常。在匹配信息和其前的

上下文线控制选项

选项说明
A num匹配到搜索到的行以及该行下面的num行
B num匹配到搜索到的行以及该行上面的num行
C num匹配到搜索到的行以及上下各num行

文件和目录选择选项

选项说明
a处理二进制文件
–binary-files = TYPE如果文件的前几个字节指示文件包含二进制数据,则假定该文件为类型TYPE
D如果输入文件是设备,FIFO或套接字,请使用ACTION处理
d如果输入文件是目录,请使用ACTION处理它
–exclude=GLOB跳过基本名称与GLOB匹配的文件(使用通配符匹配)
–exclude-from = FILE在文件中编写通配方案,grep将不会到匹配方案中文件名的文件去查找匹配内容
–exclude-dir = DIR匹配一个目录下的很多内容同时还要让一些子目录不接受匹配,就使用此选项
–include = GLOB仅搜索其基本名称与GLOB匹配的文件
-R ,-r以递归方式读取每个目录下的所有文件; 这相当于-d recurse选项

其他选项

选项说明
–line-buffered在输出上使用行缓冲。这可能会导致性能损失
–mmap启用mmap系统调用代替read系统调用
U将文件视为二进制
z将输入视为一组行,每一行由一个零字节(ASCII NUL字符)而不是a终止新队

常见的一些用法

需求:
1、首先查到列出所有log文件并且重定向给grep

2、使用grep 查找error 的行

3、使用grep 来查找不包含info 的行

 统计root字符总行数

[root@localhost ~]# grep -c root /etc/passwd   ###统计行数
2 
[root@localhost ~]# cat /etc/passwd | grep root  ##列出存在root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

2.2 cut :列表截取工具

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

常用选项

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

 

注意:

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

2.3 sort 排序工具

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

格式
sort [选项] 参数

常用选项与说明

选项说明
t指定分隔符,默认使用[Tab]吧 键或空格分隔
k指定排序区域,哪个区间排序
n按照数字进行排序,默认是以文字形式排序
u等同于 uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功
r反向排序,默认是升序,-r就是降序
o将排序后的结果转存至指定文件
f
-f: 忽略大小写,会将小写的字母都转换为大写字母来进行比较
b忽略每行前面的空格

示例:
[root@ljy ~]# sort /etc/passwd ##加任何选项默认按第一列升序,字母的话就是从a到z由上而下显示

  [root@ljy ~]# sort -n -t: -k3 /etc/passwd ##以冒号为分隔符,以数字大小对第三列排序(升序) [root@ljy~]# sort -nr -t: -k3 /etc/passwd ##以冒号为分隔符,以数字大小对第三列排序(降序)

 [root@ljy ~]# sort -nr -t: -k3 /etc/passwd -o passwd.bak ##将输结果不在屏幕上输出而是输出到passwd.bak文件
[root@ljy~]# cat passwd.bak

2.4 uniq :去重复工具

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

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

格式
uniq 【选项】 参数

常用选项说明

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

示例
[root@ljy~]# cat shuiguo.txt | uniq -c ##统计重复行的次数,不连续的重复行他不算做重复行

 [root@ljy ~]# cat shuiguo.txt |sort | uniq -c ##结合sort使用就是我们想要的效果

[root@localhost ~]# cat shuiguo.txt |sort | uniq -d ##结合sort使用,过滤出重复行 

[root@ljy ~]cat shuiguo.txt |sort | uniq -d
apple
banane
cherry
e
orange
[root@ljy ~]

[root@localhost ~]# cat shuiguo.txt |sort | uniq ##结合sort使用,去重仅是显示改变,文本内容不变

 比较实用的几个

[root@ljy ~]# who ##查看登陆用户
root pts/0 2022-05-06 14:32 (192.168.161.20)
[root@ljy ~]# who | awk ‘{print $ 1}’
root
[root@ljy ~]# who | awk ‘{print $ 1}’ |uniq
root
[root@ljy ~]# who | awk ‘{print $ 1}’ |sort |uniq|grep -v “^$” |grep -v wtmp ##查看登陆过系统的用户
root
[root@ljy ~]# ss -nt |tr -s " "|cut -d " " -f5 |cut -d “:” -f1 |sort |uniq -c ##查看登陆ip和使用者个数
1 192.168.161.20
1 Address
[root@ljy ~]# ss -nta |grep -v ‘State’|cut -d " " -f1 |sort |uniq -c ##查看客户端和监听服务端个数
1 ESTAB
3 LISTEN案例

2.5 tr 修改工具

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

用法
tr [选项]… SET1 [SET2]

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

常用选项

-d 删除字符

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

示例:

[root@ljy ~]# cat shuiguo.txt | tr ‘a-z’ ‘A-Z’ ##小写字母全部替换成大写

 [root@ljy~]# cat shuiguo.txt | tr ‘apple’ ‘star’ ##替换字母 即a-s p-a(pp相同去后一个a) le-r

 [root@ljy~]# cat shuiguo.txt | tr -d ‘a’ ##删除a

 注; tr 相关操作只是用作显示,并没有更改文件相关配置

总结

相关的文件操作,只是起到一个方便阅读的作用,并不会改变文件相关配置,可以放心使用

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值