分类: LINUX
2007-03-15 18:00:42
第二部 分文本过滤
第7章 正则表达式(RE)介绍
1.在行首以^匹配字符串或字符序列
^ :允许在一行的开始匹配字符或单词.
eg: ^..1匹配0011cx4;^com.ing匹配comming;^d..x..x..x匹配drwxr-xr-x
2.在行尾以$匹配字符串或字符
$ :在行尾匹配字符串或字符, $符号放在匹配单词后
eg: trouble$匹配以单词trouble结尾的所有行;^$匹配所有空行
3.使用*匹配字符串中的单字符或其重复序列
* :一个单字符后紧跟*,匹配0个或多个此单字符
eg: compu*t将匹配字符u一次或多次:computer computting compuuute
4.使用[]匹配一个范围或集合
[ ] :匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用-表示[ ]内字符序列范围,用[1-5]代替[12345]。可以用逗号将括弧内要匹配的不同字符串分开。^符号当直接靠着[,意指否定或不匹配括号里内容
eg: [0-9]任意一个数字;[a-z]任意小写字母;[0-9A-Za-z]任意字母或数字
[C,c]omputer匹配Computer和computer;[^a-zA-Z]匹配任一非字母型字符
5.使用屏蔽一个特殊字符的含义
:用来屏蔽一个元字符的特殊含义。因为有时在shell中一些元字符有特殊含义。可以使其失去应有意义
eg: *.pas在正则表达式中匹配以*.pas结尾的所有文件
6.使用句点匹配单字符
. :匹配任意单ASCII字符,可以为字母,或为数字
eg: ..XC..匹配deXC1t;.w..w..w.匹配rwxrw-rw-
7.使用{}匹配模式结果出现的次数
pattern{n} :用来匹配前面pattern出现次数。n为次数
pattern{n,} :含义同上,但次数最少为n
pattern{n,m} :含义同上,但pattern出现次数在n与m之间
eg:A{2}B匹配值为AAB;A{2,}B,可以得结果AAB或AAAAAAB,但不能为AB。
A{2,4}B,则结果为AAB、AAAB、AAAAB,而不是AB或AAAAAB等。
[0-9]{4}XX[0-9]{4},匹配:数字出现4次,后跟XX,最后是数字出现4次
8.经常使用的正则表达式举例
[Ss]igna[lL] 匹配单词signal、signaL、Signal、SignaL
[Ss]igna[lL]. 同上,但加一句点
^USER$ 只包含USER的行
. 带句点的行
^d..x..x..x 对对用户、用户组及其他用户、组成员有可执行权限的目录
^[^l] 排除关联目录的目录列表
.*0 0之前或之后加任意字符
000* 000或更多个
[yYnN] 大写或小写y或n
^.*$ 匹配行中任意字符串
^......$ 包括6个字符的行
[a-zA-Z] 任意单字符
[a-z]* 至少一个小写字母
[^0-9$] 非数字或美元标识
[123] 1到3中一个数字
^q 以^q开始行
^.$ 仅有一个字符的行
^.[0-9][0-9] 以一个句点和两个数字开始的行
[0-9]{2}-[0-9]{2}-[0-9]{4} 日期格式dd-mm-yyyy
[0-9]{3}.[0-9]{3}.[0-9]{3}.[0-9]{3} IP地址格式nnn.nnn.nnn.nnn
.* 匹配任意多个字符
第8章 grep家族
9.grep(全局正则表达式版本) 允许对文本文件进行模式查找,输出匹配的行
一般格式:grep [选项] 基本正则表达式 [filen1 [file2 ...]]
基本正则表达式:可为字符串或变量名,在grep命令中输入字符串参数时,最好将其用双引号括起来。在调用变量时,也应该使用双引号。在调用模式匹配时,最好使用单引号。
常用的grep选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行
查询多个文件:可以使用*。 eg: grep "sort"*.doc; grep "sort it" *
精确匹配: 在抽取字符串后加 >。
eg: grep "48>" filename 可以抽取48、1248、c48等尔不能抽取481、c480等
10.grep和正则表达式 使用正则表达式时最好用单引号括起来
匹配空行: grep -n '^$' myfile
grep允许使用国际字符模式匹配或匹配模式的类名形式
[[:upper:]] 等价于 [A-Z]
[[:lower:]] 等价于 [a-z]
[[:digit:]] 等价于 [0-9]
[[:alnum:]] 等价于 [0-9a-zA-Z]
[[:space:]] 等价于 空格或tab键
[[:alpha:]] 等价于 [a-zA-Z]
grep命令用于查看系统信息
ls -l | grep '^d'
grep "df620" /etc/passwd
ps ax | grep "httpd" | grep -v "grep"
15.egrep egrep代表expression或extended grep,适情况而定
使用-f开关,可以以一个文件作为保存的字符串,然后将之传给egrep作为参数
eg: egrep -f grapstrings data.f
可以使用(|)符号,意即“|”符号两边之一或全部,可以使用任意多"|",可同时使用^符号排除字符串
eg: egrep '(3ZL|2CC)' data.f ; who |egrep '(zqf|zqc)' #单引号不能掉
第9章 AWK介绍
......
第10章 sed用法介绍
sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。可以在命令行输入sed命令,也可以在一个文件中写入命令,然后调用sed。sed并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。因为sed是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行。
16.sed怎样读取数据
sed从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束
17.调用sed的三种方式
在命令行键入命令: sed [选项] 'sed命令' 输入文件
sed选项:-n :不打印到标准输出
-f sed脚本 :指定sed脚本
-e :执行sed命令
'sed命令': '[address]sed编辑命令'
将sed命令插入脚本文件,然后调用sed: sed [选项] -f sed脚本文件 输入文件
将sed命令插入脚本文件,并使sed脚本可执行: sed脚本文件格式:
#!/bin/sed -f
sed命令
sed命令
...
18.sed在文件中定位文本的方式 [address]
x x为一行号,如5
x,y 表示行号范围从x到y,如2,5表示从第2行到第5行
/pattern/ 查询包含模式的行。例如/disk/或/[a-z]/
/pattern/pattern/ 查询包含两个模式的行。例如/disk/disks/
/pattern/,x 在给定行号上查询包含模式的行。如/ribbon/,3
x,/pattern/ 通过行号和模式查询匹配行。3,/vdu/
x,y! 查询不包含指定行号x和y的行。1,2!
19.sed编辑命令
p :打印匹配行 eg:sed '1,3p' quote.txt
= :显示文件匹配行行号 eg:sed -n '/music/=' quote.txt
a :在指定行后附加新文本信息,多用于脚本。
格式如: [address]a
textline1
textline2
.....
textlineN
i :在指定行前插入新文本信息,格式同a
d :删除定位行 eg:sed '3,$d' quote.txt
c :用新文本替换定位文本,格式同a
s :用模式replacement替换模式pattern,格式:
[address]] s/pattern/replacement/[g p w n]
替换选项如下:
g :缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
p :缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效。-n选项不打印输出结果。
w 文件名 :使用此选项将输出定向到一个文件。
如果要附加或修改一个字符串,可以使用&命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面: eg:sed -n 's/nurse/"Hello" &/p' quote.txt 等效于nurse前插入Hello单词。
r :从另一个文件中读文本附加到指定的行后 eg:sed '/company/r sedex.txt' quote.txt
w :写文本到一个文件 eg:sed '1,2 w filedt' quote.txt
q :第一个模式匹配完成后退出sed,以便执行其他处理脚本
l :显示与八进制ASCII代码等价的控制字符,格式:[address]l
{ } :在定位行执行的命令组
n :从另一个文件中读文本下一行,并附加在下一行
g :将模式2粘贴到/pattern n/
y :传送字符
n :延续到下一输入行;允许跨行的模式匹配语句
20.如何输入控制字符(如回车、Esc、F1等)
Ctrl+V,然后释放上述2个键,安Enter回车键(以输入回车为例)
21.在sed命令中使用shell变量(自定义变量,而不应是shell环境变量)
在sed命令中使用shell变量时,应使用双引号,否则不能得到期望的结果。
eg:REPLACE="COMPANY" ; sed "s/company/$REPLACE/g" quote.txt
22.一些一行命令集。([]表示空格, [ ]表示tab键)
's/.$//g' 删除以句点结尾行
'/abcd/d' 删除包含abcd的行
's/[][][]*/[]/g' 删除一个以上空格,用一个空格代替
's/^[][]*//g' 删除行首空格
's/.[][]*/[]/g' 删除句点后跟两个或更多空格,代之以一个空格
'/^$/d’ 删除空行
's/^.//g' 删除第一个字符
's/^///g' 从路径中删除第一个/
's/[]/[]/[ ]/g’ 删除所有空格并用t a b键替代
'S/^[ ]//g’ 删除行首所有t a b键
第11章 合并与分割
23.sort的用法
usage: sort [sort选项] [file ....]
sort命令的操作可以分为3种模式,排序(默认模式)、合并(-m选项)、检查排序(-c选项)
24.sort的字段设定与输出选项
-o out-file :指定输出文件,输出文件可以时输入文件之一
-t 分隔符 :设定字段分隔符,分隔符为空格或tab时不需要此选项
-u :检查指定域的唯一性(不重复)(检查排序模式),或去除域重复的行(排序、合并模式下)
+pos :pos为域号。在排序时忽略此域,一般与+pos一起使用(pos从0开始计算)
-pos :不使用指定的域来排序(pos=0.1.2...n,pos从0开始计算)
-k pos1,[pos2] :(域号pos1
+、-k选项可以多次使用。eg: sort +0 -2 +3 video.txt
sort -t: +2n video.txt 完全等效于 sort -t: -k3,3n video.txt
将file1文件排序后重写到file1,应使用sort -o file1 file1,而不能用重定向sort file1 >file1
25.sort的数据排序选项
-n :当指定位置上是数字字符时,按数值大小来排序,而不是逐字符比较
-b :忽略前置空白
-r :颠倒输出排序的结果(即逆序输出)
26.sort用于合并2个排序文件(将文件合并前,它们必须已被排序)
usage:sort -m [-o 输出文件] [选项] file1 file2
当省略-o选项时,sort将file1 file2合并排序后重写到file2中
缺省用第一个字段来进行合并排序(+0),也可以使用字段设定选项来指定字段进行合并排序
27.uniq 从一个文本文件中去除或禁止重复行
uniq [选项] [input [output]]
选项:
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-fx x为数字(x=0.1...),比较时忽略每行的前x个域,与-x等效。有的系统使用-nx选项
-i 忽略字母的大小写
-sx 从第x个字符处开始比较(x=1.2..),与+x等效。与-fx连用时,优先级低于-fx选项
注意:
一般uniq假定文件已分类。但uniq并不强制要求如此,也可以使用任何非排序文本,甚至是无规律行
uniq不同于sort的-u选项,uniq认为持续不断重复出现的行(中间不包括其它文本)才是重复行
28.join 将来自两个递增排序文本文件的行连在一起
join [选项] file1 file2
输入文件中的域通常由空格或tab键分隔,也可以指定其他的域分隔符。
join在执行时会在2个输入文件的行中寻找具有相同join字段,输出行的字段间以一个空格隔开,每一个输出行上包括join字段、file1内其余字段以及file2内的其余字段。2个输入文件应该都已经对join字段作了递增排序,每个文件的join字段默认为文件的第1个字段,也可以自己指定文件的join字段。
29.join选项
-ax :将文件编号为x(x=1.2)的文件中未被匹配连接的行打印出来
-o x.y[,x.y,...] :在输出中只打印文件x的第y(y=1.2...)个字段
-j m :指定2个文件都用第m(m=1.2...)个字段作为join字段
-j1 m 或 -1 m :指定文件1使用第m(m=1.2...)个字段作为join字段
-j2 m 或 -2 m :指定文件2使用第m(m=1.2...)个字段作为join字段
-t char :指定char为输入输出字段的分隔符
-i :忽略字母的大小写
-vx :只打印文件x(x=1.2)中未被匹配连接的行
30.cut 从标准输入或文本文件中剪切列或域
cut [options] file1[ file2 ...]
可用选项:
-d char :指定char为字段分隔符
-f 字段列表 :用数字列表指定要剪切的字段,列表可以是多个数字或区间(m-n),用","分割
-m表示1-m,n-表示从n到最末。数字都是从1开始编号。
-c 字符列表 :数字列表指定要剪切的字符位置,列表格式同上。
- (无file时) :当cut没有指定输入文件时,-表示使用标准输入作为输入源
31.paste 将每个输入文件作为一列粘贴起来输出
paste [options] file1 file2 ...
将每个文件的第x行粘贴成paste标准输出的第x(x=1..)行输出。文件名位置表示列的先后
选项:
-d char :指定char作为字段分隔符。例如用@分隔域,使用-d@。
-s :将每个文件的内容作为一行输出,有n个输入文件就输出n行。
- :没有指定输入文件时,-表示使用标准输入作为输入源
32.split 用来将大文件分割成小文件
split [输出文件尺寸选项] input-filename [输出文件前缀]
输出文件尺寸选项(split预设为1000行)
-x、-lx、--lines=x :每x行生成一个新的输出文件
-b n、--bytes=n :每n字节生成一个新的输出文件,可以用后缀b k m表示以block KB MB为单位
输出文件前缀:
每个生成的输出文件的格式为x[aa]到x[zz],文件前缀x可指定, [aa]..为文件名后缀
其他选项:
- :没有指定输入文件时,-表示使用标准输入作为输入源
--verbose :每生成一个新的输出文件时,就打印一行信息到标准错误
33.tr 用来从标准输入中通过替换或删除操作进行字符转换,然后打印输出到标准输出
Usage: tr [OPTION] String1 [String2] (可以使用管道、重定向来指定输入或输出文件名)
常用选项:
-d string1 :对于在字符串string1中出现的字符,将被删除
-s string1 :对于在字符串string1中出现的字符,如果其在输入中连续重复出现则该字符重复的部分将被删去(压缩为一个字符)
-t :在tr的替换模式中,如果string1字符串长度大于string2,则string1的超长部分被忽略(System V方式)
字符串string可以是:
ASCII可打印字符(字母、数字): eg: asd [asd] "asd" 'asd' "[asd]" .. (等效)
3位8进制表示的ASCII字符 : eg: [64] "64" '64' "[64]" .. (等效)
特定控制字符的表示 : (逃逸字符)
字符区间 :eg: a-z [a-z] "a-z" .. (等效)
简写字符集合 :eg: [:alnum:] 所有字母和数字; [:alpha:] 所有字母;.....
[CHAR*n] :表示匹配n个CHAR字符
[CHAR*] :用于替换模式下的string2,表示CHAR重复足够多次,以使string1和string2长度相等
tr的压缩重复模式: tr -s string1
tr的字符删除模式: tr -d string1
tr的字符替换模式: tr [-t] string1 string2 (把string1的第n个字符替换为string2的第n个字符)
如果字符串string1的长度小于string2的长度,则string2的多余部分将被忽略。
如果字符串string1的长度大于string2的长度,则有2种处理方式:
BSD方式:重复string2的最后一个字符,使得string2的长度等于string1的长度 (Gnu tar的默认方式)
System V方式:截去string1的超长部分。 (Gnu tar 加-t选项时)
注1:-s和-d选项可以同时使用: tr -sd string1 string2
表示先用string1进行删除操作,然后用string2进行压缩重复操作
注2:tr主要用于字符转换或者抽取控制字符。本章所有功能都可以用sed来完成,但有些人宁愿使用tr,因为tr更加快捷、容易。