目录
实验一:删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
实验二:删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#
实验三:在/root/install.log每一行行首增加#号
实验四:在/etc/fstab文件中不以#开头的行的行首增加#号
实验五:利用sed 取出ifconfig命令中本机的IPv4地址
1.sed学习
1.1工作原理
sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,处理
时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,
处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内
容并没有改变。
sed的特点:
(1)sed命令是将一系列的编辑命令应用于一批文本的理想工具。
(2)sed命令是一个非交互式的文本编辑器,它可以对来自文本文件以及标准输入的文本进行编
辑。其中,标准输入可以是来自键盘、文件重定向、字符串、变量或者是管道的文本。
(3)sed命令会从文件或者标准输入中一次读取一行数据,将其复制到缓冲区(最多8192字
节),然后读取命令行或者脚本的编辑子命令,对缓冲区中的文本行进行编辑。重复此过程,一直
到所有的文本行都处理完毕。
1.2 sed基本语法
sed OPTIONS… [SCRIPT] [INPUTFILE…]
常用的选项:
-n --quiet --silent |
不输出模式空间中的内容,使用安静模式,在一般
sed
的用法中,所有来自STDIN的数据一般都会被列出到屏幕上,但如果加上
-n
参数后,则只有经过
sed
特殊处理的那一行才会被列出来
|
-i |
直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作
|
-e -e script |
直接在命令行模式上进行
sed
的动作编辑,多个子命令之间可以用分号隔开
-e script
表示以选项中指定的script
来处理输入的文本文件;
|
-r |
使用扩展正则表达式
|
-f -f filename |
直接将
sed
的动作写在一个文件内
-f filename
则可以执行
filename
内的
sed
动作
|
1.3 模式空间中的编辑操作
1.3.1 地址定界
1 ) # : # 为数字,指定要进行处理操作的行; 1 ,表示第一行;2 ) $ :表示最后一行,多个文件进行操作的时候,为最后一个文件的最后一行;3 ) /regexp/ :表示能够被 regexp 匹配到的行;regexp 即基于正则表达式的匹配;4 ) /regexp/I :匹配时忽略大小写;5 ) \%regexp%: 任何能够被 regexp 匹配到的行,换用 % (用其他字符也可以,如: # )为边界符号;6 ) addr1,addr2 :指定范围内的所有的行(范围选定);常用地址定界表示方式:a ) 0 , /regexp/ :从起始行开始到第一次能够被 regexp 匹配到的行。b ) /regexp/,/regexp/ :被模式匹配到的行内的所有的行。7 ) first~step :指定起始的位置及步长,例如: 1~2 表示 1,3,5…8 ) addr1,+N :指定行以及以后的 N 行;addr1,~N :指定行开始的 N 行;
1.3.2 常用编辑命令
d |
删除匹配到的行
|
p |
打印模式空间中的内容
|
a \text |
append,
表示在匹配到的行之后追加内容
|
i \text |
insert,
表示在匹配到的行之前追加内容
|
c \text |
change,
表示把匹配到的行和给定的文本进行交换
|
s/regexp/replacement/flages
|
查找替换
,
替换
regexp
匹配到的内容(其中
/
可以用其他字符代替,例如@
)
|
y |
固定长度替换,要求替换的字符串长度相等
|
w /path/to/somefile |
将匹配到的文件另存到指定的文件中
|
其他编辑命令:
r |
读入文件内容追加到匹配行后面
|
R |
读入文件一行内容追加到匹配行后面
|
常用的flags:
g |
全局替换,默认只替换第一个
|
i |
不区分大小写
|
p |
如果成功替换则打印
|
sed 's/north/hello/' datafile -- 替换每行第一个 northsed 's/north/hello/g' datafile -- 全部替换sed '1 s/north/hello/g' datafile -- 替换第一行所有的 northsed '1 s/north/hello/' datafile -- 替换第一行第一个 northsed '1 s/north/hello/2' datafile -- 只替换第一行第二个 north
巧用替换删除内容(不是删除行)
sed 's/north//' datafile -- 删除所有行的第一个 northsed 's/north//g' datafile -- 删除全部的 northsed '1 s/north//2' datafile -- 删除第一行第二个sed 's/^.//' datafile -- 删除每行第一个字母sed 's/^\(..\)./\1/' datafile -- 删除第 3 个字母sed 's/^\<[a-Z]*[a-Z]\>//' datafile -- 删除每行第一个单词
1.4 sed扩展
特殊符号 | 说明 |
! |
对指定行以外的所有行应用命令
|
= |
打印当前行行号
|
~ |
"first~step"
表示从
first
行开始,以步长
step
递增
|
& |
代表被替换的内容
|
: |
实现一行命令语句可以执行多条
sed
命令
|
{} |
对单个地址或地址范围执行批量操作
|
+ |
地址范围中用到的符号,做加法运算
|
1.5 sed实验
实验一:删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
[root@manager ~]# sed -r 's/^[[:space:]]+//' /etc/grub2.cfg
实验二:删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#
和空白字符
[root@manager ~]# sed -r "s/^#[[:space:]]+//" /etc/fstab
实验三:在/root/install.log每一行行首增加#号
[root@manager ~]# sed -r 's/^.*$/#&/' /root/install.log
实验四:在/etc/fstab文件中不以#开头的行的行首增加#号
[root@manager ~]# sed "s/^[^#]/# /" /etc/fstab
实验五:利用sed 取出ifconfig命令中本机的IPv4地址
[root@manager ~]# ifconfig ens160 | sed -n '/inet /s#\(.*inet \)\(.*\)\(n.*\)#\2#g p'
[root@manager ~]# ifconfig | sed -n 2p | sed -r "s/.*inet[[:space:]]*//" | sed -r "s/[[:space:]]*netmask.*//"
上面两者均可实现,选择其一即可。
实验六:关闭本机SELinux的功能
[root@manager ~]# sed 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
实验七:在/etc/hosts配置文件中添加内容
[root@node1 second]# sed '1 i shell' /etc/hosts //在首行添加
[root@node1 second]# sed '$ a rookey' /etc/hosts //在末尾添加