sed是一种流编编器,stream edit 它是文本处理中非常中的工具,能够完美的配合正则表达式便用,功物能不同凡响。
处理时,把当前处理的行存储在临时缓冲区(内存)中,称为”模式空间”( pattern space),接看用sed命令处理缓冲区中的内容,处理成后,把缓冲区的内容送往屏幕显示。
接着理下一行,这样不断重复,直到文件末。可使用了写入的命令,将内容更新。
定位行地址用于决定对哪些行进行编辑。行定位地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定行定位地址,sed将处理输入文件的所有行。
sed命令功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
命令 功能
a\ 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行 a代表append之意
c\ 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行 c代表current之意
i\ 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行 i代表 insert之意
d 删除行 d为delete之意
h 把模式空间里的内容复制到暂存缓冲区
H 把模式空间里的内容追加到暂存缓冲区
g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
l 列出非打印字符 l代表list之意
p 打印行 p代表print之意
n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理 n为next之意
q 结束或退出sed q为quit之意
r 从文件中读取输入行 r代表read之意
! 对所选行以外的所有行应用命令 !代表“非” 代表反选之意
s 用一个字符串替换另一个
g 在行内进行全局替换 g 代表global之意:全局
w 将所选的行写入文件 w代表write之意
x 交换暂存缓冲区与模式空间的内容 x代表exchange交换之意
y 将字符替换为另一字符(不能对正则表达式使用y命令)
sed常见命令参数
1
2
3
4
5
6
7
p==print
d:delete
=:打印匹配行的行号
-n 取消默认的完整输出,只要需要的
-e 允许多项编辑
-i 修改文件内容
-r 不需要转义
1
注意:& 符号在sed命令中代表上次匹配的结果
常用的命令展示
sed擅长行输出,附源文件:
1
2
3
4
5
6
7
8
9
10
11
12
hhh pts/1 192.168.25.1 Sat Jun 30 22:04 still loggedin
reboot system boot 2.6.32-358.el6.i Sat Jun 30 22:04 - 22:43 (00:38)
omc pts/0 192.168.25.1 Sat Jun 30 20:16 - down (00:00)
reboot system boot 2.6.32-358.el6.i Sat Jun 30 19:38 - 20:16 (00:37)
root pts/1 192.168.25.1 Sat Jun 30 12:20 - down (00:55)
root pts/0 192.168.25.1 Sat Jun 30 11:53 - down (01:22)
reboot system boot 2.6.32-358.el6.i Sat Jun 30 11:52 - 13:15 (01:23)
root pts/0 192.168.25.1 Sat Jun 30 05:40 - down (02:51)
reboot system boot 2.6.32-358.el6.i Sat Jun 30 05:38 - 08:32 (02:54)
root pts/0 192.168.25.1 Fri Jun 29 21:01 - down (06:21)
wtmp begins Tue Jun 9 03:57:56 2015
只打印第三行
1
sed -n'3p' /var/log/yum.log
只查看文件的第3行到第9行
1
sed -n'3,9p' /var/log/yum.log
过滤特定字符串,显示正行内容
1
sed -n'/root/p' yum.log
显示包含"hhh"的行到包含"omc"的行之间的行
1
sed -n'/hhh/,/omc/p' yum.log
打印1-5行,并显示行号
1
sed -n -e'1,5p' -e'='yum.log
仅仅显示匹配字符串的行号
1
sed -n'/root/p' yum.log
打印匹配行的内容和符号【相当于后面又根据关键词查询了一次】
1
sed -n -e'/root/p' -e'/root/=' yum.log
用world 替换yum.log文件中的root【真实写入】
1
2
3
4
5
sed -i's/root/world/g' yum.log
==>sed -i's#hhh#HHHH#g' h.txt 与上同
s==search 查找并替换
g==global 全部替换
-i: implace
打印最后一行
1
sed -n'$p' yum.log
在文件第一行添加happy,文件结尾添加new year
1
2
sed -e'1i happy' -e'$a new year' yum.log 【界面显示】
sed -i -e'1i happy' -e'$a new year' yum.log 【真实写入文件】
在文件第一行和第四行的每行下面添加hahaha
1
sed '1,4i hahaha' yum.log
& 符号在sed命令中代表上次匹配的结果
1
sed 's/world/hello_&/g' yum.log
删除第3到第9行,只是不显示而已
1
sed '3,9d' /var/log/yum.log
删除包含"hhh"的行到包含"omc"的行之间的行
1
sed '/hhh/,/omc/d' yum.log
删除包含"omc"的行到第十行的内容
1
sed '/omc/,10d' yum.log
备注:范围可以用数字、正则表达式、或二者的组合表示
显示中5到10行里匹配root,把行内所有的root替换为FTL,并打印到屏幕上
1
2
sed '5,10 s/root/FTL/g' yum.log【仅显示用】
sed -ised '5,10 s/root/FTL/g' yum.log【-i 会真正替换信息】
-e是编辑命令,用于多个编辑任务
1
2
删除1到5行后,替换reboot为shutdown
sed -e'1,5d' -e'=' -e's/reboot/shutdown/g' yum.log
打印3到6行的内容,并匹配reboot替换为shutdown
1
sed -n -e'3,6p' -e's/reboot/shutdown/g' yum.log
-r命令是读命令。sed使用该命令将一个文本文件中的内容加到当前文件的特定位置上
1
2
[root@localhost log]# cat test.txt
[root@localhost log]# sed '/root/ r /var/log/test.txt' yum.log 【yum.log 匹配root后读入text.txt的内容在匹配内容之下,仅显示用】
-w是写入命令
1
2
3
sed '/root/ w /home/omc/root.txt' yum.log 【yum.log匹配root后写入root.txt',真实写入】
sed -n'/root/ w /home/omc/root.txt' yum.log 【添加-n参数后,不打印源文件】
ll/home/omc/root.txt
打印1-5行,并显示行号
1
sed -n -e'1,5p' -e'=' yum.log
sed的正则匹配
正则匹配IP和子网掩码
1
2
3
4
[root@localhost log]# ifconfig |sed -n '2p'
[root@localhost log]# ifconfig |sed -n '2p' | sed -r 's#.*r:(.*) B.*k:(.*)#\1 \2#g'
(.*)表示匹配的项,之后可以用\1取出第一个括号内匹配的内容,\2取出第二个括号内匹配的内容
配合find命令的使用
1
2
3
4
find . -name"*.txt" |xargs sed -i's/hhhh/\hHHh/g'
find . -name"*.txt" |xargs sed -i's#hhhh#hHHh#g'
find . -name"*.txt" -exec sed -i's/hhhh/\hHHh/g' {} \;
find . -name"*.txt" |xargs cat
sed错误使用
1
2
sed 's#,# #h' h.txt |cut -d" " -f 3,5 h.txt cut查看h.txt文件
sed 's#,# #h' h.txt |cut -d" " -f 3,5 --> 正确的用法
作者:小a玖拾柒
出处:http://www.cnblogs.com/ftl1012/
-------------------------------------------
个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~
本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!