【Shell命令——正则表达式】


1.正则表达式

1.1 什么是正则表达式

正则表达式是处理字符串的方法,它是基于行来处理的行为,通过一些特殊符号的辅助,可以让使用者轻易地达到搜索/删除/替换某特定字符串的目的。
正则表达式是一种表示方法,工具程序支持这种表示方法,则可以使用正则表达式对字符串进行处理,如:vi、grep、sed、awk等

1.2 正则表达式的用途

主要进行日志分析、简单的垃圾邮件过滤、软件(系统)配置等。

1.3 正则表达式规范

正则表达式有不同的规范,POSIX规范,Perl规范,Python规范等,Shell中的grep、egrep都使用POSIX规范。
POSIX规范包括:
1.基本的正则表达式(Basic Regular Expression 简称BREs)
2.扩展的正则表达式(Extended Regular Expression 简称EREs)

2. 基本正则表达式

2.1 基本正则表达式常用字符

字符含义
\忽略后面一个特殊符号的含义
^匹配行首
$匹配行尾
*匹配0到无穷多个任意字符
.匹配除换行符\n之外的任意单个字符
[str]对str中任意单个字符进行匹配
[^str]对任何不在str中的单个字符进行匹配
[a-b]对a-b之间的任意一个字符进行匹配,要写成递增
\{n,m\}匹配连续n到m个前一个字符

2.2 POSIX字符

POSIX字符类是一个形如[:…:]的特殊元序列(meta sequence),可用于匹配特定的字符范围。

2.2 grep用法

用于查找文件中包含有指定字符串的行

字符含义
-n显示行号
-o只显示匹配的内容
-q静默模式,没有任何输出,得用$?来判断执行结果有没有成功
-l只显示包含匹配模式的文件名
-v列出不匹配的行
-i对匹配模式不区分大小写
–color高亮颜色相似匹配到的字符串
-c对匹配的行进行计数
-i对匹配模式不区分大小写

2.3 grep 实验

例1 显示/etc/passwd中以bash结尾的行;

[root@bogon ~]# grep -n 'bash$' /etc/passwd

在这里插入图片描述
例2 查找/etc/man_db.conf中含有“以m开头,并以n结尾的单词”模式的行;

[root@bogon ~]# grep -n '\<m[a-Z]*n\>' /etc/man_db.conf 

在这里插入图片描述
例3 显示/var/log/secure文件中包含“Failed”或“FAILED”的行

root@bogon ~]# grep -n "F(ailed|AILED)" /var/log/secure

例4 显示/etc/man_db.conf中,包含Linux绝对路径的行;

[root@bogon ~]# grep -n '/[[:alnum:]]*' /etc/man_db.conf

在这里插入图片描述
例5 提取ifconfig命令结果中的1-255之间的整数;

[root@bogon ~]# ifconfig|grep -oE "\<[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\>"

在这里插入图片描述
例6 提取ifconfig结果中的合法ip地址(可结合sed工具)。

[root@bogon ~]# ifconfig | grep -w inet | sed 's/^.*inet //g' | sed 's/  *netmask.*$//g'

在这里插入图片描述

3. 扩展正则表达式

扩展正则表达式(Extend Regular Expression,ERE)支持比基本正则表达式

3.egrep用法

字符含义
+对前一行进行 1次或多次匹配
对前一项进行0次或1次重复匹配
{j}对前一项进行j次重复匹配
{j,}对前一项进行j次或更多次重复匹配
{,k}对前一项最多进行k次重复匹配
(a|b)匹配a或b中任意一项
()匹配表达式,创建一个用于匹配的子串

4.sed用法

主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转化程序等。

4.1 sed基本用法

字符含义
a新增,在目前的下一行新增字串
c覆盖,用指定字串覆盖指定行的内容
d删除,删除指定行
i插入,在指定行的前面插入
p打印,将摸个选择的数据打印出来,通常会与参数-n 一起运行
s替换,可以直接进行取代的工作 格式为 m,ns/old/new/g

4.2 sed实验

已知example.txt文件内容如下
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
试编写sed命令实现如下功能:

(1) 删除$符号

[root@bogon ~]# nl example.txt | sed 's/\$//g' | sed -n 'p'

在这里插入图片描述
(2) 显示包含music文字的行内容及行号

[root@bogon ~]# cat example.txt |sed -n '/music/p' 

在这里插入图片描述
(3) 只显示所有包含数字的行

[root@bogon ~]# cat example.txt | sed -n '/[0-9]/p'

在这里插入图片描述
(4) 只显示以“The”开头的行

[root@bogon ~]# cat example.txt |sed -n '/^The/p' 

在这里插入图片描述
(5) 在第4行后面追加文件“hello world!”

[root@bogon ~]# nl example.txt |sed -e '4a hello world!' 

在这里插入图片描述
(6) 将文本“The”修改为“Ok”

[root@bogon ~]# nl example.txt |sed -e 's/The/OK/g' 

在这里插入图片描述
(7) 将第3行内容修改为“This is the third line.”

[root@bogon ~]# nl example.txt |sed -e "3c   This is the third line" 

在这里插入图片描述
(8) 删除第2行内容。

[root@bogon ~]# nl example.txt |sed -e "2d" 

在这里插入图片描述
(9) 设置shell变量var的值为evening,用sed命令查找匹配var变量值的行。

[root@bogon ~]# var=evening
[root@bogon ~]# nl example.txt | sed -n "/$var/p"

注意是双引号,不能为单引号。
在这里插入图片描述

5.awk用法

5.1 awk基本用法

awk也是管道命令,sed通常处理一行数据,awk处理一行中的每个字段,默认以空格或tab键分隔
使用方法:
awk ‘条件类型1 {动作1} 条件类型2{动作2}···’’ filename
*条件类型和动作一定要用单引号括起来。

字符含义
$nnumber,第几个字段
$0当前整条记录
FSFiled Separator,输入字段分隔符
RSRecod Separator,输入记录分隔符
OFSOutput Filed Separator,输出字段分隔符
ORSOutput Record Separator,输出记录分隔符
NFNumber OF Fileds ,当前记录字段数
NRNumber OF Records,当前已处理的记录数

常用内置参数

  • index(a,b) 返回b在a中的起始位置,若为字符串则用双引号引起来
  • length(a) 返回a的长度

5.2 awk 实验

已知文件quote.txt内容如下:
one : two : three
four : five : six
(注:每个冒号前后都有空格)
试编写awk命令实现如下功能:分别以空格和冒号做分隔符,显示第2列的内容,观察两者的区别

[root@bogon ~]# awk 'BEGIN{FS=":"}{print $2}' quote.txt ;sed -n 'p' quote.txt 

在这里插入图片描述

[root@bogon ~]# awk '{FS=":";print $2}' quote.txt 

在这里插入图片描述
已知文件b.txt里面都是数字,且每行包含3个数字,数字之前以空格作为分隔符,试将b.txt里的所有偶数输出,并输出偶数的个数。要求:判断每行的3个数字是否为偶数时用循环结果,即要求程序里包含循环和分支结构。
例如:b.txt内容为:
2 4 3
15 46 79
则输出为:
2
4
46
3

[root@bogon ~]# awk '{for (i=1;i<NF;i++)if($i%2==0){print $i;sum++}}END{print "sum= "sum}' b.txt 

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值