sed是一种在线编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
文件内容并没有改变,除非你使用重定向存储输出。
在处理方式上,sed与awk很类似,都是逐行读取。sed在批量处理文本时很有用,常用来做批量替换。
awk适合用来处理表格类的数据,而sed则适合用来处理不规则的数据
从语法上看,sed与awk都很相似:
- sed [options] 'command' file(s)
- sed [options] -f scriptfile file(s)
先看一些最简单的sed例子:
先创建一个测试文件sed.txt,内容如下:
- 1034 7:26
- 1034 7:27
- 1101 7:32
- 1006 7:45
- 1012 7:46
- 1028 7:49
- 1051 7:51
- 1029 7:57
- 1042 7:59
- 1008 8:01
- 1052 8:05
- 1005 8:12
- 1005 8:13
1.打印文件某一行
- sed -n '3p' sed.txt
输出:
- 1101 7:32
说明:上面的程序打印出了文档的第三行。-n选项会禁止默认的输出,如果不使用,将会打印出整个文件。sed默认会将每一行都输出到标准输出设备上,此项关闭了这个属性。p用于将模式空间中的内容输出到标准输出设备中。在这个例子中,3表示的是第三行,当第三行进入到模式空间后,就会输出到标准输出设备上。
上面的程序严格来说是有效率问题的,如果我们的sed.txt有一千万行,上面的程序在输出第三行后仍然会扫描余下的行,这样会很慢。改进一下:
- sed -n '3p;3q' sed.txt
或者:
- sed -n '3{p;q;}' sed.txt
要用awk来实现上面的功能,可以用下面的代码:
- awk 'NR==3' sed.txt
当然,为了提高效率,可以如下改进:
- awk 'NR==3{print;exit;}' sed.txt
2.打印文件的某几行
- sed -n '3,5p:5q' sed.txt
输出:
- 1101 7:32
- 1006 7:45
- 1012 7:46
说明:上面的程序打印出了文档的第3-5行。3,5表示的是打印的范围。
用awk来实现如下:
- awk 'NR>=3&&NR<=5' sed.txt
更高效一点:
- awk '{if(NR>=3&&NR<=5){print}else if(NR>5){exit}}' sed.txt
3.打印整个文件
- sed '' sed.txt
输出:
- 1034 7:26
- 1034 7:27
- 1101 7:32
- 1006 7:45
- 1012 7:46
- 1028 7:49
- 1051 7:51
- 1029 7:57
- 1042 7:59
- 1008 8:01
- 1052 8:05
- 1005 8:12
- 1005 8:13
说明:当command什么都不写,也没有指定-n时,sed会取出每一行输出。
awk的实现如下:
- awk '{print}' sed.txt
本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1057812,如需转载请自行联系原作者