shell脚本知识点13

1.正则表达式 (RE)

什么是正则表达式?
定义:字符,特殊的字符,赋予了一些特殊的含义,主要应用于grep ,sed,awk命令。

正则表达式能干什么
用途: 使用正则表达式可以筛选我们想要的内容。
 正则表达式注意事项:
1.正则表达式和通配符,特殊字符有本质区别:  正则表达式主要用于三剑客命令,而通配符和特殊字符适用于所有的命令。

2.正则神坑:注意区别中文符号,必须使用英文的符号,否则会报错。

2.常见通配符和特殊符号

.  #当前目录
.. #当前目录的上一级目录
-  #当前目录上一次所在的目录
~  #当前用户的家目录
#  #注释,root用户的命令提示符
$  #引用变量 数组 普通用户的命令行提示符#非,取反
&  #将当前的命令放在后台执行
&& #前面的命令执行成功才会执行后面的命令
|| #前面的命令执行失败才会执行后面的命令
|  #管道  将前面命令的执行结果以标准输入的方式交给管道后面的命令,前提是必须是正确的执行结果
\  #转义  取消特殊字符的含义,换行符 将一条较长的命令分割为多行
$() #优先执行括号里的命令,将执行的结果输出给外面的命令
``  #优先执行括号里的命令,将执行的结果输出给外面的命令
*   #表示所有 任意#匹配任意一个字符且只能是一个
[]  #匹配中括号中任意一个字符,
[^]  #排除中括号中任意一个字符
{}   #生成序列  看成一个整体
''   #强引用
""   #弱引用
>    #标准输出重定向   < 标准输入重定向  >> 标准输入追加重定向  #命令的分割符

3.正则表达式符号

^ #以什么开头
$ #以什么结尾
^$ #空行
.  #任意一个字符,不包含换行符
*  #表示前面的字符出现0次或者0次以上
.* #表示所有
\  #转义符,取消特殊字符的特殊含义
[] #匹配中括号中任意一个字符
[^]  #排除中括号中任意一个字符  只是颜色上进行排除,显示内容上没有变化
扩展正则  #扩展正则必须加上对应的选项才能用,普通的正则都能用。 例如grep 必须加-E sed 必须加-r
+  #表示前面的字符出现1次或者1次以上#匹配前面的字符出现0次或者1次
|  #或者
() #创建一个用户匹配的字符串,方便后续引用,视为一个整体
{n} #n是数字,匹配前面的字符出现n次
{n,} #匹配前面的字符出现至少n次,最大没有上限
{,n} #匹配前面的字符出现至多n次,最少0次
{n,m} #匹配前面的字符出现至少n次,最多m次

特殊符号
[[:upper:]]  #所有大写字母
[[:lower:]]  #所有小写字母
[[:alpha:]]  #所有字母
[[:digit:]]  #所有数字
[[:alnum:]]  #所有数字和字母
[[:space:]]  #空白字符
[[:punct:]]  #所有特殊字符,标点符号

5.正则表达式之grep

擅长过滤,并给过滤出来的内容加上颜色
常用选项:
-i		#忽略大小写
-n		#给过滤出来的内容加上行号
-A		#向下过滤多少行
-B		#向上过滤多少行
-C		#向上向下过滤多少行
-c       #统计过滤出来的行数
-w		#精确匹配
-o		#只显示过滤的内容
-v		#排除
-E		#支持扩展正则
-R/r	#递归过滤 
#过滤以什么开头的行
[root@shell /service/scripts/day12]# grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
#过滤以什么结尾的行
[root@shell /service/scripts/day12]# grep "halt$" /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
#过滤空行
[root@shell /service/scripts/day12]# grep -n  "^$" passwd
2:
6:
12:
#过滤含空格和tab键的所有空行
[root@shell /service/scripts/day12]# grep -n  "^[ \t]*$" passwd
2:
6:
8:  
10:        
12:
15: 
#过滤含空格和tab键的所有空行
[root@shell /service/scripts/day12]# grep -n  "^[[:space:]]*$" passwd
2:
6:
8:  
10:        
12:
15:         
#排除空行  
[root@shell /service/scripts/day12]# grep -v "^[ \t]*$" 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

#过滤任意一个字符的行,不包括空行 (空格和tab键也是字符)
[root@shell /service/scripts/day12]# grep "." passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  
sync:x:5:0:sync:/sbin:/bin/sync
        
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
         
operator:x:11:0:operator:/root:/sbin/nologin

#过滤任意一个字符的行 ,包括空行
[root@shell /service/scripts/day12]# grep ".*" 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
adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  
sync:x:5:0:sync:/sbin:/bin/sync
        
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
         
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
#过滤以点为结尾的行  
[root@shell /service/scripts/day12]# grep ".$" passwd #这是过滤了所有
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  
sync:x:5:0:sync:/sbin:/bin/sync
        
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
         
operator:x:11:0:operator:/root:/sbin/nologin
test.
[root@shell /service/scripts/day12]# grep "\.$" passwd 这才是过滤以.结尾的行
test.
#中括号用法
#过滤以a和b开头的行
[root@shell /service/scripts/day12]# grep "^[ab]" passwd
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
#过滤不以a和b开头的行 ,显示不了空行
[root@shell /service/scripts/day12]# grep "^[^ab]" passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#过滤不以a和b开头的行 ,可以显示空行
[root@shell /service/scripts/day12]# grep -v  "^[ab]" passwd
root:x:0:0:root:/root:/bin/bash

daemon:x:2:2:daemon:/sbin:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  
sync:x:5:0:sync:/sbin:/bin/sync
        
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#过滤0-9的数字(只是数字高亮显示)
[root@shell /service/scripts/day12]# grep "[0-9]" 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
#只过滤出数字 
[root@shell /service/scripts/day12]# grep -o "[0-9]" passwd
0
0
1
1
2
#只过滤小写字母
[root@shell /service/scripts/day12]# grep -o "[a-z]" passwd
r
o
o
t
x
#只过滤大写字母
[root@shell /service/scripts/day12]# grep -o "[A-Z]" passwd
F
T
P
U
N
#过滤字母不区分大小写
[root@shell /service/scripts/day12]# grep -o "[A-Z]" passwd
i
n
t
p
T
P
U
#过滤所有特殊符号 (特殊符号会高亮显示)
[root@shell /service/scripts/day12]# grep "[[:punct:]]" 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#只过滤特殊符号
[root@shell /service/scripts/day12]# grep -o "[[:punct:]]" passwd
:
:
:
:
:
/
#统计文件中所有字母出现的次数
[root@shell /service/scripts/day12]# grep -o  "[a-Z]" passwd|sort|uniq -c|sort -rn
    102 n
     83 o
     74 s
     74 i
     50 b
     44 l
     44 e
     42 a
     41 t
#统计文件中所有单词出现的次数
 [root@shell /service/scripts/day12]# grep -Eo  "[a-Z]+" passwd|sort |uniq -c|sort -rn  #必须加E,因为+是扩展正则  
     27 sbin
     26 x
     21 nologin
     10 var
      6 bin
      4 root
      4 lib
      3 User
      3 sync
      3 spool
      [root@shell /service/scripts/day12]# grep -Eo  "[a-Z]*" passwd|sort |uniq -c |sort -rn  结果与上一条命令一样,但是含义还是有区别,*可以过滤出空行,只是这里的-o选项排除了空行。建议用上一种。
     27 sbin
     26 x
     21 nologin
     10 var
      6 bin
      4 root
      4 lib
      3 User
      3 sync
      3 spool
#  *和+的区别
#过滤a出现1次或者1次以上的行     
[root@shell /service/scripts/day12]# grep -E "a+" passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
#过滤a出现0次或者0次以上的行 这种会过滤出空行
[root@shell /service/scripts/day12]# grep  "a*" 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
#过滤出前面字符出现0次或者0次以上
[root@shell /service/scripts/day12]# grep -o  "o*" passwd   这里o只过滤了一次
oo
oo
oo
o
o
o
#过滤出前面字符出现0次或者1次
[root@shell /service/scripts/day12]# grep -Eo  "o?" passwd  这里o过滤了两次
o
o
o
o
#或者 |
[root@shell /service/scripts/day12]# grep -E "mail|halt"  /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@shell /service/scripts/day12]# grep -E "(mail|halt|sync)"  /etc/passwd ()小括号表示为一组,一个整体
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#匹配字符固定出现多少次 
[root@shell /service/scripts/day12]# grep -E  "[0-9]{2}" /etc/passwd  这种过滤方式包含2次以上的情况
ntp:x:38:38::/etc/ntp:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
www:x:1000:1000::/home/www:/bin/bash
nginx:x:998:996:Nginx web server:/var/lib/nginx:/sbin/nologin
ddd1:x:1001:1001::/home/ddd1:/bin/bash
[root@shell /service/scripts/day12]# grep -Ew  "[0-9]{2}" /etc/passwd  加上w就可以精确匹配
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@shell /service/scripts/day12]# grep -E  "[0-9]{2,3}" /etc/passwd  至少2次最多3次
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@shell /service/scripts/day12]# grep -E  "[0-9]{4,}" /etc/passwd 最少4次
www:x:1000:1000::/home/www:/bin/bash
ddd1:x:1001:1001::/home/ddd1:/bin/bash
ddd2:x:1002:1002::/home/ddd2:/bin/bash
ddd3:x:1003:1003::/home/ddd3:/bin/bash
[root@shell /service/scripts/day12]# grep -E  "[0-9]{,2}" /etc/passwd 最多出现2次,这种情况会把所有的都筛选出来,因为最少出现0次就是没有出现的也会算上。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
#取出有效的身份证号码
[root@shell /service/scripts/day12]# cat shenfen.txt 
acd  234545454434567543
acd  234575454434567543
acd  23454545443456754X
acd  134545454434567543
acd  33454545443457543
acd  434545454434567543
acd  534545454434X6754X
acd  6345454544345675432
acd  7345454544345675434
[root@shell /service/scripts/day12]# grep -Ew "[0-9]{17}[0-9X]{1}" shenfen.txt   取身份证号
acd  234545454434567543
acd  234575454434567543
acd  23454545443456754X
acd  134545454434567543
acd  434545454434567543

6.正则表达式之sed


sed  流编辑器 非交互式的编辑器  按行进行处理   模式空间 临时缓冲区  

命令格式:

sed  [option]  'command'  files  

常用选项:

	-n		#取消默认输出
	
	-i		#修改文件内容
	
	-r		#支持扩展正则使用 
	
	-e		#允许多项编辑  #非,取反
命令参数:

	p		#打印  
	
	d		#删除
	
	s		#替换
	
	g		#全局
	
	a		#追加
	
	i		#插入
	
	c		#替换,在当前行替换
	
	w		#将匹配到的内容写入到指定的文件中
	
	i		#忽略大小写 
	
	
#允许多项编辑  

[root@qls /service/scripts/day13]# sed -e '1,10d' -e 's#bash#python#g'  passwd

[root@qls /service/scripts/day13]# sed '1,10d' passwd | sed 's#bash#python#g'


#打印   p


[root@qls /service/scripts/day13]# sed -n '1p' passwd 
root:x:0:0:root:/root:/bin/bash
[root@qls /service/scripts/day13]# sed -n '1,3p' 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
[root@qls /service/scripts/day13]# sed -n '1p;3p' passwd 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin


[root@qls /service/scripts/day13]# sed -n '/root/p' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@qls /service/scripts/day13]# sed -n '/root/p;/halt/p' passwd 
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin

[root@qls /service/scripts/day13]# sed -nr '/root|halt/p' passwd 
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin


#删除   d

[root@qls /service/scripts/day13]# sed '1d' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@qls /service/scripts/day13]# sed '1,20d' passwd 
polkitd:x:99%9:998:User for polkitd:/:/sbin/nologin


[root@qls /service/scripts/day13]# sed '1d;3d' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin


[root@qls /service/scripts/day13]# sed '/root/d' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@qls /service/scripts/day13]# sed -r '/root|halt/d' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


#替换 全局   忽略大小写   s  g   i

#替换每一行中的第一个满足条件的
[root@qls /service/scripts/day13]# sed 's#root#admin#' passwd
admin:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/admin:/sbin/nologin

#替换每一行以root开头的root 
[root@qls /service/scripts/day13]# sed 's#^root#admin#' passwd
admin:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

#全局替换
[root@qls /service/scripts/day13]# sed 's#root#admin#g' passwd
admin:x:0:0:admin:/admin:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/admin:/sbin/nologin

#替换以root开头的行
[root@qls /service/scripts/day13]# sed '/^root/s#root#admin#g' passwd
admin:x:0:0:admin:/admin:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

#替换单行
[root@qls /service/scripts/day13]# sed '1s#root#admin#g' passwd
admin:x:0:0:admin:/admin:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#替换多行 

[root@qls /service/scripts/day13]# sed '1,5s#x#X#g' 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
adm:X:3:4:adm:/var/adm:/sbin/nologin
lp:X:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync


[root@qls /service/scripts/day13]# sed 's#root#admin#g' passwd
admin:x:0:0:ROOT:/admin:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/admin:/sbin/nologin

#替换的时候忽略大小写 
[root@qls /service/scripts/day13]# sed 's#root#admin#gi' passwd
admin:x:0:0:admin:/admin:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/admin:/sbin/nologin

#追加  a

[root@qls /service/scripts/day13]# sed '1aqls'  passwd
root:x:0:0:ROOT:/root:/bin/bash
qls
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@qls /service/scripts/day13]# sed '$aqls'  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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
qls
 
#追加多行内容
[root@qls /service/scripts/day13]# sed '1aqls\nqiudao'  passwd
root:x:0:0:ROOT:/root:/bin/bash
qls
qiudao
bin:x:1:1:bin:/bin:/sbin/nologin


[root@qls /service/scripts/day13]# sed '1s#^#qls\n#g'  passwd
qls
root:x:0:0:ROOT:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

[root@qls /service/scripts/day13]# sed 's#^#\##g'  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
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
#mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin
#games:x:12:100:games:/usr/games:/sbin/nologin
#ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
#nobody:x:99:99:Nobody:/:/sbin/nologin
#systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
#dbus:x:81:81:System message bus:/:/sbin/nologin
#polkitd:x:999:998:User for polkitd:/:/sbin/nologin
#tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
#abrt:x:173:173::/etc/abrt:/sbin/nologin
#sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
#postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@qls /service/scripts/day13]# sed 's#$#\##g'  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#
adm:x:3:4:adm:/var/adm:/sbin/nologin#
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin#
sync:x:5:0:sync:/sbin:/bin/sync#
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown#
halt:x:7:0:halt:/sbin:/sbin/halt#
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin#
operator:x:11:0:operator:/root:/sbin/nologin#
games:x:12:100:games:/usr/games:/sbin/nologin#
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin#
nobody:x:99:99:Nobody:/:/sbin/nologin#
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin#
dbus:x:81:81:System message bus:/:/sbin/nologin#
polkitd:x:999:998:User for polkitd:/:/sbin/nologin#
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin#
abrt:x:173:173::/etc/abrt:/sbin/nologin#
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin#
postfix:x:89:89::/var/spool/postfix:/sbin/nologin#

#插入   i



[root@qls /service/scripts/day13]# sed '1iqls'  passwd
qls
root:x:0:0:ROOT:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

[root@qls /service/scripts/day13]# sed '1iqls\nqiudao'  passwd
qls
qiudao
root:x:0:0:ROOT:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

[root@qls /service/scripts/day13]# sed '$s#$#\nqls#g'  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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
qls

#替换,在当前行替换  c   会删除匹配的行,同时在当前行插入内容  

[root@qls /service/scripts/day13]# sed  '1c qls'  passwd
qls
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@qls /service/scripts/day13]# sed  '/^root/c qls'  passwd
qls
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
qls


#将匹配到的内容写入到指定的文件中  w  重定向  

[root@qls /service/scripts/day13]# sed  -n  '/root/wnew.txt'  passwd
[root@qls /service/scripts/day13]# cat new.txt 
root:x:0:0:ROOT:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
root

[root@qls /service/scripts/day13]# sed  -n  '1wnew1.txt'  passwd
[root@qls /service/scripts/day13]# cat new1.txt 
root:x:0:0:ROOT:/root:/bin/bash

 
[root@qls /service/scripts/day13]# sed  -n  '1,10wnew2.txt'  passwd
[root@qls /service/scripts/day13]# cat new2.txt 
root:x:0:0:ROOT:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
	
	
#取反  !  

[root@qls /service/scripts/day13]# sed -n  '1!p'  passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@qls /service/scripts/day13]# sed  '1!d'  passwd
root:x:0:0:ROOT:/root:/bin/bash

#获取行号   =

[root@qls /service/scripts/day13]# sed = passwd
1
root:x:0:0:ROOT:/root:/bin/bash
2
bin:x:1:1:bin:/bin:/sbin/nologin

#后向引用  

[root@qls /service/scripts/day13]# sed -r 's#(.*)(:x.*:)(.*)#\3\2\1#g' passwd
/bin/bash:x:0:0:ROOT:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt

#取IP地址  

#排除内容   删除  

#排除空行

[root@qls /service/scripts/day13]# sed  '/^$/d' passwd  #删除没有空格和tab键的空行 

#排除用空格和tab键的空行  
[root@qls /service/scripts/day13]# sed  '/^[ \t]*$/d' passwd 

[root@qls /service/scripts/day13]# sed  '/^[[:space:]]*$/d' passwd 

[root@qls /service/scripts/day13]# sed  '/^\s*$/d' passwd 

#删除开头带有空格和tab键的注释行 
[root@qls /service/scripts/day13]# sed '/^[ \t]*#/d' /etc/nginx/conf.d/default.conf

#删除开头带有空格和tab键的注释行或者空行
[root@qls /service/scripts/day13]# sed -r '/^[ \t]*($|#)/d' /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

[root@qls /service/scripts/day13]# sed  '/^[ \t]*$/d;/^[ \t]*#/d' /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

[root@qls /service/scripts/day13]# sed -r  '/^[ \t]*$|^[ \t]*#/d' /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

#给文件内容加上注释  
[root@qls /service/scripts/day13]# sed -i  's/^/#/g' passwd 



#删除以#开头的行  
[root@qls /service/scripts/day13]# sed  '/^#/d' passwd


#添加注释  有空格或者tab或者#开头的行加上注释  
[root@qls /service/scripts/day13]# sed 's/^[ \t#]*/#/' 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
#
#adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@qls /service/scripts/day13]# sed 's/^[ \t]*#*/#/' passwd

[root@qls /service/scripts/day13]# sed '1,10s/^[ \t]*#*/#/' 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
#
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
posted @   zbzSH  阅读(46)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示