15.正则表达式&扩展正则&字符处理

家电维修 2023-07-16 19:17www.caominkang.com家电维修技术

 个人简介
 作者简介大家好,我是小鹏linux,运维领域新星创作者,阿里云ACE认证高级工程师
 个人主页小鹏linux
 支持我点赞+收藏⭐️+留言
格言你未必出类拔萃,但一定与众不同!
 系列专栏
                阶段一indos基础                        目前原创16篇
                阶段二Linux基础知识                      目前原创38篇
                阶段三shell基础+shell高级              目前原创15篇
                阶段四python基础及自动化应用      原创未开始
                阶段五Linux网络服务                       原创未开始
                阶段六集群原理及架构                     原创未开始
                阶段七云计算虚拟化技术                 原创未开始

​​​​​​​

 

目录

1.正则表达式

2.保留字

3.&&:与运算符

4.| | :或运算

5.字符处理

6.扩展正则表达式


1.正则表达式

因为系统中会产生很多信息,有些信息很重要,有些信息却没那么重要。这就需要某个功能来对信息过滤,找到有用的关键信息。

1.1概述正则表达式用来在文件中匹配符合条件的字符串,通配符用来匹配符合条件的文件名。其实这种区别只在shell中适用, 因为用来在文件当中搜索字符串的命令,如grep、ak、sed等命令可以支持正则表达式,而在系统当中搜索文件的命令, 如ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。

正则表达式即是规范字符的书写格式,是使用特殊符号,实现文字、字符格式上的规定。

如邮箱的书写格式为XXXX@XXXX.XXX,此格式即为邮箱地址的正则表达式。

1.2基础正则表达式

元字符

作用

.

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

前一个字符匹配0或任意多次

^

匹配行首。例^hello会匹配以hello开头的行

$

匹配行尾。例hello$会匹配以hello结尾的行

[]

匹配中括号中指定的任意一个字符,只匹配一个字符。例[aeiou]匹配任意一个元音字母。[0-9]会匹配任意一位数字。[a-z][0-9]匹配小写字和一位数字构成的两位字符

[^]

匹配除中括号的字符以外的任意一个字符。例[^0-9]匹配任意一位非数字字符

转义符。用于取消,将特殊符号的含义取消

{n}

表示其前面一个字符恰好出现n次。例[0-9]{4} 匹配4位数字。[1][3-8][0-9]{9}匹配手机号

{n,}

表示其前面一个字符出现不小于n次。例[0-9]{2,}匹配2位及以上的数字

{n,m}

表示前面的一个字符至少出现n次,最多出现m次。例[a-z]{6,8}匹配6-8位的小写字母

符号

我们之前了解到.代表的是任意长度的不包含换行的重复字符。如果想匹配任意长度.的时候。就需要用到了。

<符号和>符号

这两个符号分别用于界定左边界和右边界。比如用来精确匹 配hello这个字符串。

2.保留字

Linux中,有很多的特殊符号,可以帮助我们进行正则表达式的制定,具体常用符号如下

---通配符,表示任意长度的任意字符,如rm -rf /mnt/ff?---单配符,表示一位长度的任意字符[ ]---单个字符的取值范围,如 [0-9] [02468] [a-z] [A-Z]{ }多字符的取值范围,如{ab,bc,cd}" "主用于明确命令参数的范围,如date +"20%y-%m-%d%H:%M:%S"' '多用于引号嵌套时使用,如echo 'i say :"hello"'``反单引,所引起来的内容,先当做命令执行,再把执行结果交给其他命令使用。如echo "the time is :date"$变量值提取功能 用户身份标识符转义字符,提取后边符号的引申含义, 如PS1="[u@h W]$"|管道符,格式前后两个命令,前命令的结果交给后命令当做输入信息使用。如ll /etc&后台执行符, 在命令后面加上&后,该命令将被放入到后台执行, 如find / -name f1 &jobs ---查看后台进程&&命令连接、顺序执行,如echo aaaaa && echo bbbbb ,要求必须每个命令都正确执行| |多个命令连接,前命令执行失败,才会去执行后命令,如 cat f1 | | echo bbbbb>输出重定向,格式:前命令,后文档,功能把前命令的运行结果,当做文字保存到文档中。如ls -l /var > /mnt/f1<输入重定向,格式前命令,后文档,功能把后文档的文字内容,当做前命令的输入信息使用,如rite zhang < /mnt/f1 mail zhang < /mnt/f1

关于以上各符号的案例中使用的命令,下面来做一下分析、介绍

3.&&:与运算符

功能两个条件必须都满足,结果才是成立的;

如A 与 B 到校上课

来来=成立来没来=不成立没来来=不成立没来没来=不成立

分析当A条件满足时,B条件才有审查的必要;当A条件不满足时,无论B条件是否满足,结果都是不成立的,则B条件就不会被审核了。所以,对应 cat f1 && echo bbb,若f1文件不存在,cat命令执行失败,则后面echo bbb的命令将不再执行。

4.| | :或运算

功能两个条件至少一个是满足的,结果就是成立的

例A 或 B 到校上课

来来=成立来没来=成立没来来=成立没来没来=不成立

分析当A条件满足时,无论B条件是否满足,结果都是成立的,则B条件

就不会被审核了。只有当A条件不满足时,B条件才有审查的必要。

所以,对应 cat f1 && echo bbb,若f1文件不存在,cat命令

执行失败,则后面echo bbb的命令才会执行。若cat f1执行成功,

则后面的echo bbb将不再执行。

5.字符处理

Linux中对于文档中文字、字符的处理也有很多细节操作的命令,具体如下

5.1 head、tail命令

head -n 3 f1 ---显示文档的前3行

head -n -3 f1 ---排除文档的3行,显示前面的文字

tail -n 3 f1 ---显示文档的3行

tail -n +3 f1 ---从第3行开始显示到结尾

对于head –n -3 和tail –n +3 的行数控制,其原理是文档中每行文字的读取都借助与文档内部的行指针操作,指针指向哪一行,就会读取哪一行。当文件读取前,指针是指向第一行之前的空处,所以只有指针下移一行,才会读取到第一行的文字,tail –n +3 实质是让指针下移三次,开始读取,所以才会读取到第三行的文字;而head–n -3是避除指针可到的三行,所以是不读取倒数第三行的。

命令组合应用tail -n +3 f1 | head -n 3 ---显示3-5行

5.2 grep抓取命令

grep命令可以从文档中抓取显示包含指定字符的行,在日常使用中比较常用。

grep "name" f1 ---抓取f1中包含name的行

grep -n "name" f1 --- -n表示结果中显示行号

grep -i "name" f1 --- -i 表示忽略大小写

grep -v "name" f1 --- -v 显示不包含指定字符的行

grep "^name" f1 --- "^name" 以指定字符开头的行

grep "name$" f1 --- "name$" 以指定字符结尾的行

活用grep "^name$" f1 ---抓取显示一行仅有name字符的行

grep -n "^$" f1 ---抓取显示空行及其行号

ll /etc | grep "^d" | less ---显示/etc/所有目录。

注 ll后目录文件的第一个字符显示为d

5.3 c统计命令

c命令是对文档文字做统计功能的,最常用的是行数上的统计。

c -l f1 --- -l 统计文档中有几行文字

其他参数 -c 字节数 -m 字符数 -单词数 -L 最长行的长度

活用ll /etc | grep "^d" | c -l ---统计/etc/下目录的个数

注ll后一个文件显示为一行,所以统计行数即为统计目录数

5.4 sort 排序显示

sort命令用于对显示内容的排序处理。

sort -rn -k 2 f2 ---按照文档的第二列的数值大小,降序(即大->

小)排序显示,-r 降序,不写默认升序 -n

按照数值大小比较排序 -k 指定按照第几列

排序

sort -rn -u -k 2 f2 --- -u表示去除重复行

sort -t ":" -rn -k 2 f2 --- -t 指定列之间的分隔符,不写,默

认空格作为分隔符

5.5 cut命令

cut命令,截取指定列显示

cut -d " " -f 3 f1 ---截取文档中的第3列, -d 指定分隔符

-f 指定显示第几列

,cut命令对分隔符连续较多的情况,审核较为死板,很难按照我们想要的效果实现截取,如有以下文件

aaa 111 AAA

bbb 222 BBB

则每行文字中各列间的空格数不同,在用cut时,是用第一个空格作为分隔符,第二个空格则被视为第二列,一次类推,,在截取指定列时十分不便。所以一般在连续分隔符个数不统一时,我们更习惯使用ak命令。

5.6 ak命令

ak命令功能十分强大,可根据需要抓取、截取指定的列或行。具体如下

ak -F" " '{print $2,$3}' f1 ---截取显示文档的第2、第3列,-F 指

定分隔符, $2,$3表示显示第几列

ak -F" " '($2>300){print $2,$3}' f1

--- 第二列的值大于300的行,显示其第2、第3列,()中指定筛选条件

ak 'NR==4 || NR==3' f1 ---显示第3和第4行, NR表示行号

ak '/data/ {print $2}' f1 ---抓取包含指定字符的行,再进行截取列

ak '$4 ~ /data/ ' f1 ---抓取第4列包含指定字符的行

ak '$4 !~ /data/ ' f1 ---抓取第4列不包含指定字符的行

5.7 sed命令

sed命令是一个十分复杂的文字处理命令,其中有很多的参数和格式,但可以实现几乎所有的字符处理需求,常用的几个参数如下

sed '1,3d' f1 ---不显示第1-第3行, 1,$可表示1-文件尾

sed '/data/d' f1 ---不显示包含指定字符的行

sed 's/data/hello/p' f1 ---查找文档中的指定字符,替换成新字符

sed 's/data/&123/g' f1 ---查找文档中的指定字符,在其后追加字符

sed -n '/data/p' f1 ---显示包含指定字符的行

具体sed的其他命令和参数可见下面几个表格

命令功能a在当前行后面加入一行或者文本blabel 分支到脚本中带有标号的地方,如果标号不存在就分支到脚本的末尾c用新文本改变或者替代本行的文本d从模式空间中制删除指定行D删除模式空间中第一行i在当前行上面插入文本h拷贝模式空间到内存缓冲区H追加模式空间内容到内存缓冲区g获得内存缓冲区的内容,并替代当前模式空间中的文本G获得内存缓冲区的内容,并追加当前模式空间中的文本 命令功能l列表不能打印所指定的字符清单n读取下一个输入行,用下一个命令处理新的行N追加下一个输入行到模式空间后面并在二者之间嵌入一个新的行,改变当前行的号码p打印模式空间的行P打印模式空间的第一行q退出sedr file从file中读取行t labelif分支,从一行开始开始,一旦满足要求,将直接到带有标号的命令出,或者到脚本的末尾T label错误分支,从一行开始开始,一旦满足要求,将直接到带有标号的命令出,或者到脚本的末尾 命令功能 file写并追加到模块空间file末尾W file写并追加到模块空间的第一行到file末尾!表示后面的命令对所有没有被选定的行发生作用s/re/string/用string替换正则表达式re=打印当前行号码#mand把注释扩展到下一个换行符以前替换标记g行内全面替换p打印行把行写入一个文件 命令功能替换标记(二)x互换模块空间的文本和缓冲区的文本y把一个字符翻译为的字符(此替换标记不可用正则表达式)选项-e mand允许多点编辑--expression=mand同上-h,--help & --version帮助 & 查看sed 版本 (2个选项)-n,--quiet,--silent取消默认输出-f script-file引导sed脚本文件名--file=script-file同上

Sed匹配符号

元字符功能例子匹配^指定行的开始/^linux/所有以linux开头的行$指定行的末尾/linux$/所有以linux结束的行.匹配一个非换行符的字符/l…x/匹配所有包含l后面3个字符任意,为x的行匹配零或多个字符o{5,}匹配至少5个o的行

由上表可见,sed的功能十分繁复,所以我们初学可以暂时不必记忆那么多的格式,只需要先掌握咱们案例中最常用的几项参数设置就好。

6.扩展正则表达式

顾名思义,扩展正则表达式一定是针对基础正则表达式的一些补充。扩展正则表达式比基础正则表达式多了几个重要的符号。不过在使用这些扩展符号的时候需要使用egrep命令。

扩展元字符

作用

+

前一个字符匹配1次或任意多次。例go+gle会匹配gogle、google或gooole如果有更多个o也会匹配。

前一个字符匹配0次或1次。如colou?r可以匹配colour或color。

|

匹配两个或多个分支选择。如as|his会匹配包含as的行,也会匹配包含his的行。

()

匹配其整体为一个字符,可以理解为由多个单个字符组成的大字符。如(dog)+会匹配dog、dogdog、dogdogdog等,因为被()包含的字符会当成一个整体。但hello (orld | earth ) 会匹配hello orld 及 hello earth

6.1()括号模式单元的使用

[root@localhost ~]# egrep --color=auto "(l..e).(l..e)" ./test

love is lover

like is liker

love is liker

like is lover

[root@localhost ~]# egrep --color=auto "(l..e).(1)" ./test

#可用(1)表示引用第一个模式单元,也就是第一次匹配第一行(l..e)在匹配到love的时候,就确定了l和e之间的..为o和v,在之后(1)引用的时候也只会匹配love的字符串。

第二行like同理。第二行匹配时..变成了ik,所以匹配到了后边like字符串,而不能匹配

love字符串。

love is lover

like is liker

Copyright © 2016-2025 www.jianfeikang.com 建飞家电维修 版权所有 Power by