linux神器sed快速入门,不好用你打我!
为什么要学习sed
sed(Stream EDitor)被誉为Linux三剑客之一,负责过滤和转换文本,功能灵活又强大,搭配正则表达式更是如虎添翼。
如果你需要向1000行文本中的某一行后添加新行,如果你需要删除/查找文本中从me到you之间的内容,那么sed命令是你的最佳选择。
sed命令的工作模式
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。所以sed编辑器默认不会改动文件内容。
sed命令的格式
- sed [options] ‘command’ files
- sed [options] -f scriptfile files
常用的options:
-n # 禁止将模式空间(临时缓存区)的内容打印出来
-r # 使用扩展正则表达式
-f # 使用文件,后跟文件名,使用脚本文件中的sed动作处理目标文件
-i # 直接修改文件内容
-e # 直接在命令行模式下进行sed脚本命令编辑,默认选项
常用的command:
无地址或单地址command
a /
text # 将text追加到指定/匹配所在行下,若不指定位置会在每行下执行此动作。多个行用反斜杠\加回车隔开
sed '$a \ This is a test for sed.' /etc/group
i /
text # 将text插入指定/匹配所在行之上
sed '$i \ This is a second test for sed.' /etc/group
r filename # 将指定文件的文本追加到指定位置
sed '$r ./test.sh' /etc/group
接受地址范围的command:
c \
text # 将text替换选定的范围的内容
sed '60,64c \ \line 60-64 is empty' /etc/group
d # 将匹配到的行删除
替换标记s相关命令
格式如下:s/正则/替换内容/标记
其中常用的标记有:
n # 表示替换范围内第n个目标。
# 某段文本内出现了3次‘abc’,如果把n写为3,就表示把第三个abc替换掉
g # 表示范围内全局替换,如果没有g则在第一处匹配到的位置完成替换
p # 输出匹配到的行,一般与option中-n联用
sed -n 's/zhangsan$/lisi/p' /etc/group # 把/etc/group中以zhangsan结尾的位置替换为李四,并把结果打印到屏幕上
sed命令范例
[root@study_rhel Desktop]# sed '$a \ \ This is a append test for sed.\ ' /etc/group # 在/etc/group行末追加一行文字,前后各空一行 …… apache:x:48: zhangsan:x:1001: project:x:1002:zhangsan This is a append test for sed.
[root@study_rhel Desktop]# sed '$i \ This is a second test for sed.\ Sed is a very powerful tool.' /etc/group # 在/etc/group行末前插入两行文字 …… zhangsan:x:1001: This is a second test for sed. Sed is a very powerful tool. project:x:1002:zhangsan
[root@study_rhel Desktop]# sed '/^linuxprobe/r /etc/shadow' /etc/group # 匹配以linuxprobe开头的行并在行后完整插入/etc/shadow中的文本内容 …… linuxprobe:x:1000:linuxprobe # /etc/shadow文件内容在下一行插入 root:$…… …… zhangsan:$…… # 文件插入结束 apache:x:48: zhangsan:x:1001: project:x:1002:zhangsan
[root@study_rhel Desktop]# sed '/^linuxprobe/,/^zhangsan/c \ > Both of you were deleted!' /etc/group # 用一段文字替换掉从以linuxprobe开头的行到以zhangsan开头的行,起止用逗号隔开 …… postfix:x:89: sshd:x:74: tcpdump:x:72: Both of you were deleted! project:x:1002:zhangsan
已知一个组名project,组内成员有zhangsan。某天需要把linuxprobe也加入此组中,如果此时你作为管理员却忘记了useradd -G 命令,是否还有其他的方法可以把linuxprobe加入组中?
我们知道/etc/group是用户组的记录文件,先tail查看一下这个文件
[root@study_rhel Desktop]# tail -n 3 /etc/group apache:x:48: zhangsan:x:1001: project:x:1002:zhangsan # 以冒号分隔的区段中,最后一段记录了组内的用户名称 # 我们可以vim打开修改这个文件,更直接的方法是用sed! [root@study_rhel Desktop]# sed -i '/^project/ s/$/,linuxprobe/' /etc/group # 匹配以project开头的行并在行末把“,linuxprobe”替换上去 [root@study_rhel Desktop]# tail -n 3 /etc/group apache:x:48: zhangsan:x:1001: project:x:1002:zhangsan,linuxprobe [root@study_rhel Desktop]# id linuxprobe uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),1002(project) [root@study_rhel Desktop]# groups linuxprobe linuxprobe : linuxprobe project # linuxprobe的支持群组多了个project [root@study_rhel Desktop]# sed -i '/^project/ s/,linuxprobe$//' /etc/group # 演示完毕,删掉他,别忘了逗号
sed命令确实很强大吧!但作为系统管理员要有谨慎行事的风格,不要像例子里一样搞“歪门邪道”。