正则表达式和sed

目录

正则表达式

元字符

位置锚定

\broot\b:匹配root整个单词。或者\ 也可以

():分组

grep -E 扩展正则表达式(重点)

sed编辑器

sed的操作格式

sed的功能

sed 'p':打印

sed -n 就是禁止了默认输出

sed -n '2p' 文件名 输出指定行

sed -n '=' 文件名 只显示行号

sed -n '=;p' 文件名 显示行号和内容

sed -n '1,3p' 文件名 范围打印

sed -n '1;3p' 文件名 打印第一行和第三行

sed -n '1p;$p' 文件名 打印第一行和最后一行

sed 打印奇偶数行

文本内容过滤-----sed

​编辑

sed使用扩展正则表达式:

sed删除文件内容


正则表达式

核心:对文本内容进行过滤,查找,匹配
匹配文件内容。根据特定的字符和表达式匹配文件内容。
通配符:匹配的是文件名,而且不能精确的匹配大小写。
在Linux环境下:grep命令、sed命令、awk命令
nginx、mysql配置文件也可以支持正则表达式
通配符和正则表达式的区别
*匹配任意一个或者多个字符
?匹配任意一个字符
[] 可以是范围匹配,也可以是单个字符

正则表达式和sed_第1张图片

通配符只是匹配文件名和文件内容没有关系

元字符

. 点表示匹配任意单个字符,可以是一个汉字。

正则表达式和sed_第2张图片

转义符
\ 配上.点,变成斜杠\ .点。此时点就代表点

正则表达式和sed_第3张图片

()表示分组 只有\ ( \ )才表示()
[] 表示匹配任意范围内的任意单个字符

正则表达式和sed_第4张图片

红字就标识正则表达式
使用正则表达式一定要把匹配内容引起来
[^a-z] 取反

正则表达式和sed_第5张图片

”[[:blank:]]“ 既可以匹配空格也可以匹配制表符(tab)

正则表达式和sed_第6张图片

"[]" 只能匹配空格
"[:space:]" 空格 tab键 换行符 回车 各种类型的空白都可以匹配
" [:cntrl:]" 匹配退格 删除
基本正则表达式
表示次数
*:匹配前面的字符任意次包括0次,尽可能长的匹配

这里*表示前面的o出现了多少次(没有也可以匹配)
.*:匹配前面的字符任意次,但是不包括0次。也就是匹配所有。

正则表达式和sed_第7张图片

\?:匹配前面的字符出现0次,或者1次。有且只有一次                        
前面字符程序的次数范围 x<=1

正则表达式和sed_第8张图片

\ +:匹配前面出现的字符,至少出现一次,也就是>=1                        
前面字符程序的次数范围 x>=1

正则表达式和sed_第9张图片

\ {n \ }:匹配前面出现的字符等于几次                                    
前面字符程序的次数范围 x=n

正则表达式和sed_第10张图片

\ {m,n \ }:匹配前面出现的字符最少m次,最多是n次
前面字符程序的次数范围 m<=x<=n

正则表达式和sed_第11张图片

\ { ,n \ }:匹配前面的字符最多n次。没有也算
前面字符程序的次数范围 0<=x<=n

正则表达式和sed_第12张图片

\ {n, \ }:匹配前面的字符最少n次,只要连续出现n次,后面的都算。
前面字符程序的次数范围 x>=n

正则表达式和sed_第13张图片

例题:过滤出IP地址

正则表达式和sed_第14张图片

ifconfig ens33 | grep -o "[0-9]+.[0-9]+.[0-9]+.[0-9]+" 

位置锚定

^:行首锚定。以什么为开头
$:行尾锚定。以什么为结尾

正则表达式和sed_第15张图片

^root$:匹配行模式。整行匹配且需要单独一行只有这一个

正则表达式和sed_第16张图片

^$:是空白行

正则表达式和sed_第17张图片

^[[:space:]]:也表示空白行
\ < 或者 \b:词首锚定 
一般用于匹配单词模式的左侧
从左往右全部都算,所有一起都包含,所有都算匹配到

正则表达式和sed_第18张图片

\ > 或者 \b:词尾锚定
一般用于匹配单词模式的右侧
只匹配右侧的单词,左侧的单词不匹配

正则表达式和sed_第19张图片

\broot\b:匹配root整个单词。或者\ 也可以

正则表达式和sed_第20张图片

分组以及逻辑或

():分组

正则表达式和sed_第21张图片

不是连续出现,只算出现一次


\ | :逻辑或

正则表达式和sed_第22张图片

加了()相当于把1abc和2abc合并为1组

grep -E 扩展正则表达式(重点)

1 * :匹配前面的字符任意次包括0次,尽可能长的匹配               x>=0
2 .* : 匹配前面的字符任意次,但是不包括0次。也就是匹配所有。     x>0 
3 ?: 匹配前面的字符出现0次,或者1次,有且只有一次。              x<=1
4 + : 匹配前面出现的字符,至少出现一次,也就是>=1              x>=1
5 {n } : 匹配前面出现的字符等于几次。                          x=n 
6 {m,n } : 匹配前面出现的字符最少M次,最多是n次                  m<=x<=n
7 { ,n } : 匹配前面的字符最多N次,没有也算。                     0<=x<=n
8 { n, }: 匹配前面的字符最少N次,只要连续出现N次,后面的都算。 x>=m
9 |:表示逻辑或 grep -E egrep 扩展正则表达式这两个都可以        

    

sed编辑器

文本三剑客:grep过滤文本内容 查
sed:行编辑器
sed也是按行来处理。
sed是一种流编辑器。每一次处理内容只有确认才会生效。如果不确认,只是把模式空间的临时数据展示给用户,然后删除。
sed是按照文本的行,一行一行向下处理,知道文件的最后一行。
默认情况下:sed都是在模式空间执行,因此元文件不会发生变化。

正则表达式和sed_第23张图片

sed的操作格式

sed -e "操作" 文件1 文件2
sed -e "操作1;操作2" 文件
sed -e:指定命令来处理输入的文本文件。如果只有一个操作那-e可以省略。多个指令才会用-e
sed -f:用特定的脚本文件来处理来处理输入的文件。
sed -i:即时生效。立即生效(慎用)
sed -n:仅显示script处理之后的结果

sed的功能

sed最强的功能就是替换功能
sed的操作符: p: 打印 =:只打印行号 d:删除行
sed的打印功能

正则表达式和sed_第24张图片

sed 'p':打印

正则表达式和sed_第25张图片

sed -e 'p' sed默认自己会输出结果,加上了p打印,就有了两行

sed -n 就是禁止了默认输出

正则表达式和sed_第26张图片

sed -n '2p' 文件名 输出指定行

sed -n '=' 文件名 只显示行号

=号 只打印行号

正则表达式和sed_第27张图片

sed -n '=;p' 文件名 显示行号和内容

正则表达式和sed_第28张图片

sed -n '$p' 文件名 打印最后一行

正则表达式和sed_第29张图片

sed -n '1,3p' 文件名 范围打印

正则表达式和sed_第30张图片

sed -n '1;3p' 文件名 打印第一行和第三行

sed -n '1p;$p' 文件名 打印第一行和最后一行

或者sed -n -e '1p' -e '$p' 文件名

sed 打印奇偶数行

sed -n 'n;p' 文件名 打印偶数行
n在p的前面就是跳过当前一行,打印下一行。
sed -n 'p;n' 文件名 打印奇数行
p在n的前面就是打印当前一行,跳过下一行继续打印。

正则表达式和sed_第31张图片

文本内容过滤-----sed

方法1
sed -n '/o/p' 文件名 打印所有包含o的行 打印指定的过滤内容
格式:sed -n '/过滤内容/p' 文件名

正则表达式和sed_第32张图片

方法2使用正则表达式进行过滤:^表示以什么为开头 $表示以什么为结尾

正则表达式和sed_第33张图片

思考题: cat /etc/passwd | sed -n '4,/bash$/p' 匹配从第四行开始到最后一行bash结尾的行

正则表达式和sed_第34张图片

sed使用扩展正则表达式:

sed -r 使用扩展正则
{n }:匹配前面出现的字符等于几次。
{m,n }:匹配前面出现的字符最少M次,最多是n次
{ ,n } : 匹配前面的字符最多N次,没有也算。
{ n, }: 匹配前面的字符最少N次,只要连续出现N次,后面的都算。
思考题:包含两个99:的所在行打印出来

思考题:打印所有要么是以root为开头,要么是以bash为结尾的行

正则表达式和sed_第35张图片

sed删除文件内容


面试题:现在有一个文件,文件名我想保留,但是原有的内容我要删除且要使用面交互删除
方法1 cat /dev/null > test.txt

方法2 sed -i 'd' test.txt

指定删除

删除第三行

正则表达式和sed_第36张图片

删除2-6行

正则表达式和sed_第37张图片

删除过滤出非空行

sed '/^s/d' test.txt
grep -v 'ns' test.txt

正则表达式和sed_第38张图片

sed替换

换第一个出现的root

格式:sed -n 's/替换字符/被替换字符/p' 路径

换第二个出现的root

格式:sed -n 's/替换字符/被替换字符/2p' 路径
替换过滤出来的第二个字符

换所有的root  g是全量

把root开头的,替换成#

格式 sed -n 's/替换字符/被替换字符/p' 路径

把所有的大写换成小写的

l&转换成小写的特殊符号,要在前面加上转义符\

把所有首字母换成大写的

u& 转换成大写首字母的特殊符号,要在前面加上转义符\

把所有的换成大写的

U& 所有的转换成大写的特殊符号,要在前面加上转义符\

正则表达式和sed_第39张图片

把one的行替换成22

格式 sed '/替换行/c 替换内容' 文件名

正则表达式和sed_第40张图片

整行替换
面试题
把IP地址换成1.1.1.1

正则表达式和sed_第41张图片

单个字符替换

y/被替换字符/替换字符 /    1:1替换

正则表达式和sed_第42张图片

正则表达式和sed_第43张图片

sed命令: 新增

a:在匹配行的下一行添加内容

正则表达式和sed_第44张图片

i: 在匹配行的上一行添加内容

正则表达式和sed_第45张图片

r: 可以从其他文件读取内容,然后在匹配行的行后添加。
正则表达式和sed_第46张图片

$a 可以直接在文本的最后一行添加内容 

正则表达式和sed_第47张图片

$i 在文本最后一行和倒数第二行之间添加
正则表达式和sed_第48张图片

替换位置

倒序

sed -f 命令文件在第一个 处理文件在第二个

123.txt                                                              456.txt
                         

本章小练

1、显示/etc/passwd中以sh结尾的行; 
2、查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行; 
3、查找ifconfig命令结果中的1-255之间的整数; 
4、显示/var/log/secure文件中包含“Failed”或“FAILED”的行; 
5、在/etc/passwd中取出默认shell为bash的行; 
6、高亮显示passwd文件中冒号,及其两侧的字符

你可能感兴趣的:(linux,服务器,运维)