文本过滤

  • Post author:
  • Post category:其他




文本过滤




1


、正则表达式介绍




当从一个文件或命令输出中抽取或过滤文本时,可以使用正则表达式,正则表达式是一些特殊或不很特殊的字符串模式的集合。



系统自带的所有大的文本过滤工具在某种模式下都支持正则表达式的使用,并且还包括



一些扩展的元字符集。



基本元字符集及其含义:




^


只只匹配行首





$


只只匹配行尾





*


只一个单字符后紧跟


*


,匹配


0


个或多个此单字符





[ ]


只匹配


[ ]


内字符。可以是一个单字符,也可以是字符序列。可以使用





表示


[ ]


内字符序列范围,如用


[1-5]


代替


[12345]





[^]


意指否定或不匹配括号里的内容





/


只用来屏蔽一个元字符的特殊含义。因为有时在


shell


中一些元字符有特殊含义。


/


可以使其失去应有意义





.


只匹配任意单字符





pattern/{n/}


只用来匹配前面


pattern


出现次数。


n


为次数





pattern/{n





/}m


只含义同上,但次数最少为


n





pattern/{n





m/}


只含义同上,但


pattern


出现次数在


n





m


之间





2





grep





grep


允许对文本文件进行模式查找。如果找到匹配模式,


grep


打印包含模式的所有行。





grep


一般格式为:





grep [


选项


]


基本正则表达式


[


文件


]




这里基本正则表达式可为字符串。




2.1


、双引号引用








grep


命令中输入字符串参数时,最好将其用双引号括起来。例如:“


mystring


”。这样做有两个原因,一是以防被误解为


shell


命令,二是可以用来查找多个单词组成的字符串,例如:“


jet plane


”,如果不用双引号将其括起来,那么单词


plane


将被误认为是一个文件,查询结果将返回“文件不存在”的错误信息。





在调用变量时,也应该使用双引号,诸如:


grep





$MYVAR


”文件名,如果不这样,将没有返回结果。




在调用模式匹配时,应使用单引号。




2.2





grep


选项





常用的


grep


选项有:





-c


只输出匹配行的计数。





-i


不区分大小写(只适用于单字符)。





-h


查询多文件时不显示文件名。





-l


查询多文件时只输出包含匹配字符的文件名。





-n


显示匹配行及行号。





-s


不显示不存在或无匹配文本的错误信息。





-v


显示不包含匹配文本的所有行。





2.3





grep


和正则表达式




使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选择。使用




正则表达式时最好用单引号括起来,这样可以防止


grep


中使用的专有模式与一些


shell


命令的特殊方式相混淆。





2.4


、类名





grep


允许使用国际字符模式匹配或匹配模式的类名形式。




类名及其等价的正则表达式:



[[:upper:]] [A-Z]



[[:lower:]] [a-z]



[[:digit:]] [0-9]



[[:alnum:]] [0

-9a
-zA-Z]




[[:space:]]


空格或


tab







[[:alpha:]] [a-zA-Z]




3





AWK





3.1


、调用


awk





有三种方式调用


awk


,第一种是命令行方式,如:




awk [-F field-separator] ‘commands’ input-files




这里,


commands


是真正的


awk


命令。


[-F


域分隔符


]


是可选的,因为


awk


使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,但如果要浏览诸如


passwd


文件,此文件各域以冒号作为分隔符,则必须指明


-F


选项。





第二种方法是将所有


awk


命令插入一个文件,并使


awk


程序可执行,然后用


awk


命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。





第三种方式是将所有的


awk


命令插入一个单独文件,然后调用:




awk –f awk-script-file input-files




-f


选项指明在文件


awk_script_file


中的


awk


脚本,


input_file(s)


是使用


awk


进行浏览的文件名。





3.2





awk


脚本





在命令中调用


awk


时,


awk


脚本由各种操作和模式组成。





如果设置了


-F


选项,则


awk


每次读一条记录或一行,并使用指定的分隔符分隔指定域,但如果未设置


-F


选项,


a w k


假定空格为域分隔符,并保持这个设置直到发现一新行。当新行出现时,


awk


命令获悉已读完整条记录,然后在下一个记录启动读命令,这个读进程将持续到文件尾或文件不再存在。


awk


每次在文件中读一行,找到域分隔符(这里是符号


#


),设置其为域


n


,直至一新行(这里是缺省记录分隔符),然后,划分这一行作为一条记录,接着


a w k


再次启动下一行读进程。





3.2.1


、模式和动作





任何


awk


语句都由模式和动作组成。在一个


awk


脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。动作即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。





模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段


BEGIN








END


。使用


BEGIN


语句设置计数和打印头。


BEGIN


语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。


END


语句用来在


awk


完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式,


awk


总是匹配或打印行数。





实际动作在大括号


{ }


内指明。动作大多数用来打印,但是还有些更长的代码诸如


if


和循环语句及循环退出结构。如果不指明采取动作,


awk


将打印出所有浏览出来的记录。




下面将深入讲解这些模式和动作。




3.2.2


、域和记录





awk


执行时,其浏览域标记为


$1





$2…$n


。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。


$0


表示所有域。(不要与


shell


里的


$


相混淆)


Awk


浏览时,到达一新行,即假定到达包含域的记录末尾,然后执行新记录下一行的读动作,并重新设置域分隔。





为打印一个域或所有域,使用


print


命令。这是一个


awk


动作(动作语法用圆括号括起来)。





保存


awk


输出:有两种方式保存


shell


提示符下


awk


脚本的输出。最简单的方式是使用输出重定向符号


>


文件名,显示屏上不会显示输出结果。第二种方法是使用


tee


命令,在输出到文件的同时输出到屏幕。





使用标准输入:实际上任何脚本都是从标准输入中接受输入的。(


1





script_file input_file





2





script_file<input_file





3





input_file|script_file





打印报告头:打印信息头放置在


BEGIN


模式部分,因为打印信息头被界定为一个动作,必须用大括号括起来。在


awk


查看第一条记录前,信息头被打印。





打印信息尾:如果在末行加入


end of report


信息,可使用


END


语句。


END


语句在所有文本处理动作执行完之后才被执行。





awk


错误信息:





确保整个


awk


命令用单引号括起来。




确保命令内所有引号成对出现。



确保用花括号括起动作语句,用圆括号括起条件语句。




可能忘记使用花括号,也许你认为没有必要,但


awk


不这样认为,将按之解释语法。





3.2.3





awk


中正则表达式及其操作





这里正则表达式用斜线括起来。如:


/Green/


可以查出单词


Green


的出现情况。





3.2.4


、条件操作符







<





<=





==





!=





>=





~





!~





3.2.5





if


语句





if(


条件


)


动作;





awk


语句用;分隔





复合语句用


{}


组合





3.2.6


、复合模式





&&





||


,!





3.2.7





awk


内置变量







ARGC


命令行中传入


awk


脚本的参数个数





ARGV


命令行参数排列





ENVIRON


支持系统环境变量的使用





FILENAME awk


脚本实际操作的输入文件





FNR


浏览文件的记录数





FS


设置输入域分隔符,等价于命令行


-F


选项





NF


浏览记录的域个数,在记录被读之后再设置





NR


已读的记录数





OFS


输出域分隔符,缺省为空格





ORS


输出记录分隔符,缺省为新行





RS


记录分隔符,缺省为新行





3.2.8





awk


操作符








awk


中使用操作符,基本表达式可以划分为数字型、字符串型、变量型、域及数组元素,在表达式中可以使用下述任何一种操作符。





赋值操作符:


=


+=


*=


/ =


%=


^ =





条件表达操作符:


?





并、与、非:


||


&&


!





匹配操作符:


~


!~





关系操作符:


<


<=


==


!=


>>





算术操作符:


+





*


/


%


^





前缀和后缀:


++








设置输入域到域变量名:在


awk


中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。一般的变量名设置方式为


name=$n


,这里


name


为调用的域变量名,


n


为实际域号。





域值比较操作:有两种方式测试一数值域是否小于另一数值域。(


1


)在


BEGIN


中给变量名赋值。(


2


)在关系操作中使用实际数值。通常在


BEGIN


部分赋值是很有益的,可以在


awk


表达式进行改动时减少很多麻烦。





修改数值域取值:当在


awk


中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的


awk


复本。为修改数值域,简单的给域标识重赋新值,如:


$1=$1+5


,会将域


1


数值加


5


,但要确保赋值域其子集为数值型。




修改文本域:修改文本域即对其重新赋值。需要做的就是赋给一个新的字符串。




创建新的输出域:在


awk


中处理数据时,基于各域进行计算时创建新域是一种好习惯。创建新域要通过其他域赋予新域标识符。如创建一个基于其他域的加法新域


{ $4=$2+$3 }


,这里假定记录包含


3


个域,则域


4


为新建域,保存域


2


和域


3


相加结果。





增加列值:为增加列数或进行运行结果统计,使用符号


+=


。增加的结果赋给符号左边变量值,增加到变量的域在符号右边。例如将


$1


加入变量


total


,表达式为


total+=$1








3.2.9


、内置的字符串函数





gsub(r,s)


在整个


$0


中用


s


替代


r





gsub(r,s,t)


在整个


t


中用


s


替代


r





index(s,t)


返回


s


中字符串


t


的第一位置





length(s)


返回


s


长度





match(s,r)


测试


s


是否包含匹配


r


的字符串





split(s,a,fs)





fs


上将


s


分成序列


a





sprint(fmt,exp)


返回经


f m t


格式化后的


e x p





sub(r,s)





$0


中最左边最长的子串代替


s





substr(s,p)


返回字符串


s


中从


p


开始的后缀部分





substr(s,p,n)


返回字符串


s


中从


p


开始长度为


n


的后缀部分





3.2.10


、字符串屏蔽序列





使用字符串或正则表达式时,有时需要在输出中加入一新行或查询一元字符。打印一新行时,(新行为字符


/n


),给出其屏蔽序列,以不失其特殊含义,用法为在字符串前加入反斜线。





awk


中使用的屏蔽序列:





/b




退格键





/t


tab








/f




走纸换页





/ddd




八进制值





/n




新行





/c




任意其他特殊字符,例如


/ /


为反斜线符号





/r




回车键





9.2.11





awk


输出函数


printf





awk


提供函数


printf


,拥有几种不同的格式化输出功能。例如按列输出、左对齐或右对齐方式。





每一种


printf


函数(格式控制字符)都以一个


%


符号开始,以一个决定转换的字符结束。转换包含三种修饰符。





printf


函数基本语法是


printf





[


格式控制符


]


,参数),格式控制字符通常在引号里。





awk printf


修饰符:








左对齐





Width


域的步长,用


0


表示


0


步长





.prec


最大字符串长度,或小数点右边的位数





awk printf


格式:





%c ASCII


字符





%d


整数





%e


浮点数,科学记数法





%f


浮点数,例如(


123.44








%g awk


决定使用哪种浮点数转换


e


或者


f





%o


八进制数





%s


字符串





%x


十六进制数





9.2.12


、向一行


a w k


命令传值





在查看


awk


脚本前,先来查看怎样在


awk


命令行中传递变量。在


awk


执行前将值传入


awk


变量,需要将变量放在命令行中,格式如下:





awk


命令


变量


=


输入


文件值





awk


也允许传入环境变量。





9.2.13





awk


脚本文件





可以将


awk


脚本写入一个文件再执行它。命令不必很长(尽管这是写入一个脚本文件的主要原因),甚至可以接受一行命令。这样可以保存


awk


命令,以使不必每次使用时都需要重新输入。使用文件的另一个好处是可以增加注释,以便于理解脚本的真正用途和功能。





给所有


awk


程序加入


awk


扩展名是一种好习惯,这样通过查看文件名就知道这是一个


awk


程序。脚本文件第一行是


!/bin/awk -f


。这很重要,没有它自包含脚本将不能执行。这一行告之脚本系统中


awk


的位置。执行时,在脚本文件后键入输入文件名,但是首先要对脚本文件加入可执行权限。





9.2.14


、在


awk


中使用


F S


变量





如果使用非空格符做域分隔符浏览文件,例如


#


或:,编写这样的一行命令很容易,因为使用


FS


选项可以在命令行中指定域分隔符。使用


awk


脚本时,记住设置


FS


变量是在


BEGIN


部分。如果不这样做,


a w k


将会发生混淆,不知道域分隔符是什么。





9.2.15


、向


awk


脚本传值








awk


脚本传值与向


awk


一行命令传值方式大体相同,格式为:




awk_script_file var=value input_file




9.2.16





awk


数组





前面讲述


split


函数时,提到怎样使用它将元素划分进一个数组。这里还有一个例子:




awk ‘BEGIN {print split (“123#456#

789”
,myarray,”#”)}’



3




在上面的例子中,


split


返回数组


myarray


下标数。实际上


myarray


数组为:





Myarray[1]=”

123”





Myarray[2]=”

456”





Myarray[1]=”

789”




数组使用前,不必定义,也不必指定数组元素个数。经常使用循环来访问数组。下面是



一种循环类型的基本结构:



For (element in array ) print array[element]




4





sed


用法介绍







sed


是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本


sed


可以随意编辑小或大的文件,有许多


sed


命令用来编辑、删除,并允许做这项工作时不在现场。


sed


一次性处理所有改变,因而变得很有效,对用户来讲,最重要的是节省了时间。





使用


sed


需要记住的一个重要事实是,无论命令是什么,


sed


并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。





因为


sed


是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行。





本章介绍


s e d


用法和功能。本章大多编写的是一行命令和小脚本。这样做可以慢慢加深对





4.1





sed


怎样读取数据





sed


从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑输入文件。重复此过程直到命令结束。





4.2


、调用


sed





调用


sed


有三种方式:在命令行键入命令;将


sed


命令插入脚本文件,然后调用


sed


;将


sed


命令插入脚本文件,并使


sed


脚本可执行。





使用


sed


命令行格式为:





sed


[


选项


]


sed


命令






输入文件。





记住在命令行使用


sed


命令时,实际命令要加单引号。


sed


也允许加双引号。





使用


sed


脚本文件,格式为:





sed


[


选项


]


-f


sed


脚本文件






输入文件





要使用第一行具有


sed


命令解释器的


sed


脚本文件,其格式为:





sed


脚本文件




[


选项


]




输入文件





不管是使用


shell


命令行方式或脚本文件方式,如果没有指定输入文件,


sed


从标准输入中接受输入,一般是键盘或重定向结果。





sed


选项如下:





n


不打印;


sed


不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。


p


命令可以用来打印编辑行。





c


下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条


sed


命令,此选项无用,但指定它也没有关系。





f


如果正在调用


sed


脚本文件,使用此选项。此选项通知


sed


一个脚本文件支持所有的


sed


命令,例如:


sed -f myscript.sed input_file


,这里


myscript.sed


即为支持


sed


命令的文件。





4.2.1


、保存


sed


输出




由于不接触初始化文件,如果想要保存改动内容,简单地将所有输出重定向到一个文件



即可。




4.2.2


、使用


sed


在文件中查询文本的方式





sed


浏览输入文件时,缺省从第一行开始,有两种方式定位文本:





1)


使用行号,可以是一个简单数字,或是一个行号范围。





2 )


使用正则表达式





使用


sed


在文件中定位文本的方式:





x


x


为一行号,如


1





x,y




表示行号范围从


x





y


,如


2





5


表示从第


2


行到第


5








/pattern/




查询包含模式的行。例如


/ d i s k /





/[a-z]/





/pattern/pattern/




查询包含两个模式的行。例如


/disk/disks/





pattern/,x




在给定行号上查询包含模式的行。如


/ribbon/,3





x,/pattern/




通过行号和模式查询匹配行。


3./vdu/





x,y!




查询不包含指定行号


x





y


的行。


1,2!





4.2.3


、基本


sed


编辑命令





sed


编辑命令:





p




打印匹配行





=




显示文件行号





a/




在定位行号后附加新文本信息





i/




在定位行号后插入新文本信息





d




删除定位行





c/




用新文本替换定位文本





s




使用替换模式替换相应模式





r




从另一个文件中读文本





w




写文本到一个文件





q




第一个模式匹配完成后推出或立即推出





l




显示与八进制


ASCII


代码等价的控制字符





{ }




在定位行执行的命令组





n




从另一个文件中读文本下一行,并附加在下一行





g




将模式


2


粘贴到


/pattern n/





y




传送字符





n




延续到下一输入行;允许跨行的模式匹配语句





4.3





sed


和正则表达式





sed


识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特殊字符,必须使用(


/


)屏蔽其特殊含义





4.4


、基本


sed


编程举例





4.4.1


、创建


sed


脚本文件





要创建脚本文件


append.sed


,输入下列命令:




pg append.sed



#!/bin/sed –f



/company/ a/



Then suddenly it happened



保存它,增加可执行权限。




4.4.2


、附加、插入、修改、删除、替换文本




附加文本:



[address] a/



text



插入文本:



[address] i/



text



修改文本:



[address[,address]] c/



text



删除文本:



[address[,address]] d



替换文本:



[address[,address]] s /pattern-to-find/replacement-pattern/[g p w n]




s


选项通知


sed


这是一个替换操作,并查询


pattern-to-find


,成功后用


replacement-pattern


替换它。




替换选项如下:




g




缺省情况下只替换第一次出现模式,使用


g


选项替换全局所有出现模式。





p




缺省


sed


将所有被替换行写入标准输出,加


p


选项将使


– n


选项无效。


-n


选项不打印输出结果。





w




文件名使用此选项将输出定向到一个文件。





4.5


、使用替换修改字符串





如果要附加或修改一个字符串,可以使用(


&


)命令,


&


命令保存发现模式以便重新调用它,然后把它放在替换字符串里面。





4.6


、将


sed


结果写入文件命令





像使用


>


文件重定向发送输出到一个文件一样,在


sed


命令中也可以将结果输入文件。格式有点像使用替换命令:





[address [





address]]w filename








w


’选项通知


s e d


将结果写入文件。


filename


是自解释文件名。





4.7


、从文件中读文本





处理文件时,


sed


允许从另一个文件中读文本,并将其文本附加在当前文件。此命令放在模式匹配行后,格式为:




address r filename




这里


r


通知


sed


将从另一个文件源中读文本。


filename


是其文件名。





4.8


、匹配后退出





有时需要在模式匹配首次出现后退出


sed


,以便执行其他处理脚本。退出命令格式为:




address q




4.9


、从


shell





sed


传值





要从命令行中向


sed


传值,值得注意的是用双引号,否则功能不执行。




NAME=”It is a go situation”



REPLACE=”GO”



echo $NAME | sed “s/go/$REPLACE/g”



It is a GO situation




4.10


、从


sed


输出中设置


shell


变量








sed


输出中设置


shell


变量是一个简单的替换过程。运用上面的例子,创建


shell


变量


NEW_NAME


,保存上述


sed


例子的输出结果。




NAME=”It is a go situation”



REPLACE=”GO”



NEW_NAME=`echo $NAME | sed “s/go/$REPLACE/g”`



echo $NEW_NAME



It is a GO situation




5


、合并和分割





5.1





sort


用法





sort


命令将许多不同的域按不同的列顺序分类。当查阅注册文件或为另一用户对下载文件重排文本列时,


sort


工具很方便。实际上,使用其他


UNIX


工具时,已假定工作文件已经被分过类。无论如何,分类文件比不分类文件看起来更有意义。





5.1.1





sort


选项





sort


命令的一般格式为:




sort -cmu -o output_file [other options] +pos1 +pos2 input_files




下面简要介绍一下


sort


的参数:





-c


测试文件是否已经分类。





-m


合并两个分类文件。





-u


删除所有复制行。





-o


存储


sor t


结果的输出文件名。




其他选项有:




-b


使用域进行分类时,忽略第一个空格。





-n


指定分类是域上的数字分类。





-t


域分隔符;用非空格或


tab


键分隔域。





-r


对分类次序或比较求逆。





+n n


为域号。使用此域号开始分类。





n n


为域号。在分类比较时忽略此域,一般与


+ n


一起使用。





post1


传递到


m





n





m


为域号,


n


为开始分类字符数;例如


4





6


意即以第


5


域分类,从第


7


个字符开始。





5.1.2


、保存输出





-o


选项保存分类结果,然而也可以使用重定向方法保存。





5.1.3





sort


启动方式





缺省情况下,


sort


认为一个空格或一系列空格为分隔符。要加入其他方式分隔,使用


-t


选项。





sort


执行时,先查看是否为域分隔设置了


-t


选项,如果设置了,则使用它来将记录分隔成域


0


、域


1


等等;如果未设置,用空格代替。缺省时


sort


将整个行排序,指定域号的情况例外。





5.1.4





sort


对域的参照方式





关于


sort


的一个重要事实是它参照第一个域作为域


0


,域


1


是第二个域,等等。


sort


也可以使用整行作为分类依据。


sort


将定位各域,因此应把域


0


作为分类键


0


,域


1


作为分类键


1


等等。





5.1.5


、文件是否已分类





使用


sort -c


通知


sort


文件是否按某种顺序分类。





5.1.6


、基本


sort





最基本的


sor t


方式为


sort filename


,按第一域进行分类(分类键


0


)。实际上读文件时


sort


操作将行中各域进行比较,这里返回基于第一域


sort


的结果。





5.1.7





sort


分类求逆





如果要逆向


sort


结果,使用


– r


选项。在通读大的注册文件时,使用逆向


sort


很方便。





5.1.8


、按指定域分类





有时需要只按第


2


域(分类键


1


)分类。这里为重排报文中供应区代码,使用


+1


,意义为按分类键


1


分类。注意分类键


2





3


对应各域也被分类。





5.1.9


、数值域分类





依此类推,要按第三分类键分类,使用


+3


。但是因为这是数值域,即为数值分类,可以使用


-n


选项。





5.1.10


、唯一性分类





有时,原文件中有重复行,这时可以使用


-u


选项进行唯一性(不重复)分类以去除重复行。





5.1.11


、使用


k


的其他


sort


方法





sort


还有另外一些方法指定分类键。可以指定


k


选项,第


1


域(分类键)以


1


开始。不要与前面相混淆。其他选项也可以使用


k


,主要用于指定分类域开始的字符数目。





5.1.12


、使用


k


做分类键排序





可以指定分类键次序。先以第


4


域,再以第


1


域分类,命令为


-k4 -k1





5.1.13


、指定


sort


序列





可以指定分类键顺序,也可以使用


-n


选项指定不使用哪个分类键进行查询。





5.1.14





pos


用法




指定开始分类的域位置的另一种方法是使用如下格式:



sort +field_number.characters_in




意即从


field_number


开始分类,但是要在此域的第


characters_in


个字符开始。





5.1.15


、使用


head





tail


将输出分类





可以使用


head





tail


查阅任何大的文本文件,


head


用来查阅文件头,基本格式如下:




head [how_may_lines_to_display] filename




tail


用来查阅文件尾,基本格式为:




tail [how_may_lines_to_display] filename




如果使用


head





tail


时想省略显示行数,缺省时显示


10


行。





5.1.16 a


wk


使用


sort


输出结果





对数据分类时,对


sort


结果加一点附加信息很有必要,对其他用户尤其如此。使用


awk


可以轻松完成这一功能。需要将


sort


结果管道输出到


awk


,不要忘了用冒号作域分隔符,显示提示信息和实际数据。





5.1.17


、将两个分类文件合并





将文件合并前,它们必须已被分类。合并文件可用于事务处理和任何种类的修改操作。分类的合并格式为:


sort -m sorted_file1 sorted_file2








5.2





uniq


用法





uniq


用来从一个文本文件中去除或禁止重复行。一般


uniq


假定文件已分类,并且结果正确。我们并不强制要求这样做,如果愿意,可以使用任何非排序文本,甚至是无规律行。





可以认为


uniq


有点像


sort


命令中唯一性选项。对,在某种程度上讲正是如此,但两者有一个重要区别。


sort


的唯一性选项去除所有重复行,而


uniq


命令并不这样做。重复行是什么?在


uniq


里意即持续不断重复出现的行,中间不夹杂任何其他文本。




命令一般格式:



其选项含义:




-u




只显示不重复行。





-d




只显示有重复数据行,每种重复行只显示其中一行





-c




打印每一重复行出现次数。





-f


n


为数字,前


n


个域被忽略。





5.3





join


用法





join


用来将来自两个分类文本文件的行连在一起。如果学过


SQL


语言,可能会很熟悉


join


命令。





下面讲述


join


工作方式。这里有两个文件


file1





file2


,当然已经分类。每个文件里都有一些元素与另一个文件相关。由于这种关系,


join


将两个文件连在一起,这有点像修改一个主文件,使之包含两个文件里的共同元素。





为有效使用


join


,需分别将输入文件分类。




其一般格式为:



join [options] input-file1 input-file2



让我们看看它的可用选项列表:




an


n


为一数字,用于连接时从文件


n


中显示不匹配行。





o n.m


n


为文件号,


m


为域号。


1.3


表示只显示文件


1


第三域,每个


n





m


必须用逗号分隔,如


1.3





2.1








jn m


n


为文件号,


m


为域号。使用其他域做连接域。





t




域分隔符。用来设置非空格或


tab


键的域分隔符。例如,指定冒号做域分隔符


-t


:。








1


)不匹配连接





如果一个文件与另一个文件没有匹配域时怎么办?这时


join


不可以没有参数选项,经常指定两个文件的


-a


选项。如:




join –a1 names.txt town.txt







2


)选择性连接





使用


-o


选项选择连接域。例如要创建一个文件仅包含人名及城镇,


join


执行时需要指定显示域。方式如下:





使用


1.1


显示第一个文件第一个域,


2.2


显示第二个文件第二个域,其间用逗号分隔。命令为:




join –o 1.1,2.2 names.txt town.txt







3


)其他域连接





使用


-jn m


进行其他域连接,例如用文件


1





3


和文件域


2


做连接键,命令为:




join –j1 3 -j2 2 file1 file2




5.4





cut


用法





cut


用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。





cut


一般格式为:




cut [options] file1 file2



下面介绍其可用选项:




-c


list


指定剪切字符数。





-f field




指定剪切域数。





-d




指定与空格和


tab


键不同的域分隔符。





5.4.1


、使用域分隔符





文件中使用冒号“:”为域分隔符,故可用


-d


选项指定冒号,如


– d


:。





5.4.2


、剪切指定域





cut


命令中剪切各域需用逗号分隔,如剪切域


1





3


,可以使用:




cut –d: -f1,3 pers




要从文件


/etc/passwd


中剪切注册名及缺省根目录,需抽取域


1


和域


3








使用


-c


选项指定精确剪切数目。这种方法需确切知道开始及结束字符。如使用


ls -l


命令作部分输出,需使用


– c


选项。要剪切字符,须计算


ls -l


列表中的字符数。如显示权限用


cut -c1-10








5.5





paste


用法





cut


用来从文本文件或标准输出中抽取数据列或者域,然后再用


paste


可以将这些数据粘贴起来形成相关文件。粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。





paste


将按行将不同文件行信息放在一行。缺省情况下,


paste


连接时,用空格或


tab


键分隔新行中不同文本,除非指定


-d


选项,它将成为域分隔符。





paste


格式为:




paste -d -s -file1 file2



选项含义如下:




-d




指定不同于空格或


tab


键的域分隔符。例如用


@


分隔域,使用


– d @








-s




将每个文件合并成行而不是按行粘贴。





5.5.1


、指定列




通过交换文件名即可指定哪一列先粘:



paste pas2 pas1




5.5.2


、使用不同的域分隔符





要创建不同于空格或


t a b


键的域分隔符,使用


– d


选项。下面的例子用冒号做域分隔符。




paste –d: pas2 pas1




5.5.3





paste


命令管道输入





paste


命令还有一个很有用的选项(





)。意即对每一个(





),从标准输入中读一次数据。使用空格作域分隔符,以一个


4


列格式显示目录列表。方法如下:




ls | paste –d” ” – – – –



也可以以一列格式显示输出:




5.6





split


用法





split


用来将大文件分割成小文件。有时文件越来越大,传送这些文件时,首先将其分割可能更容易。使用


vi


或其他工具诸如


sort


时,如果文件对于工作缓冲区太大,也会存在一些问题。因此有时没有选择余地,必须将文件分割成小的碎片。





split


命令一般格式:




split –output-file-size input-filename output-filename




这里


output-file-size


指的是文本文件被分割的行数。





6





tr





tr


用来从标准输入中通过替换或删除操作进行字符转换。


tr


主要用于删除文件中控制字符或进行字符转换。使用


tr


时要转换两个字符串:字符串


1


用于查询,字符串


2


用于处理各种转换。


tr


刚执行时,字符串


1


中的字符被映射到字符串


2


中的字符,然后转换操作开始。





带有最常用选项的


t r


命令格式为:




tr -c -d -s [“string1_to_translate_from”] [“string2_to_translate_to” ] input_file



这里:




-c




用字符串


1


中字符集的补集替换此字符集,要求字符集为


ASCII








-d




删除字符串


1


中所有输入字符。





-s




删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符




串。




input_file


是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。





6.1


、字符范围





使用


tr


时,可以指定字符串列表或范围作为形成字符串的模式。这看起来很像正则表达式,但实际上不是。指定字符串


1


或字符串


2


的内容时,只能使用单字符或字符串范围或列表。





[a-z]


a-z


内的字符组成的字符串。





[A-Z]


A-Z


内的字符组成的字符串。





[0-9]




数字串。





/octal




一个三位的八进制数,对应有效的


ASCII


字符。





[O*n]




表示字符


O


重复出现指定次数


n


。因此


[O*2 ]


匹配


OO


的字符串。





像大多数系统工具一样,


t r


也受特定字符的影响。因此如果要匹配这些字符,需使用反斜线屏蔽其特殊含义。例如,用


/ {



指定花括号左边可以屏蔽其特殊含义。





tr


中特定控制字符的不同表达方式





速记符






含义






八进制方式





/a


Ctrl-G


铃声




/007





/b


Ctrl-H


退格符




/010





/f


Ctrl-L


走行换页




/014





/n


Ctrl-J


新行




/012





/r


Ctrl-M


回车




/015





/t


Ctrl-I tab







/011




/v


Ctrl-X


/030




6.2


、保存输出




要保存输出结果,需将之重定向到一个文件。



现在看一些例子。




6.3


、去除重复出现的字符





如果要去除重复字母或将其压缩在一起,使用


-s


选项。因为都是字母,故使用


[a-z]


。输入文件重定向到


tr


命令。




tr –s “[a-z]” <opps.txt




6.4


、删除空行





要删除空行,可将之剔出文件。使用


-s


来做这项工作。换行的八进制表示为


/012


,命令为:




tr –s “[/012]”<plane.txt




也可以使用换行速记方式


/n


,这里用单引号(通常用双引号)。




tr –s “[/n]”<plane.txt




6.5


、大写到小写





除了删除控制字符,转换大小写是


tr


最常用的功能。为此需指定即将转换的小写字符


[a-z]


和转换结果


[A-Z]







tr “[a-z]””[A-Z]”




6.6


、删除指定字符





命令


tr -cs “[a-z][A-Z]””[/012*]”


将文件每行所有不包含在


[a-z]





[A-Z]


(所有希腊字母)的字符串放在字符串


1


中并转换为一新行。


-s


选项表明压缩所有新行,


-c


表明保留所有字母不动。





6.7


、转换控制字符





tr


的第一个功能就是转换控制字符





6.7


、匹配多于一个字符





可以使用


[character*n ]


格式匹配多于一个字符。