Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2123916
  • 博文数量: 288
  • 博客积分: 10594
  • 博客等级: 上将
  • 技术积分: 3469
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-27 19:27
文章分类

全部博文(288)

文章存档

2012年(4)

2011年(30)

2010年(40)

2009年(32)

2008年(71)

2007年(79)

2006年(32)

分类: LINUX

2012-03-01 11:19:41

第二部  分文本过滤
第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选项的pos可以是F.C格式,即 域号.起头字符位置(+和k的FC计算分别从0和1开始,同上)
   +、-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更加快捷、容易。

阅读(2322) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~