linux神器sed快速入门,不好用你打我!

为什么要学习sed

sed(Stream EDitor)被誉为Linux三剑客之一,负责过滤和转换文本,功能灵活又强大,搭配正则表达式更是如虎添翼。

如果你需要向1000行文本中的某一行后添加新行,如果你需要删除/查找文本中从me到you之间的内容,那么sed命令是你的最佳选择。

sed命令的工作模式

sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。所以sed编辑器默认不会改动文件内容。

linux神器sed快速入门,不好用你打我!

sed命令的格式

  1. sed [options] ‘command’ files
  2. 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命令确实很强大吧!但作为系统管理员要有谨慎行事的风格,不要像例子里一样搞”歪门邪道”。

Original: https://www.cnblogs.com/randyszone/p/16306062.html
Author: randy198
Title: linux神器sed快速入门,不好用你打我!

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/583080/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球