[shell编程]初识sed和gawk
一.sed编辑器
shell脚本最常见的用途就是处理文本文件,sed和gawk能够极大的简化需要进行的数据处理任务。sed编辑器是流编辑器,跟普通交互式文本编辑器(如vim)不同。流编辑器在编辑器处理数据前基于预先提供的一组规则来编辑数据流。由于命令都是一行一行顺序处理,sed编辑器必须一次就完成对文本的修改,所以比交互式编辑器速度快很多。
使用sed命令的格式:$ sed optioons script file
1.替换标记
s命令帮助我们用斜线间制定的第二个文本字符串代替地一个文本字符串,举一个简单的例子:
# echo This is a dog | sed 's/dog/big dog/'
This is a big dog
在sed命令行上执行多个命令时,用-e选项:
# echo This is a white dog | sed -e 's/white/black/; s/dog/cat/'
This is a black cat
如果有大量sed命令,可以放入一个文件内,用-f选项制定文件,此时不需要用分号:
$ cat script
s/white/black
s/dog/cat
2.使用地址
默认情况下,sed编辑器中使用的命令会作用与文本数据的所有行。如果只想将命令作用于特定某行或者某些行,需要用行寻址。
sed有两种行寻址:行的数字范围;用文本模式过滤出某行。
例如要替换一个文件data中第二行的某个单词,可以这样:
$ sed '2,3s/dog/cat/'
3.删除行
删除命令d经常和指定地址一起使用,若忘记加上一个寻址模式,流中所有文本行都会被删除,比如要删除data文件中第二行:
$ sed '2d' data
需要说明的是,sed编辑器不会修改原文件,删除行只是从sed编辑器的输出中消失了,原始文件仍然包含“被删除的行“。
4.插入和附加文本
插入命令i会在指定行前增加一个新行,追加命令a会在制定行后增加一个新行。举两个例子:
# echo "line 2" | sed 'i\line 1'
line 1
line 2
#
# echo "line 2" | sed 'a\line 1'
line 2
line 1
5.修改行
修改命令c逊于修改数据流中正行文本的内容,跟插入和附加命令一样,必须在sed命令中单独指定新行:
$ sed '2c\This is a black cat' data
6.转换命令
转换命令y是唯一可以处理单个字符的sed编辑器命令。准换命令会进行s1和s2的一对一映射,s1中地一个字符会转换成s2中第一个字符,第二个字符会转换成s2中第二个字符,直到处理玩指定字符。如果s1和s2长度不同,则报错。举个简单例子:
# echo "The number is 12345" | sed 'y/123/789/'
The number is 78945
7.回顾打印
p命令用来打印文本行,=命令用来打印行号,l命令用来列出行。
# echo "This is a test" | sed 'p'
This is a test
This is a test
# echo "This is a test" | sed '='
1
This is a test
命令l可以打印出数据流中的文本和不可打印的ASCII字符,比如制表符的显示是\t。
8.向文件写入读取数据
w命令向文件中写入行:$ sed [指定行]w 文件名
r命令将文件中的数据插入到数据流中:$ sed [指定行]w 文件名
二.gawk程序
gawk程序让流编辑迈上一个新台阶,它提供了一种编程语言而不只是编辑器命令。在gawk中可以定义变量来保存数据;使用算术和字符串操作符来处理数据;使用结构化编程语言,比如if-then来为数据增加逻辑;提取数据文件中的数据元素并将它们按另一顺序或结构重新放置,从而生成格式化报告。
使用gawk命令的格式:$ gawk optioons script file
gawk程序脚本用一队花括号来定义,由于gawk命令行假定脚本是单个文本字符串,所以必须将脚本放到单引号中。
1.使用数据字段变量
$0代表整个文本行,$n代表问本行中的第n个数据字段。
$ cat data
line 1
line 2
line 3
line 4
$
$ gawk '{print $1}' data
line
line
line
line
$
2.使用多个命令
只要在每条命令间加个分号即可。
# echo "This is a dog" | gawk '{$4="cat"; print $0}'
This is a cat
3.在处理数据前运行脚本
BEGIN关键字强制gawk在读取数据前执行它后面制定的程序脚本。
# gawk 'BEGIN{print "Hello world!"}'
Hello world!
4.在处理数据后运行脚本
跟BEGIN关键字类似,END关键字强制gawk在读完数据后执行脚本。
# cat script
BEGIN{
print "The latest list of users and shells"
print "Userid Shell"
print "------ -----"
FS=":"
} {
print $1 " " $7
} END{
print "This concludes the listing"
}
# gawk -f script /etc/passwd
The latest list of users and shells
Userid Shell
------ -----
root /bin/bash
daemon /bin/sh
bin /bin/sh
sys /bin/sh
...
saned /bin/false
**** /bin/bash
This concludes the listing
三.学习资料
1.Common threads: Awk by example, Part 1
2.gawk 手册
[shell编程]初识sed和gawk的更多相关文章
- shell高级-----初识sed和gawk
sed编辑器 sed说明 sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增.删.改.查等操作,支持按行.按字段.按正则匹配文本内容,灵活方便,特别适合于大文件的编辑. 替换 ...
- 《Linux命令行与shell脚本编程大全》第十九章 初识sed和gawk
这两个工具能够极大简化需要进行的数据处理任务. 19.1 文本处理 能轻松实现自动格式化.插入.修改或删除文本元素的简单命令行编辑. sed和gawk就具备上述功能 19.1.1 sed编辑器 被称为 ...
- shell学习记录----初识sed和gawk
Linux命令行与shell脚本编程大全中关于sed和gawk的介绍合在一起,而且结构有点乱. 不像之前的命令写的很清楚.所以这次我需要写下来整理一下. 一.sed部分 1.1 sed命令格式如下: ...
- shell编程:sed的选项
sed [参数] [partern/commond] file 标准输出 | sed sed [参数] [partern/commond] -n :使用安静(silent)模式.在一般 sed 的用法 ...
- Shell编程—sed和gawk
1文本处理 1.1sed 编辑器 sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反.在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式地插入.删除或 ...
- shell编程学习笔记之sed编辑器
在shell编程中,大多数处理的都是文本文件.对文本文件进行处理除了使用交互式文本编辑器(vi[m],gedit......)也可以使用另外一类:流编辑器. 流编辑器:使用预定义的编辑规则来对文本进行 ...
- shell编程之sed编辑器&gawk程序
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/560372 s ...
- shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)
一,Shell编程四剑客之Find 通过如上基础语法的学习,读者对Shell编程有了更近一步的理解,Shell编程不再是简单命令的堆积,而是演变成了各种特殊的语句.各种语法.编程工具.各种命令的集合. ...
- Shell编程四剑客包括:find、sed、grep、awk
一.Shell编程四剑客之Find Find工具主要用于操作系统文件.目录的查找,其语法参数格式为: find path -option [ -print ] [ -exec -ok command ...
随机推荐
- linux IO子系统和文件系统读写流程
本文转载自:http://blog.csdn.net/kidd_3/article/details/6909097 Technorati 标签: I/O 子系统 --------------- ...
- 【风马一族_Android】Android学习
如果是色彩盲,请自行收藏这个网站:Material Design Color Palette Generator 所有书上的UI部分扫一遍就行了,我相信现在还没有书按material design标准 ...
- HTML5-draggable(拖放)
<!DOCTYPE html> <html class="no-js" ...
- Java基础(二)
下面来实现一个小程序,要求如下: 从键盘接收一个字符串,程序对其中所有的字符进行排序,例如键盘输入:helloitcast程序打印acehillostt 步骤分析: 1.键盘录入字符串,Scanner ...
- MongoDB的分组统计 group
mongodb中的分组聚合用$group,而且处理的最大数据量为100M如果超出需要写入到磁盘,使用格式如下: { $group: { _id: <expression>, <fie ...
- 自定义视图(继承View)
前言 Android提供了丰富的控件,但是有时候还是不能满足自己的需求,这时候就需要自定义视图了,自定义视图分为几种,一种为继承为View的,一种为继承于ViewGroup的.继承于View的需要我们 ...
- 最新区分兼容IE6/IE7/IE8/IE9/FF的CSS HACK写法和Css if hack条件语法操作说明
自从安装了IE8.0正式版本!木头 就对基本的几个 CSS HACK的做一下归纳!希望对网页前端布局DIV+CSS的实施者有所帮助! 本文就主要以:IE6+IE7+IE8+IE9+FF为主要研究对象 ...
- ApacheBench 使用教程
ab压力测试 ab是Apache超文本传输协议(HTTP)的性能测试工具.其设计意图是描绘当前所安装的Apache的执行性能. 主要是显示你安装的Apache每秒可以处理多少个请求. 格式: ./ab ...
- mapreduce 实现pagerank
输入格式: A 1 B,C,D B 1 C,Dmap: B A 1/3 C A 1/3 D A 1/3 A |B,C,D C B 1/2 D B 1/2 B |C,Dreduce: B (1-0.85 ...
- 详解C/C++预处理器
C/C++编译系统编译程序的过程为预处理.编译.链接.预处理器是在程序源文件被编译之前根据预处理指令对程序源文件进行处理的程序.预处理器指令以#号开头标识,末尾不包含分号.预处理命令不是C/C++语 ...