目录
引言: 学会按需求查找,展示东西可以极大的节省时间
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 相关操作只是用作显示,并没有更改文件相关配置
总结
相关的文件操作,只是起到一个方便阅读的作用,并不会改变文件相关配置,可以放心使用
本文介绍了Linux shell脚本中的正则表达式基础,包括定义、组成和作用,以及如何使用grep、cut、sort、uniq和tr等命令配合正则表达式进行文本处理。通过实例演示了这些命令的用法,如grep用于搜索匹配行,cut进行列表截取,sort进行排序,uniq去除重复行,tr进行字符替换和删除。
2138

被折叠的 条评论
为什么被折叠?



