- Linux管理员教程
- 首页
- CentOS概述
- 基本的CentOS Linux命令
- 文件/文件夹管理
- 用户管理
- 配额管理
- Systemd服务启动和停止
- 使用systemctl进行资源管理
- 使用cgroups进行资源管理
- 进程管理
- 防火墙设置
- 在CentOS Linux中配置PHP
- 使用CentOS Linux设置Python
- 在CentOS Linux上配置Ruby
- 为CentOS Linux设置Perl
- 安装和配置Open LDAP
- 创建SSL证书
- 安装Apache Web服务器CentOS 7
- 在CentOS 7上设置MySQL
- 设置Postfix MTA和IMAP/POP3
- 安装匿名FTP
- 远程管理
- CentOS中的流量监控
- 日志管理
- 备份和恢复
- 系统更新
- Shell脚本
- 软件包管理
- 卷管理
- Linux管理员有用资源
- Linux管理员 - 快速指南
- Linux管理员 - 有用资源
- Linux管理员 - 讨论
Linux管理员 - sed命令
sed是一个复杂的实用程序,需要掌握。此命令流式传输编辑器以过滤和转换文本。已经编写了整本书专门用于熟练地使用sed。因此请记住,本教程的目的是介绍sed的三个基本常用用法:
- 字符替换
- 打印操作
- 删除操作
sed的常用命令语法为:
sed [options] [file to operate on]
以下是需要记住的常用sed开关。
开关 | 动作 |
---|---|
-i | 就地编辑文件而不是流,-i[SUFFIX]创建备份文件 |
-e | 添加要执行的脚本命令 |
-n | 静默,抑制自动打印 |
-r | ReGex,在脚本中使用扩展正则表达式 |
-i将把更改应用于文件,而不是像传递到sed一样编辑文件的流。
sed在与-e选项一起使用时,扩展了命令以对流处理多个操作。这可以代替递归地管道化sed来完成。
echo "Windows and IIS run the Internet" | sed -e 's/Windows/Linux/' -e 's/ and IIS//' -e 's/run/runs/' Linux runs the Internet
sed的-n选项会抑制默认打印到标准输出。如我们所见,使用sed的打印命令,每一行都将被复制到标准输出。
bash-3.2# sed 'p' ./lines.txt line1 line1 line2 line2
这次,我们使用sed的-n选项:
bash-3.2# sed -n 'p' ./lines.txt line1 line2
sed会将内容流发送到标准输出。当添加'p'或打印命令时,会为每一行发送一个单独的流,导致所有行在标准输出中被复制。
sed替换命令
此命令使用's'选项指定。我们已经多次看到sed与其替换命令一起使用。以下是一个简单的示例:
[root@centosLocal Documents]# echo "developers eat veggies and fruit" | sed -e 's/veggies/pizza/' -e 's/fruit/coffee/' developers eat pizza and coffee [root@centosLocal Documents]#
让我们在一个名为dev.txt的文件上试试这个:
[root@centosLocal centos]# cat dev.txt Developers code all night and sleep all day. [root@centosLocal centos]#
现在,让我们更改文件的内容,而不仅仅是发送到sed的输出流:
[root@centosLocal centos]# sed -ibak 's/sleep/code/' ./dev.txt [root@centosLocal centos]# ls dev* dev.txt dev.txtbak [root@centosLocal centos]# cat dev* Developers code all night and code all day. Developers code all night and sleep all day. [root@centosLocal centos]#
注意 - 我们使用-i选项和一个唯一的后缀来创建备份文件。
sed打印命令
此命令使用'p'命令指定。
让我们使用我们的names.txt文件,输出为了简洁起见已进行编辑:
[root@centosLocal Documents]# sed -n "p" ./names.txt Ted:Daniel:101 Jenny:Colon:608 Dana:Maxwell:602 Marian:Little:903 Bobbie:Chapman:403 Nicolas:Singleton:203 Dale:Barton:901 Aaron:Dennis:305
sed允许使用“地址”更细致地定义打印到标准输出的内容:
[root@centosLocal Documents]# sed -n "1,10p" ./names.txt Ted:Daniel:101 Jenny:Colon:608 Dana:Maxwell:602 Marian:Little:903 Bobbie:Chapman:403 Nicolas:Singleton:203 Dale:Barton:901 Aaron:Dennis:305 Santos:Andrews:504 Jacqueline:Neal:102 [root@centosLocal Documents]#
就像head一样,我们打印了names.txt文件的前10行。
如果我们只想打印出那些在9楼有办公室的人呢?
[root@centosLocal Documents]# sed -n "/90/p" ./names.txt Marian:Little:903 Dale:Barton:901 Kellie:Curtis:903: Gina:Carr:902 Antonia:Lucas:901 [root@centosLocal Documents]#
很简单。我们还可以打印出所有人,除了那些在9楼有办公室的人:
[root@centosLocal Documents]# sed -n '/90/ !p' ./names.txt Ted:Daniel:101 Jenny:Colon:608 Dana:Maxwell:602 Bobbie:Chapman:403 Nicolas:Singleton:203 Aaron:Dennis:305 Santos:Andrews:504 Jacqueline:Neal:102 Billy:Crawford:301 Rosa:Summers:405 Matt:Davis:305 Francisco:Gilbert:101 Sidney:Mac:100 Heidi:Simmons:204 Matt:Davis:205 Cristina:Torres:206 Sonya:Weaver:403 Donald:Evans:403
在上面的代码中,我们用!否定了/和/之间的'p'打印操作。这与“d”或删除命令类似。但是,否定在sed中的结果可能会有所不同。因此,作为一个通用的规则:p用于打印并否定您不想要的内容。
sed删除命令
如前所述,删除命令与sed打印命令相反。让我们从我们的name.txt文件开始:
[root@centosLocal Documents]# sed 'd' ./names.txt [root@centosLocal Documents]#
没有打印任何内容。在上面的命令中,我们要求sed从流中的标准输出中删除每一行。现在,让我们只打印前两行并“删除”其余的流:
[root@centosLocal Documents]# sed '1,2 !d' ./names.txt Ted:Daniel:101 Jenny:Colon:608 [root@centosLocal Documents]#
看到了吧?类似于'p'或打印命令。现在让我们用删除命令做一些有用的事情。假设我们要删除文件中所有空行:
[root@centosLocal Documents]# cat lines.txt line1 line2 line3 line4 line5 [root@centosLocal Documents]#
从复制和粘贴电子邮件或使用非标准换行符格式化时,收到包含杂乱文本的此类文件并不罕见。我们无需在vim中交互式编辑文件,而是可以使用sed为我们完成这项工作。
[root@centosLocal Documents]# sed -i '/^\s*$/ d' ./lines.txt [root@centosLocal Documents]# cat ./lines.txt line1 line2 line3 line4 line5 [root@centosLocal Documents]#
该文件现在以易于阅读的方式格式化。
注意 - 在对重要文件进行更改时,请使用-i开关。强烈建议附加文件备份后缀以保留文件内容(sed可能会因最轻微的错误而进行一些极端的更改)。