当前位置: 首页 > news >正文

Linux笔记11——shell编程基础-5

一、正则表达式

  1. 通配符的功能,结合系统命令进行模糊查询,跟find结合用来查询指定名称的文件名
  2. 正则表达式是在文件中匹配符合条件的字符串,常跟grep命令结合进行精确匹配
  3. 扩展正则是对基础正则的补充,结合grep时需要用-E选项,或直接用egrep命令

二、基础正则表达式

元字符作用
.

匹配除换行符以外的任意一个字符

*前一个字符匹配0次或任意多次
^匹配行首
$匹配行尾
[]匹配中括号中指定的任意一个字符
[^]匹配除中括号指定字符以外的任意一个字符
\转义符,用于取消特殊符号的含义

三、扩展正则表达式

扩展元字符作用
+前一个字符匹配1次或任意多次
?前一个字符匹配0次或1次
{n}表示前一个字符恰好出现n次
{n,}表示前一个字符出现不小于n次
{n,m}表示前一个字符最少出现n次,最多出现m次
|匹配两个或多个分支选择
()匹配括号内的整体,可以理解为由多个单字符组成的大字符

扩展正则的写法:(1)grep \? test.txt(2)grep -E test.txt(3)egrep " " test.txt

四、准备测试数据

1.测试数据

[root@localhost ~]# cat test.txt 
ni
hao
ma?
123
abc123
aBc123
aBC123
123abc
a
bb
ab
abb
abbb
abcde
ccc
bbbddd
ni hao ma?
ni hen hao
ni bu hao
bu bu hao
index.php
index2php

2.字符匹配

#匹配具体的字符
[root@localhost ~]# grep "abc" test.txt 
abc123
123abc
abcde#匹配asd中的任意一个字符
[root@localhost ~]# grep "[asd]" test.txt 
#匹配除asd的任意一个字符
[root@localhost ~]# grep "[^asd]" test.txt 
#[]含义是匹配中括号中任意一个字符,注意只能匹配一个字符
#[^]含义是匹配不含有中括号里任意一个字符的行,注意也是一个一个字符匹配#区别于grep -V
[root@localhost ~]# grep -v "[asd]" test.txt #匹配任意一个字符
[root@localhost ~]# grep "h.o" test.txt 

3.位置匹配

注:^匹配行首,$匹配行尾

#匹配以b开头的行
[root@localhost ~]# grep "^b" test.txt #匹配不是以小写字母开头的行
[root@localhost ~]# grep "^[^a-z]" test.txt #匹配以o结尾的行
[root@localhost ~]# grep "o$" test.txt #匹配以.php结尾的行,因为.有特殊含义,所以需要使用\转义
[root@localhost ~]# grep "\.php" test.txt #匹配以a开头,以3结尾的行
[root@localhost ~]# grep "^a.*3$" test.txt #匹配空行
[root@localhost ~]# grep "^$" test.txt #匹配纯数字行
[root@localhost ~]# egrep "^[0-9]+$" test.txt 

4.次数匹配

注:所有匹配次数的都是针对它前一个字符而言的

#*是匹配前一个字符出现任意多次(0次或任意多次
[root@localhost ~]# grep "a*" test.txt 
[root@localhost ~]# grep "a*" test.txt | wc -l
22#扩展正则生效的写法
[root@localhost ~]# grep "b\?" test.txt [root@localhost ~]# grep -E "b?" test.txt [root@localhost ~]# egrep "b?" test.txt #匹配合适的行
[root@localhost ~]# egrep "ab?" test.txt [root@localhost ~]# egrep "ab*" test.txt [root@localhost ~]# egrep "ab+" test.txt #{n} 表示前面的字符恰好出现n次
[root@localhost ~]# egrep "b{2}" test.txt #{n,} 表示其前面的字符出现不小于n次
[root@localhost ~]# egrep "b{2,}" test.txt #{n,m} 匹配其前面的字符出现不小于n次,最多出现m次
[root@localhost ~]# egrep "b{1,2}" test.txt [root@localhost ~]# egrep "^b{1,2}" test.txt 

5.分支和整体匹配

#同时匹配ni hen hao和ni bu hao
[root@localhost ~]# egrep "ni he|bu" test.txt 
ni hen hao
ni bu hao
bu bu hao
[root@localhost ~]# egrep "ni (he|bu)" test.txt 
ni hen hao
ni bu hao
#可以匹配一个整体的个数,类似匹配字符个数
[root@localhost ~]# egrep "(bu)+" test.txt 
ni bu hao
bu bu hao

五、正则表达式练习

问题1:用户登录

当用户输入用户名root和密码123时,打印绿色登录成功,,否则打印红色登录失败(用户名由4-8位的数字、字母、下划线组成,且数字不在开头)

[root@localhost ~]# bash denglu.sh 
please enter your name:root
please enter your password:123
root
登录成功
[root@localhost ~]# bash denglu.sh 
please enter your name:rerw1
please enter your password:13424
rerw1
登录失败
[root@localhost ~]# bash denglu.sh 
please enter your name:ef
please enter your password:1213
验证失败[root@localhost ~]# cat denglu.sh 
#!/bin/bash
read -p "please enter your name:" name
read -p "please enter your password:" passwdecho "$name" | egrep "^[a-zA-Z_][0-9a-zA-Z_]{3,7}$"
yanzheng=`echo $?`
[ "$yanzheng" -eq 0 ] && ([ "$name" == root ] && [ "$passwd" == 123 ] && echo -e "\e[32m登录成功\e[0m" || echo -e "\e[31m登录失败\e[0m") || echo "验证失败"
[root@localhost ~]#

问题2:电话号码

匹配电话号码,以区号025开头,号码是5或8开头的八位数,区号和号码间可以是空格,-或没有

[root@localhost ~]# cat telephone.txt 
02588888888
025-5555555555
025 12345678
025 54321678
025ABC88888
025-85432109
028-85643210
0251-52765421
[root@localhost ~]# egrep "^(025)[ -]?[58][0-9]{7}$" telephone.txt 
02588888888
025 54321678
025-85432109
[root@localhost ~]# 

问题3:手机号码

手机号匹配需求,长度11位,第一位是1,第二三位是130、131、132、145、155、156、185、186,剩余位无限制

[root@localhost ~]# echo "" | egrep "^1(3[0-2]|45|[58][56])[0-9]{8}$"

问题4:邮箱地址

匹配邮箱(邮箱格式:用户名@二级域名.顶级域名);用户名:字符长度5-17位,是除@和空格以外的任意字符,开头只能是字母或_;二级域名:长度不限,符号为数字、小写字母、中横线-(不能连续,不在行尾);顶级域:域名后缀范围在.com,.cn,.com.cn中

[root@localhost ~]# cat mail.txt 
zhangsan123@qq.com
li si@163.com
wang@wu@sina.com
zhao liu@126.com
qianqi@sina.com.cn
tester_ni@-sina.com.cn
wangwu@sina.2com.cn
_user1@@jd-1.com
[root@localhost ~]# egrep "^[a-zA-Z_][^@ ]{4,16}@(-[0-9a-z]|[0-9a-z])+\.c(om|n|om\.cn)$" mail.txt 
zhangsan123@qq.com
qianqi@sina.com.cn
tester_ni@-sina.com.cn
[root@localhost ~]#

问题5:IP地址

[root@localhost ~]# ip add | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
127.0.0.1
192.168.66.66
192.168.66.255
[root@localhost ~]# ip add | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | grep -v "127" |grep -v "255"
192.168.66.66
[root@localhost ~]# 

http://www.dtcms.com/a/353024.html

相关文章:

  • 使用appium对安卓(使用夜神模拟器)运行自动化测试
  • 解释器模式及优化
  • HIVE的Window functions窗口函数【二】
  • flume监控文件写入 Kafka 实战:解耦应用与消息队列的最佳实践
  • 性能测试-jmeter实战6
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(21):文法+单词第7回3
  • 学习嵌入式的第二十八天——线程
  • 趣味学Rust基础篇(变量与可变性)
  • RCLAMP0504M.TBT电子元器件Semtech 低电容、四通道TVS二极管阵
  • Web漏洞
  • More Effective C++条款12:理解抛出一个异常与传递一个参数或调用一个虚函数间的差异
  • 火焰传感器讲解
  • 函数指针的简化
  • 毕业项目推荐:27-基于yolov8/yolov5/yolo11的电塔缺陷检测识别系统(Python+卷积神经网络)
  • MCP模型库深度解析:AI智能体工具调用生态的多元化与规模化发展
  • SciPy科学计算与应用:SciPy图像处理入门-掌握scipy.ndimage模块
  • 1 vs 10000:如何用AI智能体与自动化系统,重构传统销售客户管理上限?
  • 从高层 PyTorch 到中层 CUDA Kernel 到底层硬件 Tensor Core
  • fortran notes[2]
  • More Effective C++ 条款11:禁止异常流出析构函数之外
  • 自学嵌入式第二十九天:Linux系统编程-线程
  • 零后端、零配置:用 AI 编程工具「Cursor」15 分钟上线「Vue3 留言墙」
  • 从“找不到”到“秒上手”:金仓文档系统重构记
  • 深度学习-----详解MNIST手写数字数据集的神经网络实现过程
  • Linux系统使用ADB同时连接多个Android设备
  • 一、Mac(M1)本地通过docker安装Dify
  • 【Day 35】Linux-主从复制的维护
  • C语言中的static vs C++中的static:相同关键字,不同境界
  • golang13 单元测试
  • KingBase数据库迁移利器:KDTS工具 MySQL数据迁移到KingbaseES实战