本次讲解shell最牛的sed,人称脚本里的三剑客

一、sed命令

1.1sed的概述

1)sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

2)sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

3)Linux sed 命令是利用脚本来处理文本文件。

4)sed 可依照脚本的指令来处理、编辑文本文件。

5)sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等

1.2sed的语法和参数

sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数
常见的 sed 命令选项主要包含以下几种。
-e 或--expression=:表示用指定命令或者脚本来处理输入的文本文件。
-f 或--file=:表示用指定的脚本文件来处理输入的文本文件。
-h 或--help:显示帮助。
-n、--quiet 或 silent:表示仅显示处理后的结果。
-i.bak:直接编辑文本文件。
-r, -E 使用扩展正则表达式
-s  将多个文件视为独立文件,而不是单个连续的长文件流

“操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进行,则表示为“5,20 动作行为”。常见的操作包括以下几种。
a:增加,在当前行下面增加一行指定内容。
c:替换,将选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
s:替换,替换指定字符。
y:字符转换。

1.3sed的工作流程

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

 sed的工作流程主要包括读取、执行和显示三个过程:

  1. 读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
  2. 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
  3. 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

二、sed命令的使用演示

2.1打印内容

例题原本

shell脚本三剑客之sed_文本文件

2.1.1例题:打印指定行

2.1.1.2输出指定3行

shell脚本三剑客之sed_sed_02

2.1.1.3输出指定行(7 8)行

shell脚本三剑客之sed_文本文件_03

2.1.1.4输出双行(偶数)

shell脚本三剑客之sed_sed_04

2.1.1.5输出单行(奇数)

shell脚本三剑客之sed_sed命令_05

2.1.1.6打印出12以下的偶数(从第12行开始算为1,依次类推,故能打印出偶数两个)

shell脚本三剑客之sed_文本文件_06

2.1.1.7根据地址打印指定行数

打印出ens33的第二行

shell脚本三剑客之sed_文本文件_07

shell脚本三剑客之sed_sed命令_08

2.1.1.8利用包围(包含)的正则表达式“/”

打印出带the的行 /the/是包含

shell脚本三剑客之sed_sed命令_09

输出行号,(包含the的行号打印出来)

shell脚本三剑客之sed_sed命令_10

包含以PI的开头,的打印

以0到9结尾的打印

三、删除符合条件的文本

案例1:nl会打印出行数(空格不算)先列出行数,根据行数进行指定删除

shell脚本三剑客之sed_sed命令_11

案例2:4d是删除第4行 真正删除要加(-i)

shell脚本三剑客之sed_文本文件_12

案例3:删除6到9行 真正删除要加(-i)

shell脚本三剑客之sed_sed命令_13

案例4:删除包含bet的行的真正删除要加(-i)

shell脚本三剑客之sed_sed_14

案例5:删除a到z的开头的所以行(不包含大小写)

shell脚本三剑客之sed_sed_15

案例6:删除结尾带.的行(当删除结尾的. 发现有些没有删掉,那可能是在判断结尾 . 的时候后面又特殊字符不如空格)

shell脚本三剑客之sed_文本文件_16

案例7:删除所以行(空行没了)

shell脚本三剑客之sed_sed命令_17

四、替换符合条件的文本

案例一:将小写的the换成大写的THE

shell脚本三剑客之sed_sed命令_18

案例二:每行的第二个小写l换成大写L(按顺序排列的L的位置)

shell脚本三剑客之sed_文本文件_19

案例三:g是全局,将所有的o换成空串

shell脚本三剑客之sed_文本文件_20

案例四:在每行行首插入#号

shell脚本三剑客之sed_sed命令_21

案例五:在包含the 的每行行首插入#号

shell脚本三剑客之sed_sed_22

案例六:在第 3 行后插入一个新行,内容为shell脚本三剑客之sed_文本文件_23

案例七:在包含the 的每行后插入一个新行,内容为 New

shell脚本三剑客之sed_文本文件_24

案例八:在第 3 行后插入多行内容,中间的\n 表示换行

shell脚本三剑客之sed_文本文件_25

小案例:关闭增强

shell脚本三剑客之sed_sed_26

shell脚本三剑客之sed_文本文件_27

shell脚本三剑客之sed_sed_28

四、迁移符号条件的文本

sed迁移符号参数

选项

功能

H

复制到剪贴板

g、G

将剪贴板中的数据覆盖/追加至指定行

w

保存为文件

w

读取指定文件

a

追加指定内容。具体操作方法如下所示

I,i

忽略大小写

案例1复制包含the的行并删除 ,在尾部粘贴

shell脚本三剑客之sed_sed_29

案例2将1到5行复制并删除,复制到第14下面

shell脚本三剑客之sed_文本文件_30

案例3包含the的行保存在out.test里

shell脚本三剑客之sed_文本文件_31

案例4:包含the的每一行插入主机名

r读取/etc/hostname也就是主机名

shell脚本三剑客之sed_sed_32

案例5:在第4行插入ky19-GOOD

a追加的意思,也可以说是插入

shell脚本三剑客之sed_文本文件_33

案例6:在第三个插入ky19-GOOD并在下一行插入ky19-GOOD2

shell脚本三剑客之sed_文本文件_34

五、脚本来编辑文件

比如一个vsftp的服务配置脚本

sed 直接操作文件示例
编写一个脚本,用来调整 vsftpd 服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)。

[root@lo calhost ~]# vim local_only_ftp.sh
#!/bin/bash
# 指定样本文件路径、配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf "
CONFIG="/etc/vsftpd/vsftpd.conf"
# 备份原来的配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak 备份文件是否存在, 若不存在则使用 cp 命令进行文件备份
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak # 基于样本配置进行调整,覆盖现有文件
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG

sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG
# 启动vsftpd 服务,并设为开机后自动运行
systemctl restart vsftpd systemctl enable vsftpd
[root@localhost ~]# chmod +x local_only_ftp.s

哎。。。。整理到这你以为就完了吗不 ,,,,欲知后事如何,且听下回分解

”咚“