时间:2017-12-07注:本文部分内容摘自《Linux命令行与shell脚本编程大全》一书,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第十九章学习总结第十九章:认识sed和gawk本章内容学习sed编辑器gawk编辑器入门sed编辑器基础知识19.1文本处理19.1.1sed编辑器sed编辑器被称为流编辑器,它与普通的交互式文本编辑器完全相反。sed编辑器可以根据命令对数据流中的数据进行处理。sed编辑器执行以下操作:从输入中一次读取一行数据根据提供的编辑器命令匹配数据根据命令修改流中的数据并将新数据输出到STDOUT将所有命令匹配到一行streameditor中的dataofdata之后,它会读取下一行数据并重复上述过程,直到处理完所有行数据。sed命令格式sed选项脚本文件使用选项来修改sed命令的行为。sed命令选项如下-escript:处理输入时,将脚本中指定的命令添加到已有命令中-ffile:处理输入时,将file中指定的命令添加到已有命令中-n:不生成命令输出,使用print命令完成输出1.在命令行定义编辑器命令默认情况下,sed编辑器会将指定的命令应用到STDIN输入流上,可以直接将数据通过管道输入sed编辑器进行处理。简单示例echo"Thisisatest"|sed's/test/bigtest/'本例使用sed编辑器的s命令。s命令用斜杠之间指定的第二个文本字符串替换第一个文本字符串。在这个例子中,大测试取代了处理文件并写入data1.txt文件的测试Thequickbrownfoxjumpsoverthelazydog.Thequickbrownfoxjumpsoverthelazydog.Thequickbrownfoxjumpsoverthelazydog。敏捷的棕色狐狸跳过了懒狗。执行命令sed's/dog/cat/'data1.txtsededitor不修改文本文件的数据2.在命令行使用多个编辑器命令在sed命令上使用-e选项执行多个命令sed-e's/brown/green/;s/dog/cat/'data1.txt3。从文件中读取编辑器命令,写入script1.sed文件s/brown/green/s/fox/elephant/s/dog/cat/执行命令sed-fscript1.seddata1.txt敲:为了避免混淆sed编辑脚本文件与bashshell脚本文件,可以使用.sed作为sed脚本文件的扩展名。19.1.2gakw程序gawk程序是Unix中原始awk程序的GNU版本。使用gawk程序,您可以定义变量来存储数据。使用算术和字符串运算符来处理数据。使用结构化编程概念将处理逻辑添加到数据处理中。提取数据文件中的数据元素,重新排列或格式化,生成格式化报告1.gawk命令格式命令格式gawkoptionsprogramfilegawkavailableoptionsoptionoption:description-Ffs:指定划分数据字段的字段行分隔符-ffile:从指定文件中读取程序-vvar=value:在gawk程序中定义一个变量及其默认值-mfN:指定要处理的数据文件中的最大字段树-mrN:指定数据文件中的最大数据行树-W关键字:指定gawk的兼容模式或警告级别2.从命令行读取程序脚本一个简单的gawk程序脚本gawk'{print"HelloWorld!"}'运行command之后,它将等待来自STDIN的文本输入。无论在数据流中输入什么文本,都会输出相同的文本,可以用Ctrl+D终止程序3.使用数据字段变量gawk的主要特点之一是它能够处理文本中的数据文件,它会自动给一行中的每个数据元素分配一个变量。默认情况下,它为整个文本行分配$0$1为文本行中的第一个数据字段$2为文本行中的第二个数据字段$n为文本行中的第n个数据字段gawk正在读取时文本行,默认的字段分隔符(空白字符:空格或制表符)将用于划分每个数据字段。编写data2.txt文件一行测试文本。两行测试文本。三行测试文本。执行命令gawk'{print$1}'data2.txt只会显示第一个数据字段的值。可以使用-F选项指定字段分隔符来执行命令gawk-F:'{print$1}'/etc/passwd4。要在程序脚本中使用多个命令,只需要在命令之间进行分隔即可。示例echo"我的名字是zc"|gawk'{$4="test";print$0}'5.从文件中读取程序写入script2.gawk文件{print$1"的主目录是"$6}执行命令gawk-F:-fscript2.gawk/etc/passwd或写入script3.gawk文件{text="'shomedirectoryis"print$1text$6}执行命令gawk-F:-fscript3.gawk/etc/passwd6。处理数据前运行脚本使用BEHIN关键字强制gawk在读取数据前执行指定的程序脚本gawk'BEGIN{print"HelloWorld!"}'写入data3.txt文件Line1Line2Line3executethecommandgawk'BEGIN{print"Thedata3FileContents:"}{print$0}'data3.txt7。处理数据后运行脚本在读取数据后使用END关键字gawk在数据后执行程序脚本gawk。'BEGIN{print"data3文件内容:"}{print$0}END{print"文件结束"}'data3.txt写script4.gawk文件BEGIN{print"最新的用户列表和她lls"print"UserID\tShell"print"--------\t--------"FS=":"}{print$1"\t"$7}END{print"到此结束listing"}执行命令gawk-fscript4.gawk/etc/passwd19.2sededitorbasics19.2.1更多替换选项1.替换标记使用s命令默认只会替换每行的第一位,如果需要要替换所有出现的地方,需要使用替换标签可用替换标签number:表示新文本将替换第一个模式匹配的地方g:表示新文本将替换所有匹配的文本p:表示原始行的内容Toprintoutwfile:将替换结果写入文件Writedata4.txtfileThisisatestofthetestscriptThisissecondtestofthetestscript.执行命令sed's/test/trial/2'data4.txtsed's/test/trial/g'data4.txtwritedata5.txtfileThisisatestline.Thisisadifferentline.执行命令sed-n's/test/trial/p'data5.txtsed's/test/trial/wtest.txt'data5.txtcattest.txt2。替换字符执行命令sed's!/bin/bash!/bin/csh!'/etc/passwd19.2.2UsetheaddresssededitordefaultstoUsethecommandtoactonalllinesoftextdata,使用行寻址,可以指定作用于特定行或部分行。行寻址的两种形式以数字形式表示行间隔。使用文本模式过滤行。行寻址的两种形式命令格式相同[address]command也可以将特定地址地址的多个命令分组{command1command2command3}1.数字方式的行寻址执行命令sed'2s/dog/cat/'data1。txtsed'2,3s/dog/cat/'data1.txtsed'2,$s/dog/cat/'data1.txt2.使用文本模式过滤格式/pattern/commandexecutecommandsed'/zc/s/bash/csh/'/etc/passwdpattern可以是固定的文本或正则表达式3.命令组合executecommandsed'2{s/fox/elephant/;s/dog/cat/}'data1.txtsed'3,${s/brown/green/;s/lazy/active/}'data1.txt19.2.3删除行执行命令sed'd'data1.txtsed'3d'data1.txtsed'2,3d'data1.txtsed'3,$d'data1.txt19.2.4INSERTANDADDITIONALFUNCTIONALINSERTORADDITIONALDATA插入(insert)命令(i)会在指定行前添加一个新行追加(append)命令(a)A新行将添加到指定行之后执行命令echo"Testline2"|sed'i\Testline1'echo"Testline2"|sed'a\Testline1'19.2.5Modifythelineusingchange命令修改数据流中整行文本的内容写入data6.txt文件这是第1行这是第2行这是第3行。这是第4行。执行命令sed'3c\Thisisachangedline.'data6.txtsed'2,3c\Thisisachangedline.'data6.txt19.2.6返回command命令格式[address]y/inchars/outchars执行命令sed'y/123/789/'data6.txt19.2.7回顾打印1.打印行使用命令p打印文本行执行命令回显“这是一个测试”|sed'p'sed-n'/number3/p'data6.txt2.打印行号使用等号=打印行号执行命令sed'='data1.txt3。列出行使用小写L列出行执行命令sed-n'l'data1.txt19.2.8使用sed处理文件1.写入文件命令格式[address]wfilenameexecutecommandsed'1,2w测试.txt'data6.txt2、从文件中读取数据使用命令r从文件中读取数据[地址]r文件名执行命令sed'3rdata1.txt'data6.txt19.3总结本章主要讲解使用sed编辑器进行处理data,和sed编辑器处理数据的一些编辑命令
