Linux sed命令详解
sed是一种流编编器,它是文本处理中非常中的工具,能够完美的配合正则表达式便用,功物能不同凡响。
处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间”( oattern space),接看用sed命令处理缓冲区中的内容,处理成后,把缓冲区的内容送往屏幕显示。
接着理下一行,这样不断重复,直到文件末。文件内容没有改改变,除非使用了写入的命令,将内容更新。
定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
sed命令功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 命令 功能 a\ 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行 c\ 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行 i\ 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行 d 删除行 h 把模式空间里的内容复制到暂存缓冲区 H 把模式空间里的内容追加到暂存缓冲区 g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容 G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面 l 列出非打印字符 p 打印行 n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理 q 结束或退出 sed r 从文件中读取输入行 ! 对所选行以外的所有行应用命令 s 用一个字符串替换另一个 g 在行内进行全局替换 w 将所选的行写入文件 x 交换暂存缓冲区与模式空间的内容 y 将字符替换为另一字符(不能对正则表达式使用y命令) |
sed常见命令参数
1 2 3 4 5 6 7 | p==print d:delete =:打印匹配行的行号 -n 取消默认的完整输出,只要需要的 -e 允许多项编辑 -i 修改文件内容 -r 不需要转义 |
1 | 注意:& 符号在 sed 命令中代表上次匹配的结果 |
常用的命令展示
sed擅长行输出,附源文件:
1 2 3 4 5 6 7 8 9 10 11 12 | hhh pts /1 192.168.25.1 Sat Jun 30 22:04 still logged in reboot system boot 2.6.32-358.el6.i Sat Jun 30 22:04 - 22:43 (00:38) omc pts /0 192.168.25.1 Sat Jun 30 20:16 - down (00:00) reboot system boot 2.6.32-358.el6.i Sat Jun 30 19:38 - 20:16 (00:37) root pts /1 192.168.25.1 Sat Jun 30 12:20 - down (00:55) root pts /0 192.168.25.1 Sat Jun 30 11:53 - down (01:22) reboot system boot 2.6.32-358.el6.i Sat Jun 30 11:52 - 13:15 (01:23) root pts /0 192.168.25.1 Sat Jun 30 05:40 - down (02:51) reboot system boot 2.6.32-358.el6.i Sat Jun 30 05:38 - 08:32 (02:54) root pts /0 192.168.25.1 Fri Jun 29 21:01 - down (06:21) wtmp begins Tue Jun 9 03:57:56 2015 |
只打印第三行
1 | sed -n '3p' /var/log/yum .log |
只查看文件的第3行到第9行
1 | sed -n '3,9p' /var/log/yum .log |
过滤特定字符串,显示正行内容
1 | sed -n '/root/p' yum.log |
显示包含"hhh"的行到包含"omc"的行之间的行
1 | sed -n '/hhh/,/omc/p' yum.log |
打印1-5行,并显示行号
1 | sed -n -e '1,5p' -e '=' yum.log |
仅仅显示匹配字符串的行号
1 | sed -n '/root/p' yum.log |
打印匹配行的内容和符号【相当于后面又根据关键词查询了一次】
1 | sed -n -e '/root/p' -e '/root/=' yum.log |
用world 替换yum.log文件中的root【真实写入】
1 2 3 4 5 | sed -i 's/root/world/g' yum.log ==> sed -i 's#hhh#HHHH#g' h.txt 与上同 s==search 查找并替换 g==global 全部替换 -i: implace |
打印最后一行
1 | sed -n '$p' yum.log |
在文件第一行添加happy,文件结尾添加new year
1 2 | sed -e '1i happy' -e '$a new year' yum.log 【界面显示】 sed -i -e '1i happy' -e '$a new year' yum.log 【真实写入文件】 |
在文件第一行和第四行的每行下面添加hahaha
1 | sed '1,4i hahaha' yum.log |
& 符号在sed命令中代表上次匹配的结果
1 | sed 's/world/hello_&/g' yum.log |
删除第3到第9行,只是不显示而已
1 | sed '3,9d' /var/log/yum .log |
删除包含"hhh"的行到包含"omc"的行之间的行
1 | sed '/hhh/,/omc/d' yum.log |
删除包含"omc"的行到第十行的内容
1 | sed '/omc/,10d' yum.log |
显示中5到10行里匹配root,把行内所有的root替换为FTL,并打印到屏幕上
1 2 | sed '5,10 s/root/FTL/g' yum.log【仅显示用】 sed -i sed '5,10 s/root/FTL/g' yum.log【-i 会真正替换信息】 |
-e是编辑命令,用于多个编辑任务
1 2 | 删除1到5行后,替换reboot为 shutdown sed -e '1,5d' -e '=' -e 's/reboot/shutdown/g' yum.log |
打印3到6行的内容,并匹配reboot替换为shutdown
1 | sed -n -e '3,6p' -e 's/reboot/shutdown/g' yum.log |
-r命令是读命令。sed使用该命令将一个文本文件中的内容加到当前文件的特定位置上
1 2 | [root@localhost log] # cat test.txt [root@localhost log] # sed '/root/ r /var/log/test.txt' yum.log 【yum.log 匹配root后读入text.txt的内容在匹配内容之下,仅显示用】 |
-w是写入命令
1 2 3 | sed '/root/ w /home/omc/root.txt' yum.log 【yum.log匹配root后写入root.txt',真实写入】 sed -n '/root/ w /home/omc/root.txt' yum.log 【添加-n参数后,不打印源文件】 ll /home/omc/root .txt |
打印1-5行,并显示行号
1 | sed -n -e '1,5p' -e '=' yum.log |
sed的正则匹配
正则匹配IP和子网掩码
1 2 3 4 | [root@localhost log] # ifconfig |sed -n '2p' [root@localhost log] # ifconfig |sed -n '2p' | sed -r 's#.*r:(.*) B.*k:(.*)#\1 \2#g' (.*)表示匹配的项,之后可以用\1取出第一个括号内匹配的内容,\2取出第二个括号内匹配的内容 |
配合find命令的使用
1 2 3 4 | find . -name "*.txt" | xargs sed -i 's/hhhh/\hHHh/g' find . -name "*.txt" | xargs sed -i 's#hhhh#hHHh#g' find . -name "*.txt" - exec sed -i 's/hhhh/\hHHh/g' {} \; find . -name "*.txt" | xargs cat |
sed错误使用
1 2 | sed 's#,# #h' h.txt | cut -d " " -f 3,5 h.txt <-- 错误的用法,前面已经处理了,后面又用 cut 查看h.txt文件 sed 's#,# #h' h.txt | cut -d " " -f 3,5 --> 正确的用法 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
· 用 C# 插值字符串处理器写一个 sscanf