正则表达式组成元素grep与sed应用解析

一 正则表达式

1.1 正则表达式的定义:

正则表达式是使用单个字符串来描述,匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找,删除,替换某个特定的字符串。

正则表达式是由普通字符与元字符组成文字模式。其中普通字符包括大小写字母,数字,标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符1前面的字符)在目标对象中的出现模式。

1.2 正则表达式的用途:

正则表达式对于系统管理员来说是非常重要,系统运行过程中会产生大量的信息,这些信息有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户账号登录失败”“服务启动失败”等信息。这时可以通过正则表达式快速提取“有问题”的信息。如此一来,可以将运维工作变得更加简单,方便。

1.3 正则表达式的分类:

正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用正则表达式最基础的部分。在Linux系统中常见的文件处理工具中grep 与sed 支持基础正则表达式,而egrep 与awk 支持扩展正则表达式。

1.4 正则表达式概述

1.4.1 正则表达式定义

正则表达式,又称正规表达式,常规表达式
使用字符串来描述,匹配一系列符合某个规则的字符串
正则表达式组成
普通字符
大小写字母,数字,标点符号及一些其他符号
元字符
在正则表达式中具有特殊意义的专用字符

1.4.2 正则表达式层次

基础正则表达式
扩展正则表达式

1.4.3 Linux中文本处理工具

grep
egrep
sed
awk

1.5 基础正则表达式元字符

1.5.1 基础正则表达式是常用的正则表达式部分

1.5.2 除了普通字符外,常见到以下元字符

\:转义字符, (让具有特殊意义的元字符作为普通字符去使用)
例如:\!(!),\n(换行)等

^:匹配字符串开始的位置   (以....开始)
例如:^a,^the,^#

$:匹配字符串结束的位置  (以....结束)
例如:word$

.:匹配除\n之外的任意的一个字符    
例如:go.d,go..d (以g开头,d结尾,中间包括两个字符内容)

*:匹配前面子表达式0次或者多次
例如:goo*d(god,good,goood....),go.*d(god,goad,gord...)

[list]:匹配list列表中的一个字符
例如:go[ola]d,[abc],[a-z],[a-z0-9]

[^list]:匹配任意不在list列表中的一个字符 (排除在外,不匹配)
例如:[^a-z],[^0-9],[^A-Z0-9]  

\{n,m\}:匹配前面的子表达式n到m次,有\{n\},\{n,\},\{n,m\}三种格式
例如:go\{2\}d(o出现2次),go\{2,3\}d(o出现至少2次,最多3次),go\{2,\}d(o出现2次或者2次以上)

二 grep应用

2.1 grep的使用规则:

-n:表示显示行号
-i:表示不区分大小写
-v:表示反向过滤
[ ]: 查找集合字符

2.2 用法示例:

1.过滤包含the的内容

[root@server2 ~]# grep -n 'the' test.txt 

在这里插入图片描述
2.过滤不包含the的内容

[root@server2 ~]# grep -vn 'the' test.txt 

在这里插入图片描述
3.过滤以sh开头,以rt结尾,中间匹配i或o

[root@server2 ~]# grep -n 'sh[oi]rt' test.txt 

在这里插入图片描述
4.过滤o出现2次和出现2次以上的

[root@server2 ~]# grep -n 'o\{2\}' test.txt
[root@server2 ~]# grep -n 'o\{2,\}' test.txt

在这里插入图片描述
5.过滤oo前面不是w的内容和以不是w为开头的接着oo的内容

[root@server2 ~]# grep -n '[^w]oo' test.txt
[root@server2 ~]# grep -n '^[^w]oo' test.txt

在这里插入图片描述
6.过滤包含数字0-9的内容与不包含数字0-9的内容

[root@server2 ~]# grep -n '[0-9]' test.txt
[root@server2 ~]# grep -n '[^0-9]' test.txt

在这里插入图片描述
7.过滤以the为开头的内容和以a-z字母为开头的内容

[root@server2 ~]# grep -n '^the' test.txt
[root@server2 ~]# grep -n '^[a-z]' test.txt

在这里插入图片描述
8.过滤以 . 结尾的内容

小数点(.)在正则表达式中也是一个元字符,所以在这里需要用转义字符“\”将具有特殊意义的字符转化成普通字符

[root@server2 ~]# grep -n '\.$' test.txt

在这里插入图片描述
9.过滤空白行内容
[root@server2 ~]# grep -n ‘^$’ test.txt
在这里插入图片描述
10.过滤w开头,以d结尾中间是任意两个字符的内容

[root@server2 ~]# grep -n 'w..d' test.txt

在这里插入图片描述
解析:
若想要查询oo,ooo,ooooo等资料,则需要使用星号()元字符。但需要注意的是,“”代表的是重复零个或多个前面的单字符。“o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符,所以执行“grep -n ‘o*’ test.txt”命令会将文本中所有的内容都输出打印。如果是“oo*”,则第一个o必须存在,第二个o则是零个或者多个o,所以凡是包含o,oo,ooo,oooo,等资料都符合标准。同理。若查询包含至少两个o

11.过滤查找至少两个o的内容

[root@server2 ~]# grep -n 'ooo*' test.txt

在这里插入图片描述
12.匹配以0-9中任意一个字符且可重复0或多次和匹配以w开头,d结尾,中间任意字符可重复0次或多次的内容

[root@server2 ~]# grep -n '[0-9][0-9]*' test.txt
[root@server2 ~]# grep -n 'w.*d' test.txt

在这里插入图片描述

2.3 基础正则表达式----元字符总结

^ :匹配输入字符串的开始位置。除非在方括号表达式中使用,代表不包含该字符集合。要匹配“^”字符本身,请使用“\”

$ :匹配输入字符串的结尾位置。如果设置了RegExp(正则表达式)对象的Multiline(多个)属性,则“$”也匹配‘\n’或‘\r’(换行)。
要匹配"$"字符本身,请使用“\$”

.:匹配除了“\n\r”之外的任何单个的字符

\:反斜杠,又叫转义字符,去除其紧跟的元字符或通配符的特殊意义。

*:匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“\*”

[]:字符集合。匹配所包含的任意一个字符。例如,“[abc” 可以匹配“plain” 中的“a”

[^ ]:赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plain”中任何一个字母

[n1-n2]: 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]” 可以匹配“a”到“z”范围内的任意一个小写字母字符。

注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示子符的范围;如果出现在字符组的开头,则只能表示连字符本身

{n}: n是一个非负整数,匹配确定的n次。例如,“o{2}"不能匹配“Bob” 中的“o”,但是能匹配“food”中的“oo”

{n,}: n是一个非负整数,至少匹配n次。例如,“o{2,}”不能匹配“Bob” 中的“o”,但能匹配“fooood”中的所有o。

“o{1,}”等价于“o+”(至少出现1次)。“o{0,}”则等价于“o*"(至少出现0次)

{n,m}: m和n均为非负整数,其中n<=m, 最少匹配n次且最多匹配m次

grep一般多用于查找,检索内容,参数

三 sed应用

3.1 定义

sed (Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除替换,添加,移动等),最后输出所有行或者仅输出处理的某些行。

3.2 工作流程

sed的工作流程主要包括读取,执行和显示三个过程。
1.读取:sed 从输入流(文件,管道,标准输入)中读取一行内容并存储到临时的缓存区中(又称模式空间,pattern space)。

2.执行:默认情况下。所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。

3.显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的sed命令都是在模式空间内执行的,由此输入的文件并不会发生任何变化,除非是用重定向存储输出。

3.3 sed命令常见用法

sed [选项] ‘操作’ 参数
sed [选项] -f scriptfile 参数

3.4 常见是sed命令选项主要包含以下几种:

-e script(脚本命令) : 指定sed编辑命令
-f scriptfile(文件) : 指定的文件中是sed编辑命令
-h 或 --help :显示帮助
-n,–quiet 或 silent :表示仅显示处理后的结果
-i :直接编辑文本文件(会对文件产生变化)

3.5 常见的操作包括以下几种:

a: 增加,在当前行下面增加一行指定内容
c:替换,将选定行替换为指定内容
d:删除,删除选定的行
i:插入,在选定行上面插入一行指定内容
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用。(输出)
s:替换,替换指定字符
y:字符转换

3.6 用法示例:

3.6.1 输出文件内容

1.带行号输出所有内容 等同于 cat test.txt

[root@server2 ~]# nl test.txt | sed -n 'p'

在这里插入图片描述
2.输出第4行,或者3到5行

[root@server2 ~]# nl test.txt | sed -n '4p'
[root@server2 ~]# nl test.txt | sed -n '3,5p

在这里插入图片描述
3.输出偶数行;奇数行

[root@server2 ~]# nl test.txt | sed -n 'n;p'
[root@server2 ~]# nl test.txt | sed -n 'p;n'

在这里插入图片描述
4.输出1到6行之间的偶数行,3到9行之间的奇数行

[root@server2 ~]# nl test.txt | sed -n '1,6{n;p}'
[root@server2 ~]# nl test.txt | sed -n '3,9{p;n}'

在这里插入图片描述
5.输出以第6行到结尾之间的偶数行(即以第6行为起始行,重新排序设置)

[root@server2 ~]# nl test.txt | sed -n '6,${n;p}'

在这里插入图片描述
6.输出包含the的内容

[root@server2 ~]# sed -n '/the/p' test.txt

在这里插入图片描述
7.输出从第3行开始到第一个包含the的行(是一个区间过程)

[root@server2 ~]# nl test.txt | sed -n '3,/the/p' 

在这里插入图片描述
8.输出包含the的所在行的行号(等号用来输出行号)

[root@server2 ~]# sed -n '/the/=' test.txt

在这里插入图片描述
9.输出以PI为开头的内容;以0到9数字为结尾的内容

[root@server2 ~]# sed -n '/^PI/p' test.txt
[root@server2 ~]# sed -n '/[0-9]$/p' test.txt

在这里插入图片描述
10.输出包含单词home的行(<> 代表单词边界)

[root@server2 ~]# sed -n '/\<home\>/p' test.txt
[root@server2 ~]# grep 'home' test.txt 

在这里插入图片描述

3.6.2 删除符合条件的文本(d)

nl :命令用于计算文件的行数

1.删除第5行;删除2到4行

[root@server2 ~]# nl test.txt | sed '5d'
[root@server2 ~]# nl test.txt | sed '2,4d'

在这里插入图片描述

[root@server2 ~]# vi test.txt 

在这里插入图片描述
仅在外部输出删除,不会对源文件产生影响

2.删除除了包含单词home的内容的其它所有行

[root@server2 ~]# nl test.txt | sed '/home/!d'
     3	The home of Football on BBC Sport online.

3.删除以a-z小写字母为开头的内容

[root@server2 ~]#  sed '/^[a-z]/d' test.txt 

在这里插入图片描述
4.删除以.为结尾的内容

[root@server2 ~]#  sed '/\.$/d' test.txt 

在这里插入图片描述
5.删除所有空行

[root@server2 ~]# vi test.txt 
[root@server2 ~]#  sed '/^$/d' test.txt 

在这里插入图片描述
在这里插入图片描述

3.6.3 替换符合条件的文本

使用sed命令进行替换操作时需要用到s(字符串替换),c(整行/整块替换),y(字符替换)命令选项

1.将每行中的第一个the替换为THE

[root@server2 ~]# sed 's/the/THE/' test.txt 

在这里插入图片描述
在这里插入图片描述
2. 将文件中的所有the替换为THE

[root@server2 ~]# sed 's/the/THE/g' test.txt 

在这里插入图片描述
3.将每行中的第2个l替换为L

[root@server2 ~]# sed 's/l/L/2' test.txt 

在这里插入图片描述
4.将文件中的所有的o删除(替换为空串)

[root@server2 ~]# sed 's/o//g' test.txt 

在这里插入图片描述
5.在每行行首插入#号

[root@server2 ~]# sed 's/^/#/' test.txt 

在这里插入图片描述
6. 在每行行尾插入字符串EOF

[root@server2 ~]# sed 's/$/EOF/' test.txt 

在这里插入图片描述

7.在包含the的每行行首插入#号

[root@server2 ~]# sed '/the/s/^/#/' test.txt 

在这里插入图片描述

  1. 将包含the的所有行中的o替换为O
[root@server2 ~]# sed '/the/s/o/O/g' test.txt 

在这里插入图片描述

3.6.4 迁移符合条件的文本

在使用sed命令迁移符合条件的文本时,常用到以下参数
H:复制到剪切板
g,G :将剪切板中的数据覆盖/追加至指定行
w:保存为文件
r:读取指定文件
a:追加指定内容
1.将包含the的行迁移至文件末尾,{;}用于多个操作

[root@server2 ~]# sed '/the/{H;d};$G' test.txt

在这里插入图片描述
2.将第1-4行内容转移至第16行后

[root@server2 ~]# sed '1,4{H;d};16G' test.txt

在这里插入图片描述
3.将包含the的行另存为文件out.file

[root@server2 ~]# sed '/the/w out.file' test.txt 
[root@server2 ~]# ls -lh
[root@server2 ~]# cat out.file 

在这里插入图片描述
在这里插入图片描述
4.将文件/etc/hostname的内容添加到包含the的每行以后

[root@server2 ~]# sed '/the/r /etc/hostname' test.txt 

在这里插入图片描述
5.在第三行前面插入一个新行,内容为New

[root@server2 ~]# sed '3iNew' test.txt

在这里插入图片描述
6.在包含the的每行后插入一个新行,内容为New

[root@server2 ~]# sed '/the/aNew' test.txt 

在这里插入图片描述
7.在文件最后结尾后插入一个新行,内容为New

[root@server2 ~]# sed '$aNew' test.txt 

在这里插入图片描述
8.在第三行后插入一个新行,内容为New1,后换行插入一个新行,内容为new2
(中间的\n表示换行)

[root@server2 ~]# sed '4aNew1\nnew2' test.txt 

在这里插入图片描述
注意:\n 和\r的区别:
\n 换行符,是另起一新行(光标换行)
\r 回车符,光标回到一旧行的开头(覆盖前一个)

[root@server2 ~]# sed '4aNew1\rnew2' test.txt 

在这里插入图片描述

3.6.5 使用脚本编辑文件

使用sed脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用

[root@server2 ~]# vi opt.list
[root@server2 ~]# sed -f opt.list test.txt 

1,5H   1到5行剪切
1,5d   1到5行删除
17G     17行追加

在这里插入图片描述
在这里插入图片描述

3.6.6 sed直接操作文件示例

编写一个脚本,用来调整vsftpd 服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)。

在服务器是创建本地用户

[root@server2 ~]# useradd dada
[root@server2 ~]# passwd dada
[root@server2 ~]# useradd xiaoxiao
[root@server2 ~]# passwd xiaoxiao
[root@server2 ~]# vi ftp.sh                        编辑脚本
[root@server2 ~]# chmod +x ftp.sh
[root@server2 ~]# ./ftp.sh                         运行脚本

在这里插入图片描述

#!/bin/bash
A=vsftpd
FTP=/etc/vsftpd/vsftpd.conf
yum -y install $A
sed -i -e '/local_enable/s/NO/YES/g' $FTP
sed -i -e '/write_enable/s/NO/YES/g' $FTP
sed -i -e 's/^#chroot_local_user=YES/chroot_local_user=YES/g' $FTP
sed -i  '$aallow_writeable_chroot=YES' $FTP
sed -i -e '/listen/s/NO/YES/g' $FTP
sed -i -e '/listen_ipv6/s/YES/NO/g' $FTP
systemctl start $A
netstat -anpt | grep $A

在客户机上安装ftp进行访问

[root@server1 ~]# yum -y install ftp
[root@server1 ~]# ftp 20.0.0.11
Name (20.0.0.11:root): dada
ftp> exit
[root@server1 ~]# ftp 20.0.0.11
Name (20.0.0.11:root): xiaoxiao
ftp> exit

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值