三剑客——sed(增删改查)
我们先来回顾下老三—grep的参数
grep 过滤
-i
不区分大小写
-v
取反
-n
显示行号
-o
显示每次grep匹配到的内容
-E
支持扩展正则
egrep
-w
按照单词匹配
-A
显示grep找出的内容下几行
-B
显示grep找出的内容上几行
-C
同时显示grep找出的内天上下几行
-l
过滤时只显示文件名 不显示内容
-R
递归进行过滤
grep -Rl 'oldboy'
sed---> stream editor 流编辑器
p d s c a i 主要的几个参数
在这里插入图片描述
https://www.processon.com/view/link/5bea32c5e4b0ad314e894f53
1.读取文件(从文件或管道)的第1行
2.读取到sed使用的内存区域中(模式空间)
3.进行判断这一行是否是我要的1.如果是则则执行对应的命令(p d c a i s )
2.如果不是则读取下一行(注如果没加上-n sed会默认显示这行内容(模式空间内容))
※功能——增删改查
sed的参数
-n 取消默认输出
-l 修改文件内容
-r 支持扩展正则
-i.bak 先备份文件再修改文件内容
-e 执行多条命令
sed命令执行过程
在这里插入图片描述 https://www.processon.com/view/link/5cb7ede9e4b01941c8b13036
※我们在练习的时候要先创建好一个环境
[✡root@oldboy /tmp]# grep -n '.*' lidao.txt
1:101,oldboy,CEO
2:102,zhangyao,CTO
3:103,Alex,COO
4:104,yy,CFO
5:105,feixue,CIO
6:110,lidao,COCO
\\空行
查看 p
---->print 根据行号进行查找
---->'3,6p' 根据行号范围进行查找
---->'/oldb.y/p'使用正则进行过滤
---->'/102/,/105/p' 使用正则表示范围
查看第五行
[✡root@oldboy /tmp]# sed -n '5p' lidao.txt
105,feixue,CIO
查看第一行到第五行
[✡root@oldboy /tmp]# sed -n '1,5p' lidao.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
过滤a-z的行,类似grep
[✡root@oldboy /tmp]# sed -n '/[a-z]/p' lidao.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
找出带有oldboy和yy的行
第一种方法sed
[✡root@oldboy /tmp]# sed -rn '/oldbo|yy/p' lidao.txt
101,oldboy,CEO
104,yy,CFO
第二种方法grep和egrep
[?root@oldboy /tmp]# grep 'oldboy\|yy' lidao.txt
101,oldboy,CEO
104,yy,CFO
[?root@oldboy /tmp]# egrep 'oldboy|yy' lidao.txt
101,oldboy,CEO
104,yy,CFO
找到以old开头CFO结尾的行
[✡root@oldboy /tmp]# sed -n '/old/,/CFO/p' lidao.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
以102开头的行和没有的内容,显示102开始到下面所有内容
[✡root@oldboy /tmp]# sed -n '/102/,/#没有的内容#/p' lidao.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
增加
---->a 追加 在指定行后追加内容
---->i 追加 插入指定行的上面
---->c 把这一行内容先清空,再写入
给第三行下添加119,SB,UFO(显示临时)
[?root@oldboy /tmp]# sed '3a119,SB,UFO' lidao.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
119,SB,UFO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
给第三行下永久添加119,SB,UFO
[✡root@oldboy /tmp]# sed -i '3a119,SB,UFO' lidao.txt
[✡root@oldboy /tmp]# cat lidao.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
119,SB,UFO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
在第一行上添加101,oldboy,CEO
[✡root@oldboy /tmp]# sed -i '1i101,oldboy,CEO' lidao.txt
[✡root@oldboy /tmp]# grep '.*' lidao.txt
101,oldboy,CEO
101,oldboy,CEO
102,zhangyao,CTO
101,oldboy,CEO
103,Alex,COO
120,XOO
104,yy,CFO
105,feixue,CIO
在源文件第四行下添加120,chenxing,备份一份到当前目录lidao.txt.bak
[✡root@oldboy /tmp]# sed -i.bak '4a120,chenxing,XOO' lidao.txt
[✡root@oldboy /tmp]# ll lidao.txt.bak
-rw-r--r-- 1 root root 106 Apr 25 16:00 lidao.txt.bak
[✡root@oldboy /tmp]# cat lidao.txt.bak \\备份的文件未添加,在源文件添加了新内容
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
119,SB,UFO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
删除
---->d 删除指定空行
删除第四行
[✡root@oldboy /tmp]# sed '4d' lidao.txt
oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
120,chenxing,XOO
120,XOO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
删除lidao.txt中的空行
第一种显示空行
[✡root@oldboy /tmp]# sed -n '/^$/p' lidao.txt
\\空行
[✡root@oldboy /tmp]#
第二种不显示空行
[?root@oldboy /tmp]# sed -r '/^$/d' lidao.txt
oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
119,SB,UFO
120,chenxing,XOO
120,XOO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[?root@oldboy /tmp]#
第三种取反!
[✡root@oldboy /tmp]# sed -n '/^$/!p' lidao.txt
oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
119,SB,UFO
120,chenxing,XOO
120,XOO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[✡root@oldboy /tmp]#
第四种awk的方法
[✡root@oldboy /tmp]# awk '/^$/' lidao.txt \\显示空行
[✡root@oldboy /tmp]#
[✡root@oldboy /tmp]# awk '!/^$/' lidao.txt \\不显示空行
oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
119,SB,UFO
120,chenxing,XOO
120,XOO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[✡root@oldboy /tmp]#
↓↓不显示文件/etc/ssh/sshd_config 的空行或以#号开头的行↓↓
1.egrep
[✡root@oldboy /tmp]# egrep -v '^$|^#' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
UseDNS no
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
[✡root@oldboy /tmp]#
2.sed
[✡root@oldboy /tmp]# sed -nr '/^$|^#/!p' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
UseDNS no
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
[✡root@oldboy /tmp]#
3.awk
[✡root@oldboy /tmp]# awk '!/^$|^#/' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
UseDNS no
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
[✡root@oldboy /tmp]#
4.筛选掉a-Z开头的,空行多的时候不适用
[?root@oldboy /tmp]# grep '^[a-Z]' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
UseDNS no
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
[?root@oldboy /tmp]#
替换修改
---->s替换
---->g全局替换:
---->()后向引用在前面(##)把你要的内容保护起来,在后面俩个##之间通过/数字来引用,\1表示显示第一个括号内容
※格式
s#内容#内容#g
s@内容@内容@g
s/内容/内容/g
echo 123456 |sed 's#123456#<123456>#g'
echo 123456 |sed 's@123456@<123456>@g'
把oldboy替换为alex
[?root@oldboy /tmp]# sed 's#oldboy#alex#g' lidao.txt
alex,CEO
102,zhangyao,CTO
103,Alex,COO
119,SB,UFO
120,chenxing,XOO
120,XOO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
把oldboy替换为空/删除
[✡root@oldboy /tmp]# sed 's#oldboy##g' lidao.txt
,CEO
102,zhangyao,CTO
103,Alex,COO
119,SB,UFO
120,chenxing,XOO
120,XOO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
想要结果是<123456>
1.
[?root@oldboy /tmp]# echo 123456 |sed 's#123456#<123456>#g'
<123456>
2.
[✡root@oldboy /tmp]# echo 123456 |sed -r 's#(.)#\1#g'
123456
显示出12<34>56
1.
[?root@oldboy /tmp]# echo 123456 |sed -r 's#(12)(34)(56)#\1<\2>\3#g'
12<34>56
2.
[✡root@oldboy /tmp]# echo 123456 |sed -r 's#(3.)#<\1>#g'
12<34>56
显示<1><2><3><4><5><6>
1.
[✡root@oldboy /tmp]# echo 123456 |sed -r 's#(.)#<\1>#g'
<1><2><3><4><5><6>
2.
[✡root@oldboy /tmp]# echo 123456 |sed -r 's#(.)(.)(.)(.)(.)(.)#<\1><\2><\3><\4><\5><\6>#g'
<1><2><3><4><5><6>
在这里插入图片描述 https://www.processon.com/view/link/5cb7ede9e4b01941c8b13036
网友评论