快速业务通道

shell编程之sed编辑器&gawk程序

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-05

1.2、gawk程序
尽管sed编辑器是动态修改文本文件的便利工具,但它也有自己的局限性,这个时候就可以借助更高级、能够提供类似于编程环境的工具,它允许修改和组织文件中的数据.
gawk程序是unix中原awk程序的GNU版本,它提供一种编程语言而不仅仅是编辑器命令.
1.2.1、gawk命令格式
gawk options xxx(program file)
如下是gawk程序的可用选项:
***********************************************************
选项 描述
-F fs 指定描绘一行中数据字段的文件分隔符
-f file 指定读取程序的文件名
-v var=value 定义gawk程序中使用的变量和默认值
-mf N 指定数据文件中要处理的字段的最大数目
-mr N 指定数据文件中的最大记录大小
-W keyword 指定gawk的兼容模式或警告级别 拥有帝国一切,皆有可能。欢迎访问phome.net
***********************************************************
1.2.2、自命令行读取程序脚本
gawk程序脚本由左大括号和右大括号定义,脚本命令放置在两个大括号之间,如下载命令行上指定的一个简单gawk程序脚本:
[root@wzp ~]# gawk ''{print "hello world!"}''
改程序定义了一个print命令才执行打印功能,将文本hello world!输出到STDOUT.然而,执行本命令不会发生任何显示信息.命令行中没有定义文件名,gawk程序要从STDIN获取数据,比如你随意输入任何内容,按回车键既可以实现print功能:
[root@wzp ~]# gawk ''{print "hello world!"}''
try to test and enter
hello world!
test again
hello world!
同sed编辑器完全一样,gawk程序对数据流中可用的每一行文本执行程序脚本.本程序脚本设定为显示固定的文本字符串,无论数据流中输入什么,都得到相同的输出.如果要结束gawk程序,发送信号说明数据流已经结束.bash shell提供了生成end-of-file(EOF)字符的组合键来发送结束信号.在bash中,Ctrl D组合键生成EOF字符.
1.2.3、使用数据字段变量
gawk的主要功能之一就是处理文本文件中数据的能力,它通过自动将变量分配给每行中的每个数据元素实现这一功能.默认情况下,gawk将下面的变量分配给在文本行中检测到的每个数据字段:
* $0表示整行文本;
* $1表示文本行中的第一个数据字段;
* $2表示文本行中的第二个数据字段;
* $n表示文本行中的第n个数据字段;
各个数据段是根据文本行中的字段分隔符(默认是空格)确定的,如下通过gawk程序读取文本文件的数据段: 拥有帝国一切,皆有可能。欢迎访问phome.net
[root@wzp ~]# cat test1
one line of test file
two line of test file
three line of test file //(故意在three后面留两个空格)
[root@wzp ~]# gawk ''{print $1}'' test1
one
two
three
通过$1字段变量即可显示每行文本的第一个字段;
[root@wzp ~]# gawk ''{print $2}'' test1
line
line
line
你会发现,上面两个空格都被视为一个分隔符了,即把第二个字段显示出来.
当我们要修改默认的分隔符的时候可以使用-F选项,比如把分隔符改成冒号来读取/etc/passwd文件:
[root@wzp ~]# tail -3 /etc/passwd
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
mysql:x:27:27:MySQL Server:/home/mysql:/sbin/nologin
我们取三行来看,我们知道/etc/passwd就是以冒号来分隔每个字段的,我们要通过gawk查看指定某些字段时候就通过-F选项修改默认分隔符为冒号:
[root@wzp ~]# tail -3 /etc/passwd | gawk -F: ''{print $1,$6,$7}''
webalizer /var/www/usage /sbin/nologin
sabayon /home/sabayon /sbin/nologin
mysql /home/mysql /sbin/nologin
这样我们就把第一、第六、第七个字段显示出来了.
1.2.4、在程序脚本中使用多个命令
有时候我们需要在命令行指定的脚本中使用多个命令,只需要在各命令之间加一个分号:
[root@wzp ~]# echo "welcome to 51cto" | gawk ''{$3="bbs.51cto"; print $0}''
welcome to bbs.51cto
第一个命令为$3字段指定为bbs.51cto,第二个命令为打印整个数据字段. 拥有帝国一切,皆有可能。欢迎访问phome.net
2.8.2、从文件读取数据
通过r命令可以实现sed编辑器在指定的匹配模式位置插入文件中的文本
[root@wzp ~]# cat insertfile
this is an added line
this is another added line
如上文件是准备被读取的文本文件
[root@wzp ~]# sed ''2r insertfile'' test5
this is number 1
this is number 2
this is an added line
this is another added line
this is number 3
this is number 4
指定从test5文件的第二行后面插入从文件insertfile中读取到的文本
当然,我们也可以使用文本匹配模式:
[root@wzp ~]# sed ''/ber 3/r insertfile'' test5
this is number 1
this is number 2
this is number 3
this is an added line
this is another added line
this is number 4
表示说从匹配ber 3文本的那一行后面插入从文件insertfile中读取到的文本
如果要添加在文本的末尾,想当然是使用美元符号了:
[root@wzp ~]# sed ''$r insertfile'' test5
this is number 1
this is number 2
this is number 3
this is number 4
this is an added line
this is another added line

如上所讲述的sed编辑器和gawk程序只是一个开始,下面还有通过讲述正则表达式,更加有针对性的来掌握sed编辑器和gawk程序的使用!!!

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号