正则表达式

ZYC·2023-11-27 18:54·18 次阅读

正则表达式

正则表达式

正则表达式:匹配的是文章中的字符

通配符:匹配的是文件名 任意单个字符

元字符:不表示本来的含义,在正则表达式中有特殊含义的字符

正则 元字符的使用

自己写容易,读取别人的正则困难

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

2

3

4

....

有n行

加载一行处理一行

vim 文本处理工具 内存不足打不开超级大的文件

把整个文件加载到内存中处理,如果内存不够大,无法打开处理文件

 

 

awk 选项 ‘表达式{处理动作}’#

复制代码
选项
-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#

BEGIN{}:仅在开始处理文件中的文本之前执行一次

END{}:仅在文本处理完成之后执行一次

 

正则匹配#

/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

 

line ranges:行范围#

复制代码
不支持使用行号,但是可以使用变量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的文件#

 

七、#

0为假

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类型#

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @   citywalk  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
目录