《Linux命令行与shell脚本编程大全》 第十八章 学习笔记
第十八章:初识sed和gawk
文本处理
sed编辑器
sed编辑器可以基于输入到命令行的或是存储在命令文本文件中的命令来处理数据流中的数据。
它每次读取一行,用提供的编辑器命令匹配数据、按命令中指定的方式修改流中的数据,然后将生成的数据输出到STDOUT。在流编辑器将所有命令与一行数据进行匹配后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。
sed命令格式:
sed options script file
sed命令选项
选项描述-e script在处理输入时,将script中指定的命令添加到运行的命令中-f file 在处理输入时,将file中指定的命令添加到运行的命令中-n不要为每个命令生成输出,等待print命令来输出在命令行定义编辑器命令
默认情况下,sed会编辑器会将指定的命令应用到STDIN输入流上。
在命令行使用多个编辑器命令使用-e即可。
注意:多个命令都写在同一对引号之间,并用分号隔开。并且在命令末尾和分号之间不能有空格。
从文件中读取编辑器命令使用-f选项即可。文件中的sed命令可以使用换行或分号隔开gawk程序
在gawk编程语言中,可以做下面的事:
1.定义变量来保存数据
2.使用算数和字符串操作符来处理数据
3.使用结构化编程概念,比如if-then语句和循环
4.提取数据文件中的数据元素并将他们按另一顺序或格式重新放置。
gawk命令格式:
gawk option program file
gawk选项
选项描述-F fs指定行中分隔数据字段的字段分隔符-f file指定读取程序的文件名-v var=value定义gawk程序中的一个变量以及默认值-mf N指定要处理的数据文件中的最大字段数-mr N指定数据文件中的最大数据行数-W keyword指定gawk的兼容模式或警告等级从命令行读取程序脚本
gawk程序用一对花括号来定义。
由于gawk命令行假定脚本是单个文本字符串,所以必须将脚本放到单引号中。
键入回车之后,并不会马上执行,等待你输入文本。gawk会对这行文本运行一遍所有的程序脚本和sed一样,gawk程序会针对数据流中的每行文本执行一遍程序脚本。
使用数据字段变量
gawk会将如下变量分配给它在文本行中发现的每个数据字段:
$0表示整个文本行;$1表示文本行中第一个数据字段,依此类推
gawk中默认的字段分隔符是任意空白字符
使用-F选项指定分隔符在程序脚本中使用多个命令同sed,多个命令使用分号隔开即可。
这里先将$3赋值,然后打印这句话。打印得结果是已经替换了$3之后的结果了。从文件中读取程序
同样可以使用多个命令,可以用换行或分号分割命令gawk在引用变量得时候,并不像shell那样,需要使用美元符在处理数据前运行脚本
BEGIN关键字会在处理数据前,执行指定的脚本
在处理数据后运行脚本当然是使用END关键字了
注意:使用FS设置分割符sed编辑器基础
更多的替换选项
替换标记
默认情况下,对匹配到的内容只会替换一次
如果想改变这种方式,需要使用替换标记s/pattern/replacement/flags
有4种替换标记:
数字,表明将替换第几处模式匹配的地方
g,替换所有匹配到的文本p,表明原来行的地方要打印出来。通常与-n选项一起使用上面已经说过,-n选项表示不输出,等待print命令来输出。
w file,将替换的结果写到文件中替换字符如果我们想要替换文本中出现的文件路径,那么就需要转义符
或者,我们也可以把命令中的字符串分割符“/”给替换掉使用地址默认情况下,sed会对所有行使用命令,如果只想将命令作用于特定某些行,需要使用行寻址(line addressing)
sed中有两种形式的行寻址:
1.行的数字范围
2.用文本模式来过滤出某行
两种形式都使用相同的格式来指定地址:
[address] command
也可以为特定地址将多个命令放在一起:
address {
command1
command2
command3
}
数字方式的行寻址
从第三行开始,到最后一行(最后一行用美元符号表示)进行替换使用文本模式过滤器
格式如下:
/pattern/command
该命令只会作用到匹配文本模式的行上。sed在文本模式中采用正则表达式。
组合命令需要对单行执行多条命令的话,可以使用花括号将多条命令组合在一起
删除行(delete)删除行的命令为d,如果不指定行号,那么就全部删除。
sed编辑器的模式匹配也适用于删除命令:注意:sed不会修改原始文件。可以用两个文本模式来删除某个范围内得行。
指定的第一个文本模式会打开行删除功能,第二个会关闭行删除功能。如果没有匹配到第二个,那么后面的文本将全部删除。
如果匹配到了第二个,那么sed还会继续尝试匹配第一个,继续尝试再次打开删除功能!
插入和附加文本插入(insert)命令i会在指定行前加一个新行
追加(append)命令a会在指定行后加一个新行
格式如下:
sed '[address]command\
new line'
在数据流的最后添加新行修改行(change)和之前的使用完全一样
使用地址区间的时候需要注意,sed会把区间中的所有内容作为一个整体用新行替换
转换命令转换(transform,y)命令是唯一可用处理单个字符的sed编辑器命令
格式如下:
[addressly/inchars/outchars/
转换命令会对inchars和outchars按顺序做一个一一映射。
如果inchars和outchars长度不同,sed则会产生错误信息
转换命令是全局的,他们将所有指定的字符都替换成目标字符。回顾打印
用来打印数据流中的信息的命令:
1.p,用来打印文本行
2.等号(=)命令,用来打印行号
3.l(小写L)命令,用来列出行
打印行
和替换命令中的p标记类似,p命令可以打印sed编辑器输出中的一行
也可以使用文本模式可以与替换命令一起使用,下面是修改一行,并且打印出修改前的这一行含有3的有两行,其中后面一行满足条件,然后被替换。打印行号
行号由换行符决定。列出行此命令允许打印数据流中的文本和不可打印的ASCII字符。
任何不可打印字符都用他们的八进制值前加一个反斜线或标准C风格的命名法。
比如制表符用\t表示,行结束用$表示。用sed和文件一起工作
向文件写入
格式如下:
[address]w filename
从文件读取数据格式如下:
[address]r filename
读取命令允许将一个独立文件中的数据插入到数据流中。
转贴请保留以下链接
本人blog地址
http://su1216.iteye.com/
http://blog.csdn.net/su1216/