linux三剑客sed命令使用教程

发布时间:2023-01-09 18:38:36 作者:yexindonglai@163.com 阅读(1007)

sed是什么

sed 是 stream editor 的缩写,中文称之为“流编辑器”。

sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理,处理后的结果会输出到标准输出(STDOUT)。你会发现 sed 命令是很懂礼貌的一个命令,它不会对读取的文件做任何贸然的修改,而是将内容都输出到标准输出中。

sed原理

sed 命令是面向“行”进行处理的,每一次处理一行内容。处理时,sed 会把要处理的行存储在缓冲区中,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。这个缓冲区被称为“模式空间”(pattern space)。

sed命令选项

选项 说明
-e 表示用指定命令或脚本来处理输入的文本文件
-f 表示用指定的脚本文件来处理输入的文本文件
-h 或—help 显示帮助
-n 表示显示处理后的结果
-i 直接编辑文本文件
-i.bak 备份文本文件
-r,-E 使用扩展正则表达式
-s 将多个文件视为独立文件,而不是单个连续的长文件流

sed针对文件操作的命令

命令 说明
a 增加,在当前行下面增加一行指定内容
c 替换,将选定行替换为指定内容
d 删除,删除选定的行
i 插入,在选定行上面插入一行指定内容
p 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容
s 替换,替换指定字符
y 字符转换

迁移符合条件的文本

在使用 sed 命令迁移符合条件的文本时,常用到以下参数

H 复制到剪贴板
g G 将剪贴板中的数据覆盖/追加至指定行
w 保存为文件
r 读取指定文件
a 追加指定内容
l i 忽略大小写

sed用法

在此之前,先看看原文件的内容

  1. #我们先来看看原文件的内容
  2. [roc@roclinux ~]$ cat 1.txt
  3. test 1
  4. test2
  5. test3
  6. test4
  7. test5

1、模糊匹配

/the/ 包含 显示包含the的行

  1. sed -n '/the/p' test.log

打印第4行开始有the的行

  1. sed -n '4,/the/p' test.log

打印出现the所在行号

  1. sed -n '/the/=' test.log

显示the开头的行

  1. sed -n '/^the/p' test.log

显示数字0-9结尾的行

  1. sed -n '/[0-9]$/p' test.log

模糊匹配删除

  1. 删除文件中带字符“2”的行
  2. sed '/2/d' roc.txt

删除后的文件内容

  1. [roc@roclinux ~]$ cat 1.txt
  2. test 1
  3. test3
  4. test4
  5. test5

2、提取某一列数据

先来一起看看/etc/passwd文件的内容

  1. [root@master home]# cat /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin
  4. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  5. adm:x:3:4:adm:/var/adm:/sbin/nologin
  6. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  7. sync:x:5:0:sync:/sbin:/bin/sync
  8. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  9. halt:x:7:0:halt:/sbin:/sbin/halt
  10. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  11. operator:x:11:0:operator:/root:/sbin/nologin
  12. games:x:12:100:games:/usr/games:/sbin/nologin
  13. ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
  14. nobody:x:99:99:Nobody:/:/sbin/nologin
  15. systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
  16. dbus:x:81:81:System message bus:/:/sbin/nologin
  17. polkitd:x:999:998:User for polkitd:/:/sbin/nologin
  18. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  19. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  20. chrony:x:998:996::/var/lib/chrony:/sbin/nologin
  21. nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
  22. tcpdump:x:72:72::/:/sbin/nologin
  1. #我们这回用sed命令来提取文件中每行的第一个域, 间隔符是冒号
  2. [root@master home]# head -n 5 /etc/passwd|sed 's/:.*$//'
  3. root
  4. bin
  5. daemon
  6. adm
  7. lp

3、筛选行

显示 test.log 文件的第 10 行到第 20 行的内容

  1. sed -n '10,20p' test.log

显示第4行的内容

  1. sed -n '4p' test.log
  2. cat test.log | sed -n 4p

输出文件所有内容

显示所有奇数行

  1. sed -n 'p;n' 1.txt

显示所有偶数行

  1. sed -n 'n;p' 1.txt

4、替换

将所有以 d 或 D 开头的行里的所有小写 x 字符变为大写 X 字符

  1. sed '/^[dD]/s/x/X/g' test

5、删除每行的最后两个字符

  1. # 点号表示一个单个字符, 两个点号就表示两个单个字符
  2. sed 's/..$//' test

6、删除每一行的前两个字符

  1. sed 's/..//' test

7、展示匹配行之间的内容

展示匹配了2005的行和2007的行之间的内容

  1. #文件内容展示一下
  2. [roc@roclinux ~]$ cat mysed.txt
  3. Beijing 2003
  4. Beijing 2004
  5. Beijing 2005
  6. Beijing 2006
  7. Beijing 2007
  8. Beijing 2008
  9. Beijing 2007
  10. #我们想展示匹配了2005的行和2007的行之间的内容
  11. [roc@roclinux ~]$ sed -n ‘/2005/,/2007/p mysed.txt
  12. Beijing 2005
  13. Beijing 2006
  14. Beijing 2007

8、-e选项设置多个command

有一个地方值得大家注意,那就是-e选项的后面要立即接 command 内容,不允许再夹杂其他选项。

  1. #文件内容展示一下
  2. [roc@roclinux ~]$ cat mysed.txt
  3. Beijing 2003
  4. Beijing 2004
  5. Beijing 2005
  6. Beijing 2006
  7. Beijing 2007
  8. Beijing 2008
  9. Beijing 2007
  10. #我们通过2个-e选项设置了两个command,展示第1、2、4行的内容
  11. [roc@roclinux ~]$ sed -n -e 1,2p -e 4p mysed.txt
  12. Beijing 2003
  13. Beijing 2004
  14. Beijing 2006

9、插入内容

9.1、插入另一个文件的所有内容 r\
  1. #将要插入的内容保存到一个单独的文件中
  2. [roc@roclinux ~]$ cat ins.txt
  3. ====China====
  4. #展示一下要处理的文件
  5. [roc@roclinux ~]$ cat mysed.txt
  6. Beijing 2003
  7. Beijing 2004
  8. Beijing 2005
  9. Beijing 2006
  10. Beijing 2007
  11. Beijing 2008
  12. #使用r来实现插入 ,将ins.txt的内容插入到 mysed.txt的2005所在行的下面
  13. [roc@roclinux ~]$ sed ‘/2005/r ins.txt mysed.txt
  14. Beijing 2003
  15. Beijing 2004
  16. Beijing 2005
  17. ====China====
  18. Beijing 2006
  19. Beijing 2007
  20. Beijing 2008
9.2、在下一行插入指定内容 a\
  1. #在2004的下一行插入China
  2. [roc@roclinux ~]$ sed ‘/2004/a\China mysed.txt
  3. Beijing 2003
  4. Beijing 2004
  5. China
  6. Beijing 2005
  7. Beijing 2006
  8. Beijing 2007
  9. Beijing 2008
9.3、在上一行插入内容 i\
  1. [roc@roclinux ~]$ sed ‘/2004/i\China mysed.txt
  2. Beijing 2003
  3. China
  4. Beijing 2004
  5. Beijing 2005
  6. Beijing 2006
  7. Beijing 2007
  8. Beijing 2008

10、替换 y/

  1. #原文件内容
  2. [roc@roclinux ~]$ cat mysed.txt
  3. Beijing 2003
  4. Beijing 2004
  5. Beijing 2005
  6. Beijing 2006
  7. Beijing 2007
  8. Beijing 2008
  9. # y 就是按照字符顺序, 实现前后的替换,看上去是将所有的 "ei" 替换为 "ie",其实是将e换成i,将i换成e
  10. [roc@roclinux 20160229]$ sed 'y/ei/ie/' mysed.txt
  11. Biejeng 2003
  12. Biejeng 2004
  13. Biejeng 2005
  14. Biejeng 2006
  15. Biejeng 2007
  16. Biejeng 2008

在举例,如果换成y/ee/ei/会产生什么效果呢?

  1. [roc@roclinux 20160229]$ sed 'y/ee/ie/' mysed.txt
  2. Biijing 2003
  3. Biijing 2004
  4. Biijing 2005
  5. Biijing 2006
  6. Biijing 2007
  7. Biijing 2008
  8. # 原理,表面上看好像是将ee换成ie,其实替换的时候是单个替换的,
  9. # 也就是将ee中的第一个e换成ie中的第一个i,
  10. # 将ee第二个e换成ie中的第二个e,替换原理如下
  11. e e
  12. i e

11、将指定行写入到特定文件中

  1. #将包含2004、2005、2006的行保存到new.txt文件中
  2. [roc@roclinux ~]$ sed ‘/200[4-6]/w new.txt mysed.txt
  3. Beijing 2003
  4. Beijing 2004
  5. Beijing 2005
  6. Beijing 2006
  7. Beijing 2007
  8. Beijing 2008
  9. #我们要的内容已经乖乖到碗里来了
  10. [roc@roclinux ~]$ cat new.txt
  11. Beijing 2004
  12. Beijing 2005
  13. Beijing 2006

12、修改文件内容 -i

想要直接修改文件内容,只需要加个-i 参数即可,例如

  1. #删除文件中带字符“2”的行
  2. sed -i '/2/d' roc.txt

13、追加内容 a

在第3行下追加指定内容,,其中yexindong是新加的内容,3表示第三行,a表示追加

  1. sed '3ayexindong' roc.txt

关键字linux