shell的正则表达式

非淡泊无以明志,非宁静无以致远。这篇文章主要讲述shell的正则表达式相关的知识,希望能为你提供帮助。
补充命令 sort命令;
以行为单位对文件内容进行排序,也可以根据不用的数据来排序
语法格式:
sort [选项]参数
cat file | sort选项(文件内容)
常用选项:
-f :忽略大小写,会将小写字母都转换成大写字母进行比较
-b: 忽略每行前面的空格
-n:按照数字进行排序
-r: 反向排序
-u: 等同于uniq,表示相同的数据仅显示一行
-t :指定字段分隔符。默认使用[TAB]键分割
-k: 指定排序字段
-o : < 输出文件> ,将排序后的结果转存到指定的文件
实验:把/etc/passwd中的UID号使用Sort来排序

sort -n testfile2sort -t : -k 3 -n /etc/passwd

实验:把文件、目录最大的,用排序的方法来显示出来
du -a | sort -nr

实验:使用sort统计passwd被外部爆破的次数
shell的正则表达式

文章图片

uniq命令;
用于报告或者忽略文件中连续的重复行,常与sort命令结合使用
语法格式:
uniq[选项]参数(文件)
cat file | uniq选项(文件内容)
常用选项:
-c;进行计数,并删除文件中重复出现的行
-d;仅显示连续出现的重复行
-u:仅显示出现一次的行
使用命令查看 testfile3文件,然后使用sort指令对文件中的数字进行排序。最后使用管道符号来统计、计数 uniq testfile3sort -n testfile3 |uniq -c

tr命令;
常用来对标准输入的字符进行替换、压缩、删除
语法格式:
tr[选项][参数]
常用选项:
-c :保留字符集1的字符,其他的字符(包括换行符\\n)用字符集2替换
-d : 删除所有属于字符集1的字符
-s :将重复出现的字符串压缩为一个字符串;用字符集2 替换 字符集1
-t :字符集2 替换 字符集1,不加选项与结果
参数:
字符集1:指定要转换或者删除的原字符,当执行转换操作的时候。必须使用参数" 字符集2" 指定转换的目标字符集。但执行删除操作中,不需要参数; " 字符集2" :
字符集2:指定要转换成的目标字符集
tr练习: echo -e "aa\\n\\n\\n\\n\\n\\n\\n\\ncc" |tr -s "\\n" 把那么多换行符压缩成一个换行符echo -e "aa\\n\\n\\n\\n\\n\\n\\n\\ncc" |tr -s "\\n" ":" 把所有的换行符都转化成符号":"

实验1:使用tr来进行字符串的替换操作
shell的正则表达式

文章图片

实验2:使用tr命令来替换$PATH变量中的:分隔符号
shell的正则表达式

文章图片

cut命令:
显示行中指定部分,删除文件中的指定字段
语法格式:
【shell的正则表达式】cut参数
cat file|cut选项
常用选项:
-f :通过指定哪一个字段进行提取。cut命令使用默认的" TAB" 作为字段分割符号
-d:" TAB" 是默认的分隔符,使用此项可以改为其他种类的分隔符号
--complement: 此选项用于排除所指定的字段
--output-delimiter : 更改输出内容的分隔符号
练习: cut -d : -f 1 /etc/passwd grep /bin/bash /etc/passwd | cut -d : -f 1-4,6,7 ;以-分隔的字段和结束字段的范围 grep /bin/bash /etc/passwd | cut -d : --complement -f 2 ;排除第二个字段 cut -d : -f1,7 --output-delimiter=/etc/passwd; 输出分隔符号使用空格分割拓展:字符串截取的方式: i=123456789 1echo $i | cut -b 4-6 456 (显示)2、 echo $i:0:3 expr substr %i 1 3

实验:使用cut命令来提取/etc/passwd当中的指定字段(需求:提取1-4字段,第七字段)
shell的正则表达式

文章图片

split命令
将一个大的文件拆分成诺干个小文件
语法格式:
split 选项参数原始文件查分后文件名前缀
常用选项
-l: 以行数拆分
-b:以大小拆分
举例:
split-l 50 /etc/passwd passwd ; 以50行对文件进行拆分,最后一个文件的行数没有50行的话,就以实际行数进行分配

eval命令
命令字前加上eval时,shell会在执行命令之前扫描它两次,eval命令将首先会扫描命令进行所有的置换,然后再执行该命令,该命令 适用于那些一次扫描无法实现其功能的变量,该命令对变量进行两次扫描。
实验:eval的二次读取
shell的正则表达式

文章图片

正则表达式通常用于判断语句当中,用来检查某一个字符串是否满足某一个格式
正则表达式是由普通字符与元字符组成
普通字符包括大小写字母、数字、标点符号以及其他一些符号
元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(既位于元字符前面的字符或者表达式),在目标对象中的出现模式
基础正则表达式常见元字符:
(支持的工具:grep、egrep、sed、awk)
\\:转义字符,用于取消特殊符号的含义。例如:\\!、\\n、\\$等 ^:匹配字符串开始的位置,例如:^a、^the、^#、^[a-z] $: 匹配字符串结束的位置,例如:word$、^$匹配空行 . :匹配除\\n之外的任意一个字符,例如:go.d、g..d * : 匹配前面子表达式0次或者多次,例如:goo*d、go.*d [list]:匹配list列表中的一个字符,例如:go[ola]d,[abc]、[a-z]、[a-z0-9]、[0-9]匹配任意一位数字 [^list]:匹配任意非list列表中的一个字符,例如:[^0-9]、[^A-Z0-9]、[^a-z]匹配任意一位非小写字母 \\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匹配时""前面不用加"\\"

扩展正则表达式元字符:
支持的工具:(egrep、awk)
+: 匹配前面子表达式1次以上,例如:go+d,将匹配至少一个o,如god、good、goood等 ?:匹配前面子表达式0次或者1次,例如:god?d.将匹配gd或者god (): 将括号中的字段作为一个整体,例如:g(oo)+d,将匹配00整体1次以上,如good、gooood等 | :以"或"的方式匹配字符串,例如:g(oo|la)d,将匹配good或者glad

实验:使用正则表达式来过滤正确的邮箱
```html/xml
过滤电子邮箱
格式:用户名@子域名.[二级域(可选)].顶级域
需要过滤的邮箱有:zhangsan123@qq.com
br/>zhangsan123@qq.com
br/>wang@wu@sina.com
qianqi@sina,com
需求:1、用户名@:长度要求在6-18位,任意大小写英文,任意数字,除了@符号和
br/>1、用户名@:长度要求在6-18位,任意大小写英文,任意数字,除了@符号和
或者字母
^([a-zA-Z][^@ ][5,17])@
2、子域名.[二级域]:长度任意,符号只能包含" - ."
([a-zA-Z0-9
-.]+)
3、.顶级域名:长度在2-5,任意大写英文
.([a-zA-Z]2,5)$
4、完整的需求匹配
实验结果 ![1.png](https://s2.51cto.com/images/20211223/1640247269134562.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)


    推荐阅读