操作系统三剑客命令-sed

本文详细介绍了Linux三剑客之一的sed命令,包括其执行原理、常用参数、元字符集以及增删改查操作的实例。通过学习,读者能够熟练掌握sed在文本处理中的应用,如按行号或内容筛选、删除、添加和修改文件信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01.知识概述部分

1)三剑客sed命令概述介绍
2)三剑客sed命令执行原理 命令基本语法
3)三剑客sed命令实操练习 增 删 改 查

02.知识回顾说明

1)基础正则符号:7个 ^ $ . * \ [ ] [^ ]

2)扩展正则符号:5个 + ? | { } ()
grep +E 或者egrep
sed +r
识别扩展正则 + 不识别时用egrep “+”

3)总结grep命令参数

grep -i  ------忽略大小写搜索信息
grep -n ------搜索信息后显示行号
grep -c ------统计筛选出来的行数
grep -v ------将搜索信息进行取反
grep -o ------只输出显示匹配信息
grep -w ------按照字符串进行匹配
grep -A ------过滤指定内容之后的信息
grep -B ------过滤指定内容之前的信息
grep -C ------过滤指定内容上下几行的信息
grep -E ------识别扩展正则信息
grep -r  ------递归搜索指定的信息  示例:grep -r "oldboy" ./

03.三剑客命令sed概述介绍

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed - stream editor for filtering and transforming text
      用于过滤和转换文本的流编辑器

1)可以查找过滤筛选出指定的信息
2)可以编辑文件内容信息
3)擅长对文件行进行操作
4)编写脚本:系统基础优化脚本
sh 优化脚本

04.三剑客sed命令执行原理

执行原理过程:将按照文件每行信息进行处理,找出符合条件信息,执行相应操作

命令语法结构:sed 【参数】 ‘条件 指令(处理动作)’ 文件信息
如何定义条件:根据行号 根据内容 根据正则信息
如何定义指令:满足条件的信息处理动作(添加 删除 修改 输出)

常用参数:
a\ 在当前行下面插入文本。
i\ 在当前行上面插入文本。
c\ 把选定的行改为新的文本。
d 删除,删除选择的行。
D 删除模板块的第一行。
s 替换指定字符
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l 列表不能打印字符的清单。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p 打印模板块的行。
P(大写) 打印模板块的第一行。
q 退出Sed。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file 从file中读行。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file 写并追加模板块到file末尾。  
W file 写并追加模板块的第一行到file末尾。  
! 表示后面的命令对所有没有被选定的行发生作用。  
= 打印当前行号码。  
# 把注释扩展到下一个换行符以前。  
sed替换标记
g 表示行内全面替换。  
p 表示打印行。  
w 表示把行写入一个文件。  
x 表示互换模板块中的文本和缓冲区中的文本。  
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记
sed元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。  
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。

05.三剑客sed命令实操练习

准备练习文件:

cat >>person.txt<<EOF
101,oldboy,CEO 
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF

1)熟悉sed命令查询操作(输出操作)

根据行号进行筛选
[root@jason oldboy]# awk '{print NR,$0}' awk_test.txt                 awk显示所有行号
[root@jason oldboy]# grep -n "xxx" awk_test.txt                       grep显示文件行号
[root@jason oldboy 10:19:56]# cat -n person.txt                       cat显示行号
[root@jason oldboy 10:20:40]# sed "=" person.txt |xargs -n2           sed显示行号

· 单行信息: sed ‘3p’ 文件信息 p:输出信息 -n不显示默认输出

[root@jason oldboy 10:04:27]# sed -n '3p' person.txt 
103,Alex,COO

· 多行信息: sed -n ‘2,4p’ 文件信息

[root@jason oldboy 10:04:31]# sed -n '2,4p' person.txt 
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO

· 连续多行信息:sed -n ‘2,$p’ 文件信息

[root@jason oldboy 10:13:04]# sed -n '1,$p' person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

· 不连续多行 : sed -n ‘2p;4p’ person.txt

[root@jason oldboy 10:07:19]# sed -n '2p;4p' person.txt
102,zhaoyao,CTO
104,yy,CFO
[root@jason oldboy 17:45:33]# sed -n '1p;3p;5p' person.txt 
101,oldboy,CEO
103,Alex,COO
105,feixue,CIO
根据字符进行筛选

· 单行信息:sed -n ‘/oldboy/p’ person.txt

[root@jason oldboy 10:32:36]# sed -n '/oldboy/p' person.txt
101,oldboy,CEO

· 多行信息

连续多行信息输出:

[root@jason oldboy 10:36:53]# sed -n '/oldboy/,/Alex/p' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO

(会一直查找oldboy下面到Alex的内容)!!!
[root@jason oldboy 10:39:48]# sed -n '/oldboy/,/Alex/p' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE

不连续多行信息输出:

[root@jason oldboy 10:40:03]# sed -n '/oldboy/p;/Alex/p' person.txt
101,oldboy,CEO
103,Alex,COO
106,oldboy,COO

2)熟悉sed命令删除操作

sed -i '6d' person.txt    ------真正删除文件信息
-i    ------将模式空间隐藏操作影响到磁盘中

将模式空间信息 —> 覆盖 —> 磁盘文件中

sed -i.bak '/COO/d' person.txt   ---将源文件内容先进行备份,再进行操作
-i放在最后,-i后面的字符就是备份文件的扩展名
-i与-n不要一起使用!!!
根据行号进行删除

· 单行删除

[root@jason oldboy 10:40:06]# sed '3d' person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
104,yy,CFO
105,feixue,CIO

· 多行删除

连续多行

[root@jason oldboy 10:46:52]# sed '3,5d' person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE

不连续多行

[root@jason oldboy 10:49:23]# sed '3d;5d' person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
104,yy,CFO
106,oldboy,COO
107,oldgirl,CPP
根据字符进行删除
[root@jason oldboy 10:53:07]# cat person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE

· 单行信息

[root@jason oldboy 19:24:56]# sed '/yy/d' person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
105,feixue,CIO

· 多行信息

连续多行信息删除

[root@jason oldboy 19:22:50]# sed '/yy/,/oldboy/d' person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
107,oldgirl,CPP
108,olddog,CEE

不连续多行信息删除

[root@jason oldboy 19:27:00]# sed '/yy/d;/oldboy/d' person.txt 
102,zhaoyao,CTO
103,Alex,COO
105,feixue,CIO
107,oldgirl,CPP
108,olddog,CEE
坑:删除一个文件有#号的行

1)查询出需要删除的内容

sed -n '/^#/p' config

2) 删除文件信息 这个-n要记得删除

sed -i '/^#/p'  config

PS:

  1. -i参数后面不能再跟上其他参数
  2. -i参数和-n参数尽量不要结合使用
    -i : 真正修改文件内容

3)熟悉sed命令添加操作

根据行号添加信息
3a:在第三行的后面添加相应信息
3i :在第三行的上面添加相应信息

· 单行添加

[root@jason oldboy 11:18:51]# sed '1aoldboy69' person.txt 
101,oldboy,CEO
oldboy69
102,zhaoyao,CTO
103,Alex,COO

· 多行添加

连续多行:

[root@jason oldboy 11:29:09]# sed '1,3aoldboy69' person.txt
101,oldboy,CEO
oldboy69
102,zhaoyao,CTO
oldboy69
103,Alex,COO
oldboy69
104,yy,CFO

不连续多行

[root@jason oldboy 11:30:12]# sed -e '1aoldboy69' -e '3aoldboy69' -e '5aoldboy69' person.txt 
101,oldboy,CEO
oldboy69
102,zhaoyao,CTO
103,Alex,COO
oldboy69
104,yy,CFO
105,feixue,CIO
oldboy69
106,oldboy,COO

补充:在指定行后面添加多行信息 利用换行符\n

[root@jason oldboy 11:30:49]# sed '1aoldboy69\noldboy70' person.txt 
101,oldboy,CEO
oldboy69
oldboy70
102,zhaoyao,CTO
103,Alex,COO

根据字符进行添加???????????????

sed '/^test/i\this is a test line' file

· 单行添加

[root@jason oldboy 20:45:22]# sed 's/yy/&ABC/' person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yyABC,CFO
105,feixue,CIO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE
[root@jason oldboy 20:46:39]# sed 's/yy/ABC&/' person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,ABCyy,CFO
105,feixue,CIO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE

· 多行添加

连续多行
不连续多行

企业常见配置文件添加信息方法:
[root@jason oldboy 11:19:54]# sed '$aoldboy69'  person.txt  -----> $表示最后一行; 在最后一行后面附加新的信息
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,COO
107,oldgirl,CPP
108,olddog,CEE
oldboy69

在每一行后面追加字符串 ABC,使得新文件为

[root@jason oldboy 20:31:57]# sed 's/$/ ABC/' person.txt 
101,oldboy,CEO ABC
102,zhaoyao,CTO ABC
103,Alex,COO ABC
104,yy,CFO ABC
105,feixue,CIO ABC
106,oldboy,COO ABC
107,oldgirl,CPP ABC
108,olddog,CEE ABC

在指定字符后面添加

[root@jason oldboy 20:45:05]# sed 's#yy# &ABC#' person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104, yyABC,CFO
105,feixue,CIO


awk           统计分析    正则符号(基础 扩展) \n \t
   
sed           编辑        正则符号(基础)             \n \t -r  
   
grep          筛选        正则符号(基础)             -E egrep
   
常用基础命令  最低级别    正则符号  \n \t

4)熟悉sed命令修改操作 *****

根据行号替换信息

· 根据单行进行替换

[root@jason oldboy 23:40:04]# sed '1s#oldboy#123456#g' person.txt
101,123456,CEO    ------ 将oldboy信息替换为123456
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

在指定字符前面或后面替换 $

[root@jason oldboy 20:02:49]# sed '/yy/{s#$#12345#g}' person.txt 
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO12345
利用正则将信息匹配出来,再做替换

· 根据多行进行替换

[root@jason oldboy 23:41:28]# sed '2,4s#[0-9]\+#abc#g' person.txt
101,oldboy,CEO
abc,zhaoyao,CTO
abc,Alex,COO
abc,yy,CFO
利用后项引用前项做替换:
练习:网卡地址进行变更
[root@jason oldboy 00:13:37]# sed -r '/IPADDR/s#(.*=).*#\110.0.0.201#g'  /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=56adcb14-5024-4844-b4a3-7768d5ea8bfb
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.201
PREFIX=24
GATEWAY=10.0.0.254
IPV6_PRIVACY=no
DNS1=223.5.5.5
练习:批量创建用户信息 oldboygirl01 … oldgirl10 不能使用for循环 bash命令

思路一:拼凑出来10个创建用户命令

useradd oldgirl01
useradd oldgirl02
useradd oldgirl03
useradd oldgirl04
useradd oldgirl05
useradd oldgirl06
useradd oldgirl07
useradd oldgirl08
useradd oldgirl09
useradd oldgirl10


seq -w 10|sed -r 's#(.*)#useradd olddog\1#g'|bash
seq -w 10|sed -r 's#(.*)#useradd olddog\1#g'

思路二
批量创建用户,生成随机密码
第一个历程: 拼凑出创建用户并设置密码命令

seq -w 10|sed -r 's#(.*)#useradd olddog\1;echo 密码信息|passwd --stdin olddog\1#g'
useradd olddog01;echo 密码信息|passwd --stdin olddog01
useradd olddog02;echo 密码信息|passwd --stdin olddog02
useradd olddog03;echo 密码信息|passwd --stdin olddog03
useradd olddog04;echo 密码信息|passwd --stdin olddog04
useradd olddog05;echo 密码信息|passwd --stdin olddog05
useradd olddog06;echo 密码信息|passwd --stdin olddog06
useradd olddog07;echo 密码信息|passwd --stdin olddog07
useradd olddog08;echo 密码信息|passwd --stdin olddog08
useradd olddog09;echo 密码信息|passwd --stdin olddog09
useradd olddog10;echo 密码信息|passwd --stdin olddog10

第二个历程: 生成随机密码信息

seq -w 10|sed -r 's#(.*)#useradd olddog\1;echo $(tr -cd 'a-zA-Z0-9' </dev/urandom|head -c 6)|passwd --stdin olddog\1#g'
useradd olddog01;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog01
useradd olddog02;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog02
useradd olddog03;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog03
useradd olddog04;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog04
useradd olddog05;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog05
useradd olddog06;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog06
useradd olddog07;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog07
useradd olddog08;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog08
useradd olddog09;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog09
useradd olddog10;echo $(tr -cd a-zA-Z0-9 </dev/urandom|head -c 6)|passwd --stdin olddog10

第三个历程: 将用户和密码对应关系信息, 进行保存

seq -w 10|sed -r 's#(.*)#useradd olddog\1;passwd=$(tr -cd 'a-zA-Z0-9' </dev/urandom|head -c 6);echo $passwd|passwd --stdin olddog\1; echo olddog\1 $passwd >>/tmp/user_passwd#g'|bash
练习:实现批量修改文件名称

思路一:找出要修改的文件

[root@jason oldboy 00:54:23]# ls
567.txt  777.txt   oldboy01.txt  oldboy02.txt  oldboy03.txt  person.txt
666.txt  oldboy01  oldboy02      oldboy03      passwd        test01.txt

[root@jason oldboy 00:54:41]# find /oldboy -maxdepth 1 -type f -name "[0-9]*.txt"
/oldboy/567.txt
/oldboy/666.txt
/oldboy/777.txt

思路二:如何修改,命令mv

[root@jason oldboy 00:58:53]# mv 567.txt  567.jpg
[root@jason oldboy 00:59:09]# ls
567.jpg  777.jpg   oldboy01.txt  oldboy02.txt  oldboy03.txt  person.txt

思路三:整合命令并使用bash执行

[root@jason oldboy 00:56:39]# find /oldboy -maxdepth 1 -type f -name "[0-9]*.txt"|sed -r 's#(.*)txt#mv \1txt \1jpg#g'|bash
[root@jason oldboy 00:56:46]# ls
567.jpg  777.jpg   oldboy01.txt  oldboy02.txt  oldboy03.txt  person.txt
666.jpg  oldboy01  oldboy02      oldboy03      passwd        test01.txt
练习:利用sed命令取出ip地址

思路一: 取出有IP地址行的信息

ip a s eth0|sed -n '3p'

思路二: 取出IP地址(将前面减掉/将后面减掉)

[root@oldboy69 oldboy 12:32:25]# ip a s eth0|sed -n '3p'|sed -r 's#.*inet (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g'
10.0.0.200

sed -r 's#.*inet (.*)#\1#g'
sed -r 's#(.*)/24.*#\1#g'
	   
sed -r 's#.*inet (.*)/24.*#\1#g'
   
ip a s eth0|sed -n '3p'|sed -r 's#.*inet (.*)/24.*#\1#g'
10.0.0.200

	   
sed -n '3                         p'     (3p可以分开)
sed -r 's#.*inet (.*)/24.*#\1#g'
	   
sed -nr '3s#.*inet (.*)/24.*#\1#gp'   (最终答案)
# ip a s eth0|sed -nr '3s#.*inet (.*)/24.*#\1#gp'
10.0.0.200
06.sed命令使用忠告

1)sed命令操作时候要做备份

sed -i.bak        ------在编辑文件时,直接对文件进行备份
# sed  -rir '2s#(oldboy)#\169#g' person.txt 
[root@oldboy69 oldboy 12:52:22]# ll person.txt*
-rw-r--r--. 1 root root  96 Dec 19 12:52 person.txt
-rw-r--r--. 1 root root 107 Dec 19 12:46 person.txt.bak
-rw-r--r--. 1 root root  94 Dec 19 12:52 person.txtr
说明: sed命令在是使用时, 需要用到多个参数, 要将-i参数写在所有参数后面

2)sed命令在使用时, 一定不要让-n参数和-i参数一起使用

sed命令课程总结:

1)sed命令作用说明
a 过滤筛选文件内容信息
b 擅长对指定行进行操作
c 擅长直接编辑文件内容

2)sed命令执行原理

3)sed命令语法格式 sed 参数 ‘条件 指令’ 文件信息
参数:
-n ------取消默认输出
-i ------真正编辑文件内容
-r ------识别扩展正则
-e ------识别多个条件操作

指令:
p ------输出信息
d ------删除操作
a ------向下附加操作
i ------向上插入操作
s ------替换操作
g ------全局替换

4)sed命令实践用法
a 如何进行查询操作 根据行/字符
b 如何进行删除操作 根据行/字符
c 如何进行添加操作 根据行/字符
d 如何进行替换操作 根据行/字符 后项引用前项() \1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值