一 正则表达式:
通配符:
正则表达式:
元字符:特殊含义的字符
由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。
表现:
代表字符
表示次数
位置锚定
分组或其他
是匹配字符串(命令结果,文本内容)一般与三剑客一起使用
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等
点(.)
元字符:
① [root@localhost ~]#ls /etc/|grep rc[.0-6]
② [root@localhost ~]#ls /etc/ | grep 'rc\.'
③ [root@localhost ~]# grep r..t /etc/passwd
④ [root@localhost ~]# echo abc |grep a.c
⑤ [root@localhost ~]# echo abc |grep 'a\.c'
#标准格式需要加'' 或者 " "
⑥ [root@localhost ~]# ls |grep '[zhou].txt'
⑦ [root@localhost ~]# ls [a-d].txt
#通配符
a.txt A.txt b.txt B.txt c.txt C.txt d.txt
⑧ [root@localhost ~]# ls |grep '[^a-z].txt'
⑨ [root@localhost ~]# ls |grep '[^a.z].txt'
#[]里就是本意不需要转义
⑩ [root@localhost ky15]#grep [[:space:]] zhen.txt
11 [root@localhost ky15]#grep [[:space:]] zhen.txt |cat -A
12 [root@localhost ~]#ls /etc/ |grep "rc[.0-6]" rc. rc0 rc1 rc2 rc3 rc6
[root@localhost ~]#ls /etc/ |grep "rc[.0-6]."
②[ ]:
在正则表达式中[ ]表示匹配[ ]中任意一个字符
[root@pc1 data]#touch {a..c}.txt #创建a-c.txt文件夹
[root@pc1 data]#ls #显示文件夹内容
a.txt b.txt c.txt
[root@pc1 data]#ls |grep '[a-z].txt' #使用grep过滤ls中有任意一个a-z字母.txt的文件
a.txt
b.txt
c.txt
③[^]:
在正则表达式中表示匹配[ ]中外的任意单个字符
[root@pc1 data]#touch {a..b}.txt #创建a-b.txt文件
[root@pc1 data]#touch {0..2}.txt #创建0-2.txt文件
[root@pc1 data]#ls #显示文件
0.txt 1.txt a.txt b.txt
[root@pc1 data]#ls |grep '[^0-9].txt' #过滤ls显示文件中除去0-9任意字符.txt文件
a.txt
b.txt
c.txt
[root@pc1 data]#ls |grep '[^a-z].txt' #过滤ls显示文件中除去a-z任意字符.txt文件
0.txt
1.txt
2.txt
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[root@pc1 data]#echo AB12ab | grep -o '[[:alpha:]]' #过滤输出内容的字母
A
B
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:alnum:]]' #过滤输出内容的字母和数字
A
B
1
2
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:lower:]]' #过滤输出内容的小写字母
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:upper:]]' #过滤输出内容的大写字母
A
2 表示次数
① * :
表示匹配前面字符任意次,包括0次,贪婪模式
[root@pc1 ~]#echo ac |grep 'ab*c' #ab之间不输入b可匹配
ac
[root@pc1 ~]#echo abc |grep 'ab*c' #ab之间输入1个b可匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab*c'#ab之间输入2个b可匹配
abbc
② .* :
表示匹配前面字符任意次,不包括0次
[root@pc1 ~]#echo ac |grep 'ab.*c' #ac之间不输入b匹配不到
[root@pc1 ~]#echo abc |grep 'ab.*c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab.*c' #ac直接输入2个b可以匹配
abbc
③ \? :
表示匹配前面字符1次或0次,可有可无
[root@pc1 ~]#echo ac | grep 'ab\?c' #ac之间不输入b可以匹配
ac
[root@pc1 ~]#echo abc | grep 'ab\?c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbc | grep 'ab\?c' #ac之间输入2个b匹配不到
④ \+ :
表示匹配前面字符最少1次,肯定有且有>=1次
[root@pc1 ~]#echo ac | grep 'ab\+c' #ac之间不输入b匹配不到
[root@pc1 ~]#echo abc | grep 'ab\+c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbbbc | grep 'ab\+c' #ac之间输入多个b可以匹配
abbbbc
⑤ \{n\} :
表示匹配前面的字符n次
[root@pc1 ~]#echo abbbc |grep 'ab\{3\}c' #输出abbbc匹配ac之间b字符出现3次可以匹配
abbbc
[root@pc1 ~]#echo abbbbc |grep 'ab\{3\}c' #输出abbbbc匹配ac之间b字符出现3次匹配不到
⑥ \{m,n\} :
表示匹配前面字符最少m次,最多n次
[root@pc1 ~]#echo abc |grep 'ab\{1,3\}c' #输出abc匹配ac之间b出现最少1次最多3次可以匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab\{1,3\}c' #输出abbc匹配ac之间b出现最少1次最多3次可以匹配
abbc
[root@pc1 ~]#echo abbbc |grep 'ab\{1,3\}c'#输出abbbc匹配ac之间b出现最少1次最多3次可以匹配
abbbc
[root@pc1 ~]#echo abbbbc |grep 'ab\{1,3\}c'#输出abbbbc匹配ac之间b出现最少1次最多3次匹配不到
⑦\{m,\}:匹配前面字符最少m次
⑧\{,n\}:匹配前面字符最多n次,
3 位置锚定
① ^ 表示以什么字符开头的行。
② $ 表示以什么字符为结尾的行。
③ ^PATTERN$ 表示用于模式匹配整行 (单独一行 只有PATTERN字符)。
④ ^$ 表示空行。
⑤ \< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)。
⑥ \> 或 \b #词尾锚定,用于单词模式的右侧。
⑦ \<PATTERN\> #匹配整个单词。
举例
[root@pc1 ~]#cat a.txt #查看a.txt内容
root
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep '^a' #查看a.txt内容过滤以a开头的行
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep 'e$' #查看a.txt内容过滤以e为结尾的行
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep '^root$' #查看a.txt内容过滤只有root字符的行
root
[root@pc1 ~]#cat a.txt |grep '\ba' #查看a.txt过滤以a开头的词
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep 'e\b' #查看a.txt过滤以e为结尾的词
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep -o '\babc\b' #查看a.txt过滤次abc
abc
4 分组或其他
()将多个字符捆绑在一起当做一个整体处理
[root@pc1 ~]#echo abcccc |grep "abc\{4\}" #匹配输出内容c出现4次
abcccc
[root@pc1 ~]#echo abcccc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次,无abc出现4次匹配不到
[root@pc1 ~]#echo abcabcabcabc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次匹配成功
abcabcabcabc
二 扩展正则表达式
述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。在Linux中也就是代表我们定义的模式模板,Linux工具可以用它来过滤文本
①使用方法
grep -E选项加正则表达式内容,与正常正则表达式区别在于不用在匹配时添加 \
②表示次数
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n} #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0
③表示分组
() 分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
后向引用: \1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
马传斌需验证案例
三剑客之 grep
是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
表达式要逐个敲
选项:
-color=auto 对匹配到的文本着色显示
-m # 匹配#行后停止
grep -m 1 root /etc/passwd #多个匹配只取第一个
-v 显示不被pattern匹配到的行,即取反
grep -Ev '^[[:space:]]*#|^$' /etc/fstab
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
grep -c root /etc/passwd #统计匹配到的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
grep -A3 root /etc/passwd #匹配到的行后3行业显示出来
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
grep -e root -e bash /etc/passwd #包含root或者包含bash 的行
grep -E root|bash /etc/passwd
-w 匹配整个单词
grep -w root /etc/passwd
useradd rooter
-E 使用ERE,相当于egrep
-F 不支持正则表达式,相当于fgrep
-f file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接
三 三剑客之awk
工作原理:
前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。
awk为流编辑器,即读取文件一行处理一行。不同于vi编辑器等是将文件整个缓存在内容中处理。
类似于excel表格,awk更是一门编辑语言,支持条件判断、数组循环等功能,适合小型的文本数据
awk:报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自
由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK
多种版本:
AWK:原先来源于 AT & T 实验室的的AWK
NAWK:New awk,AT & T 实验室的AWK的升级版
GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容
gawk:模式扫描和处理语言,可以实现下面功能
vim: 是将整个文件加载到内存中 再进行编辑, 受限你的内存
awk(语言): 读取一行处理一行,
格式:
awk [选项] '处理模式{处理动作}' '{ }' 为固定格式
举例:取出sda硬盘的容量
[root@pc1 data]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 2G 0 part /boot
└─sda2 8:2 0 54G 0 part
├─centos-root 253:0 0 50G 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 20G 0 disk
sr0 11:0 1 4.2G 0 rom
[root@pc1 data]#lsblk |grep -w sda #通过过滤sda字符将sda此行过滤出
sda 8:0 0 60G 0 disk
[root@pc1 data]#lsblk |grep -w sda | awk '{print $4}' #使用awk不指定分隔符 打印出第4列
60G
2 处理动作:主要以 print
①基本格式:
awk [选项] '处理模式{处理动作}' = awk 'patterm {action}'
②print动作:
打印'{print $1}'即为打印第一列,'{print $n}'即打印为第n列,'{print $n,$m}'即为打印第n列和第m列。
③print打印顺序:
'BEGIN{print "1"} END {print "2"} {print "3"} ',首先打印BEGIN后的print 1,然后打印print 3 最后打印END后的print 2,BEGIN表示第一个打印,END表示最后打印
举例2:
[root@pc1 data]# awk 'BEGIN{print "1"} END{print "$2"} {print "3"}' test.txt
1
3
2
[root@localhost ~]#awk -F: 'BEGIN{print "hello" $1}{print $1}' /etc/passwd | head
打印文本列
[root@pc1 data]#awk '{print $1,$5}' mcb.txt #使用awk处理文件mcb.txt打印第1列和第5列
[root@pc1 data]#awk '{print $1}' mcb.txt #使用awk处理文件mcb.txt打印第1列
3 选项
②选项若不写默认为以空格为分隔符处理,且会将空格自动压缩。
③-F 选项 指定分隔符,即指定以什么为分隔符处理内容
举例:
[root@pc1 data]#cat test.txt #编辑test.txt内容
one two three
root:lisi:zhangsan
[root@pc1 data]#awk '{print $2}' test.txt #默认过滤test内容以空格为分隔符打印出第2列为two
two
[root@pc1 data]#awk -F : '{print $2}' test.txt #使用-F选项指定以:为分隔符打印出第2列为lisi
lisi
4 模式
基本格式:
awk [选项] '处理模式{处理动作}'
第一种:处理模式为空,直接处理
正则表达式匹配模式
第二种:正则匹配;与正则表达式配合使用。
举例:
[root@pc1 data]#cat test.txt #创建test.txt
root 1 abc 2 3 4 5 6 7 8
abcd
sadfasdf root
[root@pc1 data]#awk '/^root/{print $2}' test.txt #使用awk配合正则表达式打印出test.txt文件中以root为开头的行的第二列,注意处理模式在固定格式'{}'的单引号中
1 #匹配出的内容
[root@pc1 data]#awk '/^root/,/root$/{print $2}' test.txt #使用awk配合正则表达式打印出test.txt文件中以root为开头的且以root结尾的第二列,注意处理模式在固定格式'{}'的单引号中
1
root #匹配出的内容
5 awk常见的内置变量
比较操作符:==, !=, >, >=, <, <=
逻辑操作符:&&与 并且的关系,||或 或者关系,!非 取反关系
①FS :
指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"
两者意义一样
#awk -v FS=' : ' '{print $1 }' /etc/passwd
#awk -v FS=':' '{print $1FS$3}' /etc/passwd
[root@localhost ~]#awk -v FS=$fs '{print $1FS$3}' /etc/passwd | head
[root@pc1 data]#cat a.txt
a:b:c
[root@pc1 data]#awk -v "FS=:" '{print $2}' a.txt 使用FS变量指定:为分隔符打印a.txt文件的第二列
b
②OFS:
输出时的分隔符
[root@pc1 data]#cat a.txt
a:b:c
[root@pc1 data]#awk -v "FS=:" -v OFS="==" '{print $1OFS$3}' a.txt 使用FS变量指定:为分隔符且指定输出分隔符OFS为==,打印a.txt文件的第1列和第3列
a==b
[root@localhost ~]#awk -v FS=':' -v OFS='==' '{print $1,$3}' /etc/passwd | head
③NF:
当前处理的行的字段个数即处理行有多少列,默认按空格分列,可指定。
举例
awk -F : '{print NF}' /etc/passwd |head -n 1
#指定:为分隔符打印出文件/etc/passwd第一行有多少个字段,即多少列
7
awk -F : '{print $(NF-1)}' /etc/passwd |head -n 1
#指定:为分隔符打印出文件/etc/passwd第一行的倒数第二个字段,即倒数第二列
/root
#awk -F: '{print NF}' /etc/passwd
#df |awk '{print $NF}'
#df | awk '{print $(NF-1)}'
④NR:
当前处理的行的行号(序数)
#awk -F: '{print NR}' /etc/passwd | head
#awk -F: '{print NR,$1}' /etc/passwd | head
举例
awk -F : 'NR==1{print $1}' /etc/passwd
#指定:为分隔符打印出/etc/passwd文件第一行的第一个变量,注意模式要写在'模式{}'位置
root
awk -F : 'NR>=1 && NR<=3{PRINT $1}' /etc/passwd
#指定:为分隔符打印出/etc/passwd文件大于等于第一行且小于等于第三行的第三个变量
root
bin
daemon
⑤$0:
当前处理的行的整行内容
#awk -F : 'NR==1{print $0}' /etc/passwd
#指定:为分隔符打印出文件/etc/passwd第一行的所有内容
root:x:0:0:root:/root:/bin/bash
awk -F : 'NR>=1 && NR<=3{print $0}' /etc/passwd
#指定:为分隔符打印出文件/etc/passwd大于等于第一行且小于等于第三行的所有内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
⑥$n
当前处理行的第n个字段(第n列)
⑦FILENAME:
被处理的文件名
⑧RS:
行分隔符。
awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
#echo $PATH | awk -v RS=":" '{print $1}' | head
关系表达式(扩展)
关系表达式结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
seq 10 |awk 'n++' 打印除了第一行
seq 10 |awk '!n++' 只打第一行
seq 10 |awk '!0'
seq 10 |awk 'i=!i' 奇数行
seq 10 |awk -v i=1 'i=!i' 偶数行
seq 10 |awk '!(i=!i)' 偶数行
for | while 循环
#awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}'
#for((i=1,sum=0;i<=100;i++));do let sum=i+sum;done;echo $sum
#echo $PATH | awk -v RS=':' '{print $0}'
#cat /etc/passwd|awk -F: '{print $1,$3}' #指定冒号作为分隔符,打印第一列和第三列
cat /etc/passwd|awk -F: '{print $1":"$3}' #用冒号分隔开
# cat /etc/passwd|awk -F: '{print $1"\t"$3}'
以下三条意义一样
[root@localhost ~]#df|awk -F"( +|%)" '{print $5}'
[root@localhost ky15]#df |awk -F"[[:space:]]+|%" '{print $5}'
[root@localhost ky15]#df |awk -F"[ %]+" '{print $5}'
提取IP
[root@localhost ~]#ifconfig ens33|sed -n '2p' |awk '{print $2}'
提取网关 :暂时敲不出来
[root@localhost ky15]#hostname -I | awk {print $1}
192.168.91.100 192.168.122.1
awk数组特性:
-
awk的数组是关联数组(即key/value方式的hash数据结构),索引下标可为数值(甚至是负数、小数等),也可为字符串 1. 在内部,awk数组的索引全都是字符串,即使是数值索引在使用时内部也会转换成字符串 2. awk的数组元素的顺序和元素插入时的顺序很可能是不相同的
-
awk数组支持数组的数组
提取十行访问量
#ss -nta|awk 'NR!=1{state[$1]++}END{for(i in state){print i,state[i]}}'
提取 IP 子网掩码 网关
[root@localhost ~]#ifconfig ens33 | awk '{print}'
[root@localhost ~]#ifconfig ens33 | awk '/netmask/{print}'
提取第一 第三列
[root@localhost ~]#awk '{print $1,$3}' 打印第一列和第三列
[root@localhost ~]#awk -F: 'BEGIN{print "hello" $1}{print $1}' /etc/passwd | head
[root@localhost ~]#awk -F: 'END{print "hello" $1}{print $1}' /etc/passwd | tail
计算:
[root@localhost ~]#awk 'BEGIN{print 100+200}'
提取磁盘分区利用率
[root@localhost ky15]#df|awk '{print $5}'
[root@localhost ~]#df|awk '{print $5}' | tail -n 2
[root@localhost ~]#df|awk -F"[ %]+" '{print $5}' | tail -n 2
[root@localhost ~]#df|awk '{print $5}' | tail -n 2 | tr -d %
面试题
四 三剑客之sed
1 定义
-
sed编辑器是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
-
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要存储在一个命令文本文件中。
作用:在打不开文件的情况下,修改文件
语法:输出那些行,留下那些行
2.工作流程
读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
3 命令选项:
-n 关闭自动打印
-e 多点编辑:[root@www data]#sed -n -e '/^r/p' -e'/^b/p' /etc/passwd
-f 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
4 基本操作
以mcb.txt文本内容为模板验证
打印内容
#sed ' ' #交互模式输入一行,回车自动打印一行相同的
①[root@localhost ~]#sed ' ' mcb.txt 默认将输入内容打印出来
①打印显示mcb.txt文本
#sed -n '3p' mcb.txt #打印第三行内容
#sed -n ' 1,3p ' mcb.txt 打印第一行到第三行
#sed -n '$p' /etc/passwd #打印最后一行使用通配符
# sed '3q' mcb.txt #打印三行后退出
[root@localhost ~]#sed -n 'n;p' mcb.txt 输出文件内容所有偶数行
[root@localhost ~]#sed -n '3,${n;p}' mcb.txt 输出第三行至文件尾之间的偶数行
#sed -n '/the/p' mcb.txt 显示包含/the/的行
ifconfig ens33 |sed -n '2,4p' #打印网卡信息的2至4行
#cat -n /etc/passwd |sed -n '2,+4p' #打印第2至6行,即第二行开始往后四行
sed -n ' ' #交互模式输入一行,关闭自动打印
sed -n ' p' #加上p又恢复自动打印,与sed ' '相同
查找文件内容 与cat功能一样
#sed ' ' /etc/fstab
#sed -n ' p' /etc/fatab
过滤关键字
#sed -n '/man/p' /etc/passwd #从第二行开始,找到man 为止
匹配关键字
#sed -n '2,/man/p' /etc/passwd 从第#行开始匹配 #从第二行开始,找到man为止
#nl 打印文件的行数
#ifconfig ens33|sed -n '2p' |awk '{print $2}' 查看虚拟机IP地址
[root@localhost ~]#ifconfig ens33 | sed -n '2p' IP 网关 子网掩码
打印 奇/偶行
seq 10 |sed -n '1~2p'
seq 10 |sed '2~2d'
#打印奇数行
seq 10 |sed -n '2~2p'
seq 10 |sed '1~2d'
#打印偶数行
删除第三行内容
cat 1.txt |sed '3d'
#删除第三行并显示出来
注 删除指定行并不是真正删除,只是将删除了的结果显示出来,并不是真正删除了
删除2~4行
sed '2,4d' seq.txt
#删除连续的2到4行
sed '/^$/d' /opt/seq.txt #删除文本中的空行
sed '/nologin$/!d' /etc/passwd
#删除不是以nologin结尾的行
sed '/nologin$/!d' /etc/passwd
#删除不是以nologin结尾的行
备份再删除
sed -i.bak '3d' 1.txt
#原文件删除第三行,并原文备份
插入内容
sed -i '2a charu' 1.txt
#在第二行后插入内容
sed -i '2a\\n charu2' 1.txt
#插入空行,多添加一个\
替换行内容
sed -i '2ctihuan' 1.txt
#将第二行的内容替换成tihuan
取反
seq 10|sed -n '2!p'
#不显示第二行
搜索替代
①查几点到几点之间的日志
sed -n '/2023:08:09/,/2023:09:42:37/p' access_log
②修改全局,后加g
sed -i 's/root/admin/g' /etc/passwd
#将全局出现的root修改为admin
③修改多行,使用r及e
④修改selinux开机不启动配置文件
举例:
seq 5 |sed #生成1-5数字传给sed
#该格式报错,基本格式中的'{自身脚本语法}'不可以不写,可以写空则是默认打印全部内容如下
seq 5 | sed ''
1
2
3
4
5
2、sed脚本语法及命令
①sed脚本语法:地址+sed自己脚本命令,地址即范围例如全文或第一行,第一行至第三行等范围
②sed脚本命令:
p 将内容打印到屏幕,使用时关闭自动打印功能,-n选项
打印内容
q 到指定的内容即退出,例如打印到第三行直接退出
IP 内容忽略大小写,使用时关闭自动打印功能,-n选项
删除 插入
d 删除指定内容
a 在指定位置添加内容
c 替换指定内容
~ 步进,0~2,2个间隔,1~2,1个间隔 seq 10 |sed -n '0~2p'每间隔2个打印一次
sed选项
① -n 选项,sed默认有自动打印功能,-n选项是关闭打印功能,一般配合脚本命令p使用
②-r 选项,开启扩展正则表达式
③-i 选项,在文件中添加内容,可以在-i是加.bak后缀备份修改的文件。例如 sed -i.bak a.txt会在同目录下生成一个a.txt.bak文件
④
⑤
查找 替换
格式:sed '/可使用正则表达式选择范围/'s/查找内容/替换内容/g g表示全文,固定格式的///可以用###等符号替换
注意:查找内容可使用正则表达式,替换内容不可使用正则表达式
举例1:
搜索/etc/passwd 中包含root字符的行
sed -nr '/root/p' /etc/passwd #-n关闭自动打印,-r启用扩展正则表达式查询root字符并打印
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin #查询结果
举例2:
使用sed关闭selinux
cat /etc/selinux/config #查看selinux配置文件内容
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#-i选项备份selinux配置文件后缀加.bak,在config文件中找到SELINUX=enforcing修改为SELINUX=disabled,g表示所有搜索到的内容都替换。单引号中''s之前可加行号
后向引用
( )内的按顺序标为123 ,引用时\1调用第一个()的内容,\n表示调用第n个()的内容。
.*表示任意长度字符不管是什么字符
举例1:取ip地址
ifconfig ens33 |sed -nr 's/.*inet (.*) netmask.*/\1/p'
#查看ens33的网卡信息传给sed处理,-n选项关闭自动打印,-r选项开启扩展正则表达式
's///'查找替换标准格式,.*inet 表示以inet为止的前面所有字符 (.*) 括号表示使用反向引用
.*表示该处的任意字符 netmask.*表示以netmask开头后面的所有字符。\1表示反向引用第一个()的
内容,p表示打印出来
192.168.30.11 #打印结果
举例2:
echo abc123XYZ | sed -nr 's/(abc)(123)(XYZ)/\3\2\1/p'
#打印abc123XYZ传给sed处理变成XYZ123ABC,-n选项关闭自动打印,-r选项开启扩展正则表达式
's///'查找替换标准格式。三个()括起来的内容分别表示元素123,调用时改变调用顺序打印即可改变内容顺序
XYZ123abc #打印结果
变量
使用sed查询是可以直接调用变量,注意必须用“ ”号或者俩个双引号,单引号不识别变量