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