sed编辑器与awk用法
一、了解sed工具
1、sed工具的介绍
sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell 脚本中,用以完成各种自动化处理任务。
sed是一种流编辑器,流编辑器会在编辑处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。
sed 的工作流程主要包括读取、执行和显示三个过程。
- 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
- 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
2、使用sed的注意事项
在使用sed命令处理文件时,在所有的文件内容都被处理完成之前,上述过程(读取、执行、显示)将重复执行,直至所有内容被处理完。
默认情况下所有的sed命令都是在缓存空间内执行的,因此文件本身的并不会因为sed命令发生任何变化,除非使用了重定向符将编辑后的文件从新存储输出到新的文件。
例如,使用sed命令将/etc/passwd文件中的所有信息删除,在从新查看etc/passwd文件中的内容,发现并没有删除。
[root@localhost ~]# sed 'd' /etc/passwd //使用sed命名删除/etc/passwd中所有的内容
[root@localhost ~]# cat /etc/passwd //查看etc/passwd中的内容
root:x:0:0:root:/root:/bin/bash //所有内容都还在 说明使用sed命令不能改变源文件
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
........... 省略部分内容
3、sed 命令常见用法
通常情况下调用 sed 命令有两种格式:
sed [选项] ‘操作’ 参数
sed [选项] -f scriptfile 参数
- 其中,“参数”是指操作的目标文件, 当存在多个操作对象时用,文件之间用逗号“,”分隔;
- 而 scriptfile 表示脚本文件,需要用“-f” 选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。
4、常见的 sed 命令 选项
选项 | 注释 |
---|---|
-f 或–file= | 表示用指定的脚本文件来处理输入的文本文件。 |
-e 或–expression= | 表示用指定命令或者脚本来处理输入的文本文件。 |
-h 或–help | 显示帮助。 |
–quiet 或 silent | 表示仅显示处理后的结果。 |
-i | 直接编辑文本文件。 |
5、常见的 sed 命令 操作
操作 | 注释 |
---|---|
a | 增加,在当前行下面增加一行指定内容。 |
c | 替换,将选定行替换为指定内容。 |
d | 删除,删除选定的行。 |
i | 插入,在选定行上面插入一行指定内容。 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。 |
s | 替换,替换指定字符。 |
y | 字符转换。 |
l | 打印数据流中的文本和不可打印的 ASCII字符(比如结束符%、制表符 \t) |
二、sed工具的用法示例
1、输出指定的行(p 表示正常输出)
1.1、sed的基本用法
[root@localhost ~]# sed -n 'p' /etc/passwd //输出所有内容,等同于 cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
.......... //省略部分信息
[root@localhost ~]# sed -n '3p' /etc/passwd //输出第三行的内容
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]# sed -n '3,5p' /etc/passwd //输出3到5行的内容
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]# sed -n 'p;n' /etc/passwd
//输出文本的奇数行,p打印第一行,n表示读入下一行的内容,没有输出,以此类推,就输出了全部的奇数行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
.......... //省略部分信息
[root@localhost ~]# sed -n 'n;p' /etc/passwd
//输出文本的偶数行,n表示读入下一行的内容,没有输出,p打印第二行的内容,以此类推,就输出了全部的偶数行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
.......... //省略部分信息
[root@localhost ~]# sed -n '1,5{p;n}' /etc/passwd //输出第 1~5 行之间的奇数行(第 1、3、5 行)
[root@localhost ~]# sed -n '10,${n;p}' /etc/passwd //输出第 10 行至文件尾之间的偶数行
//在执行“sed -n‘10,${n;p}’test.txt”命令时,读取的第 1 行是文件的第 10 行,
//读取的第 2行是文件的第 11 行,依此类推,所以输出的偶数行是文件的第 11 行、13 行直至文件结尾,
//其中包括空行。
1.2、sed结合正则表达式的用法
[root@localhost ~]# sed -n '/root/p'