正则表达式
正则表达式
正则表达式:匹配的是文章中的字符
通配符:匹配的是文件名 任意单个字符
元字符:不表示本来的含义,在正则表达式中有特殊含义的字符
正则 元字符的使用
自己写容易,读取别人的正则困难
1、记忆元字符的含义
2、多用
基本正则表达式
扩展正则表达式
#
. 单个任意字符
[] 单个字符
. 在[ ] 里 代表原来意思
[:alnum:] 字母和数字 [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z [:lower:] 小写字母,示例:[[:lower:]],相当于[a-z] [:upper:] 大写字母 [:blank:] 空白字符(空格和制表符) [:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广 [:cntrl:] 不可打印的控制字符(退格、删除、警铃...) [:digit:] 十进制数字 [:xdigit:]十六进制数字 [:graph:] 可打印的非空白字符 [:print:] 可打印字符 [:punct:] 标点符号 \w #匹配单词构成部分,等价于[_[:alnum:]] \W #匹配非单词构成部分,等价于[^_[:alnum:]] \S #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符
space 包括空格,制表符
[^] 匹配指定范围外的任意单个字符
#
* 代表前面的字符出现 [0到 正无穷 次] .* 任意长度的字符,不包括 0次 \? 0 或1次 可有可无 \+ 1次到正无穷次 \{4\} #前面 的字符出现四次 \{3,5\} #前面的字符出现3到5次
\{3,\} #前面的字符出现最少三次
\{,5\} #前面的字符出现最多5次
#提取IP地址,子网掩码和网关
#
^ #开头的行 $ #结尾的行 ^ [[:space:]] $ # 空白行 \b #字符串的开头 \< \b #字符产的结尾 \> ^PATTERN$ #用于模式匹配整行 (单独一行 只有root) ^$ #空行 ^[[:space:]]*$ # 空白行 \<PATTERN\> #匹配整个单词
#
分组 () 使括号将需要组合的字符 括起来
或者:\ |
过滤 IP地址,子网掩码和网关#
#
grep -E egrep #默认使用基本正则表达式 表示次数 * 匹配前面字符任意次 ? 0或1次 + 1次或多次 {n} 匹配n次 {m,n} 至少m,至多n次 {,n} #匹配前面的字符至多n次,<=n,n可以为0 {n,} #匹配前面的字符至少n次,<=n,n可以为0 表示分组 () 分组 分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+ 后向引用:\1, \2, ... | 或者 a|b #a或b C|cat #C或cat (C|c)at #Cat或cat
练习操作#
表示邮箱#
表示qq号#
表示手机号#
grep#
grep [选项] ... 查找条件 目标文件
-color=auto 对匹配到的文本着色显示 -m # 匹配#次后停止 grep -m 1 root /etc/passwd #多个匹配只取第一个 -v 显示不被pattern匹配到的行,即取反 grep -Ev '^[[:space:]]*#|^$' /etc/fstab -i 忽略字符大小写 -n 显示匹配的行号 -c 统计匹配的行数 grep -c root /etc/passwd #统计匹配到的行数 -o 仅显示匹配到的字符串 -q 静默模式,不输出任何信息 -A # after, 后 ?行 grep -A3 root /etc/passwd #匹配到的行后3行业显示出来 -B # before, 前 ?行 -C # context, 前后各 ?行 -e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file grep -e root -e bash /etc/passwd #包含root或者包含bash 的行 grep -E root|bash /etc/passwd -w 匹配整个单词 grep -w root /etc/passwd useradd rooter -E 使用ERE,相当于egrep -F 不支持正则表达式,相当于fgrep -f file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件 -r 递归目录,但不处理软链接 开始搜索目录 -R 递归目录,但处理软链接
#过滤b开头
#过滤出以/结尾的
#过滤出非空行
AWK
程序语言
awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自
由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK
AWK:原先来源于 AT & T 实验室的的AWK NAWK:New awk,AT & T 实验室的AWK的升级版 GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容 GNU AWK 用户手册文档 https://www.gnu.org/software/gawk/manual/gawk.html gawk:模式扫描和处理语言,可以实现下面功能 vim: 是将整个文件加载到内存中 再进行编辑, 受限你的内存 awk(语言): 读取一行处理一行
工作原理#
awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。
区别#
awk 文本处理工具
1
3
4
....
有n行
加载一行处理一行
vim 文本处理工具 内存不足打不开超级大的文件
把整个文件加载到内存中处理,如果内存不够大,无法打开处理文件
#
选项
-F #指定分割符 -v #指定变量
表达式:awk 的语言的表达式
1、不写没有
2、找到特定的行
处理动作:
print 打印
printf 打印 (控制长宽高)
$0 :全文
$1 :第一列
$2 :第二列
awk '{print $1}'
awk 内置变量 和 shell 环境中的变量会有冲突 '{ }' (单引号)
awk'{print $2}'
以空格为分隔符 取第二列
awk -F: '{print $n}' 以冒号为分割符 取第n列
满足我的表达式留下来,不满足的从哪来回哪去
#
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
#
/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
#
不支持使用行号,但是可以使用变量NR 间接指定行号加上比较操作符 或者逻辑关系 比较操作符: ==, !=, >, >=, <, <= #####逻辑 与:&&,并且关系 或:||,或者关系 非:!,取反
#过滤出第三行
#
awk数组特性 - awk的数组是关联数组(即key/value方式的hash数据结构),索引下标可为数值(甚至是负数、小数等),也可为字符串
1. 在内部,awk数组的索引全都是字符串,即使是数值索引在使用时内部也会转换成字
2. awk的数组元素的顺序和元素插入时的顺序很可能是不相同的 - awk数组支持数组的数组
#
awk提供了 length() 函数来获取数组的元素个数,它也可以用于获取字符串的字符数量。还可以获取数值转换成字符串后的字符数量。
# length(a) length(数组名) 可以查看数组长度
算数操作符#
x+y,x-y,x*y ,x/y, x^y ,x%y -x: 转换为负数 +x:将字符串转换为数值 比较操作符 ==,!=,>,<=,<,<= #### 逻辑 与:&&,并且关系 或:||,或者关系 非:!,取反
实验题加面试题#
一#
#每处理一行 打一个ok
#处理之前打个ok
#处理之后打个ok
二#
#以:为分隔符 提取粗第一列和第三列
三#
内置变量#
awk 选项 '模式{print }'
- FS :指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:" - OFS:输出时的分隔符 - NF:当前处理的行的字段个数 - NR:当前处理的行的行号(序数) - $0:当前处理的行的整行内容 - $n:当前处理行的第n个字段(第n列) - FILENAME:被处理的文件名 - RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
一、#
① 过滤出/etc/passwd 第一列#
② #
# -v 指定变量
二、#
NF: 字段的个数 倒数第一列 $NF 倒是第二列 $(NF-1)
#过滤出倒数第二列。 NF=6 ,最后一列,过滤出倒数第二列,也就是第五列。NF-1 (以空格和%和为分隔符)
#过滤出第三列
三、#
#显示处理的文件名
四、取10里大于5小于10的数#
五、取etc/passwd中第三列大于1000的#
#指定:为分隔符
六、提取opt下99文件里18:11到18:14的文件#
七、#
1为真
#n不知道 初始值0,0为假 第一行不打印,n+1=1 ,1为真第二行开始打印
# !取反 n初始值为0,0取反为1,所以打印第一行。1+1=2,为真取反为0,第二行不打印。0+1=1,为真,取反为0.所以第三行不答应.... 所以只打印第三行。
#只打奇数行。 i初始值为0,取反为1.1为真第一行打印。到第二行1取反为0.0为假所以第二行不打印。
#只打印偶数行。i初始值为0,0取反为1,1为真,1又取反为0.0为假是所以第一行不打印。 i=1,取反为0,外面还有个!又取反为1.所以打印第二行。
#只打印偶数行,给i赋个值。令i=1
八、#
awk 支持for while 循环
九 、去重#
abd 初始值为0 假 取反 为真 1 打印 加一 为2
hiuu 初始值为0 假 取反 为真 1 打印 加一 为2
abd 为真 值为2 取反 0 假 不打印 加一 为1 真
十、过滤 永久挂载文件下的文件系统#
十一、过滤出/etc/fstab 中有多少真正的单词#
[[:alpha:]] =[a-zA-Z]
十二、过滤出磁盘已用的一列,去除%号#
十三、提取字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中所有的数字#
十四、提取test.txt 文件中的主机名#
十五、查出/tmp/的权限,以数字方式显示#
十六、查出用户uid最大值的用户名,UID及shell类型#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?