目录
awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。
2.sed编辑器及其工作流程
sed编辑器:
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。sed编辑器工作流程:
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。
sed的工作流程主要包括读取、执行和显示三个过程:1.读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
2.执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
3.显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
2.1 命令格式及常用选项
sed -e '格式' 文件1 文件2 ...
sed -n -e ‘操作’ 文件1 文件2 ...
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...
sed -e ' n { 操作1 操作2 ... } ' 文件1 文件2
-e或- -expression=: 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一 般在执行多个操作命令使用
f或- -file=: 表示用指定的脚本文件来处理输入的文本文件。
h或- -help: 显示帮助。
-n、- -quiet或silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出。
-i: 直接修改目标文本文件。
2.2 动作说明
s : 替换,替换指定字符。
d : 删除,删除选定的行。
a :增加,在当前行下面增加一行指定内容。
i :插入,在选定行,上面插入一行指定内容。
c :替换,将选定行替换为指定内容。
y :字符转换,转换前后的字符长度必须相同。
p :打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用
2.3 准备文本
# 我们先准备一个文件做测试内容如下
[root@c83 zmq]# cat linux
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
2.4 增加内容
# 增加内容
# 1.使用命令sed 3anewfile linux这个命令的意思就是,在第三行后面追加newLine这么一行字符,字符前面要用反斜线作区分。执行完毕之后可以看到结果
[root@c83 zmq]# sed '3anewfile' linux
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
newfile
Linux test
# 2.但是注意,这个只是将文字处理了,没有写入到文件里,文件里还是之前的内容。
其实 a 前面是可以匹配字符串,比如我们只想在出现 Linux 的行后面追加,就可以:sed /Linux/anewfile linux,两个斜线之间的内容是需要匹配的内容。可以看出,只有第二、第四行有Linux,所以结果如下:
[root@c83 zmq]# sed '/Linux/anewfile' linux
HELLO LINUX!
Linux is a free unix-type opterating system.
newfile
This is a linux testfile!
Linux test
newfile
# 3.这里用引号把整个表达式括起来也可以,还方便处理带空格的字符
sed /Linux/anewline linux 等效于 sed '/Linux/anewline' linux
2.5 插入内容
# 插入内容
# 1.跟 a 类似,sed 3inewline linux是在第三行前面插入newfile:
[root@c83 zmq]# sed '3inewfile' linux
HELLO LINUX!
Linux is a free unix-type opterating system.
newfile
This is a linux testfile!
Linux test
# 2.sed /Linux/inewfile linux是在所有匹配到Linux的行前面插入:
[root@c83 zmq]# sed '/Linux/inewfile' linux
HELLO LINUX!
newfile
Linux is a free unix-type opterating system.
This is a linux testfile!
newfile
Linux test
# 可以看出插入的用法和增加很相似。
2.6 删除内容
# 删除内容
# 1.删除的字符是d,用法跟前面也很相似,就不赘述,例子如下:
[root@c83 zmq]# sed '/Linux/d' linux
HELLO LINUX!
This is a linux testfile!
# 可以看到匹配到的Linux行全被删了
2.7 替换内容
# 替换内容
# 1.替换也是一样,字符是c。举个例子
[root@c83 zmq]# sed '/Linux/cWindows' linux
HELLO LINUX!
Windows
This is a linux testfile!
Windows
# 可以看到将匹配到的Linux行全部替换为Windows
# 2.替换还有个字符是s,但是用法由不太一样了,最常见的用法:sed 's/old/new/g'其中old代表想要匹配的字符,new是想要替换的字符,比如:
[root@c83 zmq]# sed 's/Linux/Windows/g' linux
HELLO LINUX!
Windows is a free unix-type opterating system.
This is a linux testfile!
Windows test
# 这里可以看到是将Linux这一个字符替换为Windows,而不是整行内容
# 这里的/g的意思是一行中的每一次匹配,因为一行中可能匹配到很多次
# 举个例子
# 编辑一个新文本
[root@c83 zmq]# cat xx
aaaaaaaa
bbbbabbb
cccaabbb
# 3.假设我们想把一行中的第三次及以后出现的a变成大写A,那应该这么写:
[root@c83 zmq]# sed 's/a/A/3g' xx
aaAAAAAA
bbbbabbb
cccaabbb
# 可以看出只有第一行的有的改了,因为第二第三行没有这么多a出现。
# 关于s还有很多用法,还是回到第一个文件,比如可以用/^/和/$/分别代表行首和行尾:
2.8 多个匹配
# 1.用-e命令可以执行多次匹配,相当于顺序依次执行两个sed命令:
[root@c83 zmq]# sed -e 's/Linux/Windows/' linux
HELLO LINUX!
Windows is a free unix-type opterating system.
This is a linux testfile!
Windows test
[root@c83 zmq]# sed -e 's/Linux/Windows/' -e 's/Windows/Mac OS/' linux
HELLO LINUX!
Mac OS is a free unix-type opterating system.
This is a linux testfile!
Mac OS test
# 相当于在前面命令的基础上执行后面的命令
2.9 转换内容
# 转换命令是特有的,不仅因为它在所有的sed命令中拥有最小的肋记符。这个命令按位置将字符串abc中的每个字符,都转换成字符串xyz中的等价字符,它的语法如下: y/abc/ABC/
# 查看文本
[root@c83 zmq]# cat linux
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
# 1.现在我们将文本内容全部变成大写字母
[root@c83 zmq]# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' linux
HELLO LINUX!
LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.
THIS IS A LINUX TESTFILE!
LINUX TEST
# 2.将Linux这一行文本内容全部变成大写字母
[root@c83 zmq]# sed '/Linux/{y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/}' linux
HELLO LINUX!
LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.
This is a linux testfile!
LINUX TEST
2.10 打印内容
# 打印命令(p)输出模式空间的内容。它既不清除模式空间也不改变脚本中的控制流。然而,它频繁地用在改变流控制的命令(d,N, b)之前。除非抑制(-n)默认的输出