shell 编程的老臣 - sed.docx

上传人:A*** 文档编号:141375491 上传时间:2020-08-07 格式:DOCX 页数:28 大小:23.82KB
返回 下载 相关 举报
shell 编程的老臣 - sed.docx_第1页
第1页 / 共28页
shell 编程的老臣 - sed.docx_第2页
第2页 / 共28页
shell 编程的老臣 - sed.docx_第3页
第3页 / 共28页
shell 编程的老臣 - sed.docx_第4页
第4页 / 共28页
shell 编程的老臣 - sed.docx_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《shell 编程的老臣 - sed.docx》由会员分享,可在线阅读,更多相关《shell 编程的老臣 - sed.docx(28页珍藏版)》请在金锄头文库上搜索。

1、shell 编程的老臣 - sedvi/vim 的世界里多了两个兄弟:sed 和 gawk.sed: stream editor. 在编辑器处理数据之前,根据事先提供的规则来编辑数据流。sed 有点类似于 Kafka, 对数据进行一行一行的编辑,行云流水,没有半点拖沓。当然 kafka 更加强大,实时捕获数据,还能指定更复杂的处理逻辑,并且能够发送到任何地方保存起来。sed 能接受的源头是文本文件,最终的结果还只能是普通的文本文件,实现的是文本到文本的转换。sed 的命令格式:sedoptionsscriptfile详细的文档见这里:https:/www.gnu.org/software/se

2、d/manual/sed.html常用的 3 个可选参数列在这里:sed-es/cat/dog/logfile.txtsed-fWordchange.sedlogfile.txtsed-es/cat/dog-ilogfile.txt-e : 指定命令表达式,s/cat/dog 用 dog 取代文本中的 cat ;-f : 如果有多行表达式,且频繁修改,用文件存储这些命令表达式则显得尤为高效,而 -f 代表的就是命令文件;-i: in-place 就地修改并保存。如果不指定 sed 将修改后的结果输出到标准输出也就是屏幕上主要是围绕着 script 做文章,指定的命令可以完成目标文本的转换, 而

3、 options 则更多是一些可选的动作,比如直接修改文本而不是保存,指定多命令的文件等等。革命要胜利,路线不能歪。所以首先要攻克的便是 script 命令。这里有份指南,从简到深,细细铺开来讲。sedscriptoverview:sedscriptoverviewsedcommandslist:sedcommandssummaryThesCommand:sedsSwissArmyKnifeCommonCommands:OftenusedcommandsOtherCommands:LessfrequentlyusedcommandsProgrammingCommands:Commandsfor

4、sedgurusExtendedCommands:CommandsspecificofGNUsedMultiplecommandssyntax:Extensionforeasierscriptingsed 命令脚本综述lineaddressXoptions多命令也好,单行命令也好,多行命令也好,命令文件也罢,命令的格式逃不过上面这公式。line address 是文本的行数范围,比如指定文本的 30 到 50 行,30,50;X 是单字命令,够简单,但是不好记。随时备份一张 X 的列表在你的桌面上,或许能帮你随用随查;options 就是单字命令的可选参数sed-e/foo/d-es/hell

5、o/world/input.txtoutput.txtechos/hello/world/script2.sedsed-e/foo/d-fscript2.sedinput.txtoutput.txt/foo 比指定行数(每一行在文本文件中总有一个行号)要来的灵活,foo代表的就是开头以foo的那些行;/d 标识命令是 delete, 即删除行的操作;-e, -f, 都可以多次引用,其作用就是为了指定多个命令sed 常用命令可选的命令太多了,所以还是挑几个常用的命令来讲讲Swiss Army Knife 瑞士军刀 - srootcentos00_data#echothisisacatdog|se

6、d-es/cat/fat/thisisafatdogrootcentos00_data#s 这单字命令,一定要严格按照格式:s/originalword/replacedword/来编写,否则出现会这种错误:sed:-eexpression#1,char9:unterminatedscommand其他常用命令介绍#;d;q;p;nq - quit 在当前行退出(当前处理的文件),不再处理更多往下的行rootcentos00_data#seq512345rootcentos00_data#seq5|sed3q123rootcentos00_data#seq 是 sequence 命令,产生一组序

7、列值;3q 是 sed 单字命令应用,3 代表第三行,而 q 就是退出d - delete 是删除满足条件的行,可以指定行号也可以使用条件表达式rootcentos00_data#seq5|sed3d1245rootcentos00_data#p - print 打印当前行,必须与 sed -n 可选参数同时使用,才奏效rootcentos00_data#seq5|sed3p123345rootcentos00_data#seq5|sed3p-n3rootcentos00_data#-n 作为 sed 的可选参数,没有在文档中找到其原意,我暂 YY 它是 no print 的意思。n - Ne

8、xt line , 隔行处理。指定多少个 n, 就隔多少行处理一次编辑rootcentos00_data#seq5|sedn;s/./newline/1newline3newline5rootcentos00_data#rootcentos00_data#seq5|sedn;n;s/./newline/12newline45rootcentos00_data#;d;q;p;n - 命令组合符号;刚才那一案例已经说明白了 n;n;s/./new line/ , 使用“;”即可将多个命令同时作用于一行上,而如果要作用于满足条件的行,则必须加上“”:rootcentos00_data#seq5|se

9、d-n2s/./newline/;pnewlinerootcentos00_data#看完这些例子,不禁令我想到一个问题,在单字命令表达式lineaddressXoptions中,line address 可以是数字型的行号,也可以是满足条件的行号。而什么样的条件可以被放在line address表达式中呢?好比,我需要打印偶数行,表达式该怎么写?固然,用 n 命令可以解决这个问题,但我们考察的是line address的用法#使用单字命令:rootcentos00_data#seq8|sed-nn;p2468rootcentos00_data#使用可以实现打印隔行的功能:rootcentos

10、00_data#seq8|sed-n02p2468而line address还可以使用正则表达式:rootcentos00_data#seq20|sed-n/2/p21220rootcentos00_data#/regular express/ 是正确引用正则表达式的方法,这里仅仅是打印包含2字符的那些行。在 IT 领域,仅看理论而不动手,“学而不练”则惘。就像笔者一样,在玩 Oracle 那段时间天天用着,还蛮熟练的,中途转 SQL Server 做了几年,回头再用 sed 却手生得紧。拳不离手,曲不离口,文不离码,一点没错。有 20 道题,是从文档上看到的,做下笔记,方便日后查阅 1 Jo

11、ining lines 2 Centering Lines 3 Increment a Number 4 Rename Files to Lower Case 5 Print bash Environment 6 Reverse Characters of Lines 7 Text search across multiple lines 8 Line length adjustment 9 Reverse Lines of Files 10 Numbering Lines 11 Numbering Non-blank Lines 12 Counting Characters 13 Count

12、ing Words 14 Counting Lines 15 Printing the First Lines 16 Printing the Last Lines 17 Make Duplicate Lines Unique 18 Print Duplicated Lines of Input 19 Remove All Duplicated Lines 20 Squeezing Blank Linessed 详解我觉得 sed 玩到最后,应该触及的最高难度的问题,有这些:1. 替换百万行文本,sed 的处理速度如何2. sed 作为 ETL 工具,与 MySQL, Oracle 等连接起来

13、,做交互式操作3. sed 会有异常吗,那么如何处理:比如处理百万数据失效了而这一切才刚刚开始!Substitute - s 命令详解seds/pattern/replacement/inputfile经典的用法就是这样。但实际运作起来,并非像我们想象的那样:rootcentos00_data#cathw.txtthisistheprofessiontoolontheprofessionalplatformthisisthemanontheearthrootcentos00_data#seds/the/a/hw.txtthisisaprofessiontoolontheprofessionalplatformthisisamanontheearthrootcentos00_data#虽然我们制定了 pattern, 但 replacement 只替换了每行第一次出现的指定文本。所以有了这些 s 命令的衍生:s/pattern/replacement/flag数字:指定第几处符合指定模式的文本被替换;g:替换所有符合的模式文本;p:原先的内容文本先打印出来;wfilename:将替换的结果写入到文件里面去替换掉所有的符合模式条件的文本:rootcentos00_data#seds/the/a/ghw.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号