模式空间和保持空间:
(1)模式空间:模式空间用于sed执行的正常流程中。该空间是sed内置的一个缓冲区,用来存放,修改从输入文件读取的内容。
(2)保持空间:保持空间是另外的一个缓冲区,用来存放临时的数据。sed可以在保持空间和模式空间交换数据,但是不能在保持空间上执行普通的sed命令。每次循环读取数据过程中,模式空间的内容都会被清空,然而保持空间的内容则保持不变,不会在循环中被删除。
h 把模式空间中的内容覆盖至保持空间中;
H 把模式空间中的内容追加至保持空间中;
g 把保持空间中的内容覆盖至模式空间中;
G 把保持空间中的内容追加至模式空间中;
x 把模式空间中的内容与保持空间中的内容互换;
n 覆盖读取匹配到的行的下一行至模式空间中;
N 追加读取匹配到的行的下一行至模式空间中;
d 删除模式空间中的行;
D 删除多行模式空间的所有行;
(1)sed -n 'n;p' 文件名 #显示偶数行
- [root@work ~]# cat -n sed.txt
- 1 One
- 2 Two
- 3 Three
- 4 Four
- 5 Five
- 6 Six
- [root@work ~]# sed -n 'n;p' sed.txt
- Two
- Four
- Six
(2)sed 'n;d' 文件名 #显示奇数行
- [root@work ~]# sed 'n;d' sed.txt
- One
- Three
- Five
(3)sed '1!G;h;$!d' 文件名 #逆序显示文件的内容
注意:1!G: #第1行不执行“G”命令,从第二行开始执行。
$!d: #最后一行不删除(保留最后一行)
- [root@work ~]# sed '1!G;h;$!d' sed.txt
- Six
- Five
- Four
- Three
- Two
- One
- 也可使用tac命令:
- [root@work ~]# tac sed.txt
- Six
- Five
- Four
- Three
- Two
- One
(4)sed '$!d' 文件名 #取出最后一行
- [root@work ~]# sed '$!d' sed.txt
- Six
(5)sed '$!N;$!D' 文件名 #取出文件后两行
- [root@work ~]# sed '$!N;$!D' sed.txt
- Five
- Six
(6)sed '/^$/d;G' 文件名 #删除原有的所有空白行,而后为所有的非空白行后添加一个空白行
- [root@work ~]# cat sed.txt
- One
- Two
-
- Three
- Four
- Five
- Six
- [root@work ~]# sed '/^$/d;G' sed.txt
- One
-
- Two
-
- Three
-
- Four
-
- Five
-
- Six
-
(7)sed 'G' 文件名 #在原有的每行后方添加一个空白行
- [root@work ~]# cat sed.txt
- One
- Two
- Three
- Four
- Five
- Six
- [root@work ~]# sed 'G' sed.txt
- One
-
- Two
-
- Three
-
- Four
-
- Five
-
- Six
-
4. 练习题:
(1)使用sed命令打印出ifconfig ens33的IP地址:
(2)使用sed命令打印系统版本:
(3)使用sed命令将 /etc/httpd/conf/httpd.conf 中 #NameVirtualHost *:80 去掉 # 号,同时将最后7行的#都去掉:
(4)复制 /boot/grub2/grub.cfg 文件至 /tmp目录中,删除 /tmp/grub.cfg 文件中的行首的空白字符:
(5)为 /tmp/grub.cfg 文件中前三行的行首添加#号:
(6)将 /etc/yum.repos.d/ CentOS-Media.repo 文件中所有的enabled=0或gpgcheck=0的最后的0修改为1:
(7)显示/etc/passwd文件中位于第偶数位置的用户的用户名: