正则表达式
元字符
位置锚定
\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配置文件也可以支持正则表达式
通配符和正则表达式的区别
*匹配任意一个或者多个字符
?匹配任意一个字符
[] 可以是范围匹配,也可以是单个字符
通配符只是匹配文件名和文件内容没有关系
. 点表示匹配任意单个字符,可以是一个汉字。
转义符
\ 配上.点,变成斜杠\ .点。此时点就代表点
()表示分组 只有\ ( \ )才表示()
[] 表示匹配任意范围内的任意单个字符
红字就标识正则表达式
使用正则表达式一定要把匹配内容引起来
[^a-z] 取反
”[[:blank:]]“ 既可以匹配空格也可以匹配制表符(tab)
"[]" 只能匹配空格
"[:space:]" 空格 tab键 换行符 回车 各种类型的空白都可以匹配
" [:cntrl:]" 匹配退格 删除
基本正则表达式
表示次数
*:匹配前面的字符任意次包括0次,尽可能长的匹配
这里*表示前面的o出现了多少次(没有也可以匹配)
.*:匹配前面的字符任意次,但是不包括0次。也就是匹配所有。
\?:匹配前面的字符出现0次,或者1次。有且只有一次
前面字符程序的次数范围 x<=1
\ +:匹配前面出现的字符,至少出现一次,也就是>=1
前面字符程序的次数范围 x>=1
\ {n \ }:匹配前面出现的字符等于几次
前面字符程序的次数范围 x=n
\ {m,n \ }:匹配前面出现的字符最少m次,最多是n次
前面字符程序的次数范围 m<=x<=n
\ { ,n \ }:匹配前面的字符最多n次。没有也算
前面字符程序的次数范围 0<=x<=n
\ {n, \ }:匹配前面的字符最少n次,只要连续出现n次,后面的都算。
前面字符程序的次数范围 x>=n
例题:过滤出IP地址
ifconfig ens33 | grep -o "[0-9]+.[0-9]+.[0-9]+.[0-9]+"
^:行首锚定。以什么为开头
$:行尾锚定。以什么为结尾
^root$:匹配行模式。整行匹配且需要单独一行只有这一个
^$:是空白行
^[[:space:]]:也表示空白行
\ < 或者 \b:词首锚定
一般用于匹配单词模式的左侧
从左往右全部都算,所有一起都包含,所有都算匹配到
\ > 或者 \b:词尾锚定
一般用于匹配单词模式的右侧
只匹配右侧的单词,左侧的单词不匹配
分组以及逻辑或
不是连续出现,只算出现一次
\ | :逻辑或
加了()相当于把1abc和2abc合并为1组
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 扩展正则表达式这两个都可以
文本三剑客:grep过滤文本内容 查
sed:行编辑器
sed也是按行来处理。
sed是一种流编辑器。每一次处理内容只有确认才会生效。如果不确认,只是把模式空间的临时数据展示给用户,然后删除。
sed是按照文本的行,一行一行向下处理,知道文件的最后一行。
默认情况下:sed都是在模式空间执行,因此元文件不会发生变化。
sed -e "操作" 文件1 文件2
sed -e "操作1;操作2" 文件
sed -e:指定命令来处理输入的文本文件。如果只有一个操作那-e可以省略。多个指令才会用-e
sed -f:用特定的脚本文件来处理来处理输入的文件。
sed -i:即时生效。立即生效(慎用)
sed -n:仅显示script处理之后的结果
sed最强的功能就是替换功能
sed的操作符: p: 打印 =:只打印行号 d:删除行
sed的打印功能
sed -e 'p' sed默认自己会输出结果,加上了p打印,就有了两行
=号 只打印行号
sed -n '$p' 文件名 打印最后一行
或者sed -n -e '1p' -e '$p' 文件名
sed -n 'n;p' 文件名 打印偶数行
n在p的前面就是跳过当前一行,打印下一行。
sed -n 'p;n' 文件名 打印奇数行
p在n的前面就是打印当前一行,跳过下一行继续打印。
方法1
sed -n '/o/p' 文件名 打印所有包含o的行 打印指定的过滤内容
格式:sed -n '/过滤内容/p' 文件名
方法2使用正则表达式进行过滤:^表示以什么为开头 $表示以什么为结尾
思考题: cat /etc/passwd | sed -n '4,/bash$/p' 匹配从第四行开始到最后一行bash结尾的行
sed -r 使用扩展正则
{n }:匹配前面出现的字符等于几次。
{m,n }:匹配前面出现的字符最少M次,最多是n次
{ ,n } : 匹配前面的字符最多N次,没有也算。
{ n, }: 匹配前面的字符最少N次,只要连续出现N次,后面的都算。
思考题:包含两个99:的所在行打印出来
思考题:打印所有要么是以root为开头,要么是以bash为结尾的行
面试题:现在有一个文件,文件名我想保留,但是原有的内容我要删除且要使用面交互删除
方法1 cat /dev/null > test.txt
方法2 sed -i 'd' test.txt
sed '/^s/d' test.txt
grep -v 'ns' test.txt
格式:sed -n 's/替换字符/被替换字符/p' 路径
格式:sed -n 's/替换字符/被替换字符/2p' 路径
替换过滤出来的第二个字符
格式 sed -n 's/替换字符/被替换字符/p' 路径
l&转换成小写的特殊符号,要在前面加上转义符\
u& 转换成大写首字母的特殊符号,要在前面加上转义符\
U& 所有的转换成大写的特殊符号,要在前面加上转义符\
格式 sed '/替换行/c 替换内容' 文件名
y/被替换字符/替换字符 / 1:1替换
例
sed -f 命令文件在第一个 处理文件在第二个
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文件中冒号,及其两侧的字符