文本过滤
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 ]格式匹配多于一个字符。