sed
sed
目录
[toc]
简介
sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。sed 编辑器没有提供交互式使用方式,使用者只能在命令行输 入编辑命令、指定文件名,然后在屏幕上查看输出。 **sed 编辑器没有破坏性,它不会修改文件,除非使用 shell 重定向来保存输出结果。**默认情况 下,所有的输出行都被打印到屏幕上。
- sed工作过程
sed 编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。 sed 的命令就是在 vi和 ed/ex 编辑器中见到的那些。 sed 把当前正在处理的行保存在一个中,这个缓存区称为。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。 sed 每处理完输入文件的最后一行后, sed 便结束运行。 sed 把每一行都存在临时缓存区中,对 这个副本进行编辑,所以不会修改或破坏源文件。
从上图可以看出 sed 不是破坏性的,它不会修改正在编辑的文件。
语法
sed命令行格式为:sed[选项] ‘command’ 输入文本
选项
- sed 操作命令
a\在当前行后添加一行或多行c\用新文本修改(替换)当前行中的文本d删除行i\在当前行之前插入文本h把模式空间里的内容复制到暂存缓存区H把模式空间里的内容追加到暂存缓存区g取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容G取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面l列出非打印字符p打印行n读入下一输入行,并从下一条命令而不是第一条命令开始处理q结束或退出sedr从文件中读取输入行!对所选行意外的所有行应用命令s用一个字符串替换另一个#常用
n使用安静模式,在一般情况所有的STDIN都会输出到屏幕上,加入-n后只打印被sed特殊处理的行;😉e多重编辑,且命令顺序会影响结果;f指定一个sed脚本文件到命令行执行;rsed使用扩展正则;i直接修改文档读取的内容,不在屏幕上输出p打印行😉w将行写入文件x交换暂存缓冲区与模式空间的内容y将字符转换为另一字符(不能对正则表达式使用y命令)
插入:-i
i 命令是插入命令,类似于 a 命令,但不是在当前行后增加文本,而是在当前行前面插入新的文本,即刚读入缓存区模式的行。
- 选项含义
i\在当前行之前插入文本
替换
案例:替换
sed-is/SELINUX=enforcing/SELINUX=disabled//etc/selinux/config
删除
案例:删除以某个字段所在的行
#先打印[root@mysql ~]# sed -n '/^DROP TABLE/p'/backup/inc.sql DROPTABLE`students`#&/'/etc/fstab# 使用 free -m 确认 swap 已经关闭[root@master1 ~]#free -mhtotalusedfreesharedbuff/cacheavailableMem:1.8G89M1.5G9.5M144M1.5GSwap:0B0B0B
说明:
-r
:启用扩展正则表达式,使得在模式匹配中可以使用更多的功能和语法。.*swap.*
:这是一个正则表达式,表示匹配包含单词swap
的整行。.*
意味着匹配任意字符(包括空字符)零次或多次。#&
:这是替换的内容。#
是一个注释符号,&
表示匹配到的整个字符串。因此,整行会被替换为以#
开头,加上原行内容。
综上所述,这条命令的作用是:
- 在
/etc/fstab
文件中查找所有包含单词swap
的行。 - 将这些行的内容替换为原来的内容,并在开头添加一个
#
,使其变成注释。
执行后,所有包含 swap
的行将被注释掉,这意味着在系统启动时不会处理这些行。
插入
案例
案例:sed命令给文本文件指定行前插入内容
sed-i'1i\Your Text to Insert'filename
这会在 filename
文件的第一行之前插入指定的文本。请注意,-i
选项表示直接在文件中编辑,如果你不希望修改原始文件,可以省略 -i
选项,然后将输出重定向到一个新文件。
- 自己测试(测试成功)
[root@hg-linux-test ~]# cat test.txt 123[root@hg-linux-test ~]# sed -i '1i\Your Text to Insert'test.txt [root@hg-linux-test ~]# cat test.txt YourTexttoInsert123[root@hg-linux-test ~]#
案例:编辑前同时备份文件
#删除[root@mysql ~]# sed -i.bak '/^DROP TABLE/d'/backup/inc.sql [root@mysql ~]# ll /backup/inc.sql -rw-r--r--.1rootroot2909Sep2217:17/backup/inc.sql[root@mysql ~]# ll /backup/inc.sql.bak -rw-r--r--.1rootroot2957Sep2217:12/backup/inc.sql.bak
说明:
-i.bak
:表示对文件进行原地编辑,并在修改前创建一个备份文件。备份文件的扩展名为.bak
,这意味着如果原始文件是inc.sql
,那么在编辑之前会创建一个inc.sql.bak
的备份副本。d
:表示删除匹配到的行。
案例:sed打印只改变的行
测试成功。
是的,sed
(流编辑器)可以通过使用 -n
选项以及 p
命令来实现只打印被修改的行。下面是一个简单的示例:
sed-n's/pattern/replacement/p'filename
在这个例子中:
-n
参数告诉sed
不要自动打印每一行。s/pattern/replacement/p
表示查找匹配pattern
的行,用replacement
替换,然后打印结果。
这样,只有被修改的行才会被打印。请注意,如果某一行没有发生替换,那么它将不会被打印。
选项含义:
-n,--quiet,--silentsuppressautomaticprintingofpatternspace#`-n` 参数告诉 `sed` 不要自动打印每一行。
测试过程:
例如,假设有一个文件 example.txt
包含以下内容:
[root@hg-linux-test ~]# cat example.txt applebananacherrydate[root@hg-linux-test ~]#
- 你可以使用以下
sed
命令:
[root@hg-linux-test ~]# sed -n 's/a/X/p'example.txtXpplebXnanadXte[root@hg-linux-test ~]#
这将把每一行中的第一个 'a'替换为 'X',并只打印被修改的行。
- 如果你想要对文件进行原地修改,你可以使用
-i
选项,但请谨慎使用,因为这将更改源文件:
[root@hg-linux-test ~]# sed -i -n 's/a/X/p'example.txt[root@hg-linux-test ~]# cat example.txt XpplebXnanadXte[root@hg-linux-test ~]#
- 如果你只是想要查看替换结果而不修改文件,可以使用
cat
命令:
catexample.txt|sed-n's/a/X/p'等价于sed-n's/a/X/p'example.txt[root@hg-linux-test ~]# cat example.txt |sed-n's/a/X/p'XpplebXnanadXte[root@hg-linux-test ~]#
这样,原始文件内容将保持不变。
- 要全部替换内,该如何办?(加上一个g选项就好了)
[root@hg-linux-test ~]# sed -n 's/a/XX/pg'example.txtXXpplebXXnXXnXXdXXte[root@hg-linux-test ~]#
正则选项:-r
案例
[root@mysql ~]# mysql -uroot -e 'show databases'|grep-Ev'^(Database|information_schema|performance_schema)$'|sed-rn's#(.*)#mysqldump -B \1 |gzip >/backup/\1.sql.gz#p'|bash[root@mysql ~]# ll /backup/ -ttotal3092-rw-r--r--.1rootroot137110Sep2306:56mysql.sql.gz-rw-r--r--.1rootroot1900Sep2306:56hellodb2.sql.gz-rw-r--r--.1rootroot1971Sep2306:56hellodb.sql.gz-rw-r--r--.1rootroot519Sep2306:56db2.sql.gz……
|sed -rn 's#(.*)#mysqldump -B \1 |gzip >/backup/\1.sql.gz#p'
:
- 将经过过滤的数据库列表传递给
sed
命令,进行格式化处理。 -r
选项启用扩展正则表达式,-n
选项使sed
只输出被处理的行。s#(.*)#mysqldump -B \1 |gzip >/backup/\1.sql.gz#p
:s#(.*)#...#
是替换命令,将匹配到的行替换为mysqldump
命令。\1
表示被匹配的数据库名称。- 最终输出的格式是
mysqldump -B 数据库名 |gzip >/backup/数据库名.sql.gz
。
案例:\s*
匹配零个或多个空白字符(如空格、制表符)
显示系统信息
echo-e"\tCpu :$(lscpu|grep"Model name:"|sed's/Model name:\s*sed's/Model name:\s*sed是一个流编辑器,用于对文本进行处理和转换。这里的sed命令执行的是替换操作:s/Modelname:\s*s表示替换命令。Modelname:\s*是要匹配的模式。Modelname:匹配文本Modelname:。\s*匹配零个或多个空白字符(如空格、制表符)。经过sed处理后,上述示例行会变成:Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
案例
[root@mysql ~]# mysql -uroot -e 'show databases'|sed-rn'/^(Database|information_schema|performance_schema)$/!s#(.*)#mysqldump -B \1 |gzip >/backup/\1.sql.gz#p'|bash[root@mysql ~]# ll /backup/ -ttotal3092-rw-r--r--.1rootroot137111Sep2306:58mysql.sql.gz-rw-r--r--.1rootroot1900Sep2306:58hellodb2.sql.gz-rw-r--r--.1rootroot1971Sep2306:58hellodb.sql.gz-rw-r--r--.1rootroot519Sep2306:58db2.sql.gz
案例:步进
总结
本章内容总结了 sed 命令的用法,前面部分是 sed 命令的语法,后面部分则主要以实际案例来说明 sed 的用法,最后面一点介绍了 sed 命令在生产实践中的运用。所谓学为练,练为战,希望大家能够将 sed 命令勤加练习,必将会在工作中有所用途,尤其是**频繁的分析日志文件, Awk+sed 是比 较好的组合。**最后希望本文对大家有所帮助,真正达到熟练的程度这就靠大家在工作中归纳总结了。