Chinaunix首页 | 论坛 | 博客
  • 博客访问: 627859
  • 博文数量: 227
  • 博客积分: 8017
  • 博客等级: 中将
  • 技术积分: 2069
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-08 22:50
文章分类

全部博文(227)

文章存档

2011年(10)

2010年(55)

2009年(28)

2008年(134)

我的朋友

分类: LINUX

2008-06-06 22:49:11

一. cut的简单用法
cut可用来从文件的各行中移出指定的section到stdout.
cut -d : -f 1 /etc/passwd  > ~/usrs 取第一列
cut -d : -f 1-3 /etc/passwd         取第一至三列
cut -c 1 /etc/passwd 取每行的第一个字符
cut -c 1-3 /etc/passwd 取每行的第一至第三个字符

二. sort的简单用法

sort命令的功能是对文件中的各行进行排序。
Sort命令将逐行对文件中的内容进行排序,如果两行的首字符相同,该命令将继续比较这两行的下一字符,如果还相同,将继续进行比较。
  语法:
  sort [选项] 文件
  说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用"- ",则表示排序内容来自标准输入。
  sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。缺省情况下以整行为关键字按ASCII字符顺序进行排序。

使用实例: 
sort -t: -k3 -k4 -n /etc/passwd  #/etc/passwd的第三和第四行进行排序,忽略大小写,同时域分割符设置为冒号。 -n表示数字排序,而-d表示字典排序,-f忽略大小写, -u表示去掉重复行等待,更多的看man吧。 


三. 正则表达式
(以VI中的搜索为例)
 元字符 功能
实例
实例说明
^
定位行首
/^love/
匹配以love为首的所有行
$
定位行尾
/love$/
匹配以love为尾的所有行
.
匹配单个字符
/l..v/
与包含一个l,后跟两个字符,再接一个v匹配
*
重复前驱>=0次
/ *love/
与0个或多个空格紧跟love的行匹配
[]
匹配其中一个
/[Ll]ove/
匹配含love或Love的行
[x-y]
匹配集合范围中
的任意一个
/[A-Z]ove/
匹配从A至Z的字母并且该字母后面跟ove
[^]
匹配非集合范围
内的任意一个
/[^A-Z]/
匹配除A至Z范围内的任何一个字符
\
转义原字符
/love\./
匹配包括love.的行
\<
定位单词开始
/\ 匹配以love开头的行(仅vi, grep支持)
\>
定位单词结尾
/love\>/
匹配以love结尾的行(仅vi, grep支持)
\(..\)
标记用于以后
字符匹配
/\(love\)able
\1er/
可达9个标志,模式最左边用第一个
标志开始。例如,模式love保存作标志l,
以后引用作\l;在这个例子中,搜索模式
包括后面跟lover的lovable
x\{m\}
x\{m,\}
x\{m,n\}
x重复m次
至少m次
重复m至次
O\{5,10\}
匹配包含连续5~10个O 的行


综合举例:

  • /^[A-Z]..$/ :匹配行以A至Z的一个字母开头,然后跟两个任意字母,然后跟一个换行符的行。
  • /^[A-Z][a-z]*3[0-5]/ :匹配以一个大写字母开头,后跟0个或多个小写字母,再跟数字3,再跟0—5之间的一个数字。
  • /^ *[A-Z][a-z][a-z]$/ :匹配以0个或多个空格开头,跟一个大写字母,两个小写字母和一个换车符。
  • /^[A-Za-z]*[^,][A-Za-z]*$/ :匹配以0个或多个大写或小写字母开头,不跟逗号,然后跟0个或多个大写或小写字母,然后跟一个换车符。
  • /\/ :匹配包含单词love的行

POSIX字符类:为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是A-Za-z0-9的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A-Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。

[:alnum:] 文字数字字符
[:alpha:] 文字字符
[:digit:] 数字字符
[:graph:] 非空字符(非空格、控制字符)
[:lower:] 小写字符
[:cntrl:] 控制字符
[:print:] 非空字符(包括空格)
[:punct:] 标点符号
[:space:] 所有空白字符(新行,空格,制表符)
[:upper:] 大写字符
[:xdigit:] 十六进制数字(0-9,a-f,A-F)

 

四. grep, egrep ,fgrep
    1. grep
    grep的工作方式:grep在一个或多个文件中搜索指定的模式,其后面跟a single work或者用引号引起来的模式,再后面跟的word都当作文件名进行处理。grep将结果输出到标准输出且并不改变原文件。
    语法格式: grep work filename filename
    grep选项:
  • -b  在各行之前放置它发现的块号。有时在根据上下文定位磁盘字块时有用
  • -c  显示匹配行数而不是内容
  • -h  不显示文件名
  • -i  在搜索时忽略字母大小写
  • -n  文件中每行之前给行号
  • -s  无声操作,即除了错误消息外不做任何显示。用于检查退出状态
  • -v  把搜索翻转为只显示不匹配的行
  • -w  把表达式当作一个单词来搜索,相当于用\<和\>括起来
    grep 实例:
  • grep NW datafile  打印datafile中包含NW的行
  • grep NW d*  打印所有以d开头的文件中含有NW的文件
  • grep '^n' datafile  打印文件datafile中所有以字母n开头的行
  • grep TB Savage datafile  在Savage和datafile文件中查找有TB的行
  • grep 'TB Savage' datafile  在datafile文件中查找含有TB Savage的行并打印
  • grep '^[we]' datafile  打印datafile中以w或者e开头的行
  • grep –c ‘west’ datafile 计算datafile中含有west的总数
    2. egrep (= grep -E)
    egrep 是grep的extension, 支持更多的元字符。egrep多支持的额外元字符如下:
   
 + 匹配一个或多个前驱字符
'[a-z]+ove' 
匹配一个或多个小写字母,后跟ove
?
匹配0个或者1个前驱字符 
'lo?ve' 
匹配love或lve
a|b
匹配a或者b
'love|hate' 
匹配love或hate
()
组字符
'lov(ely|able)'
匹配lovely或lovable
   
    egrep实例:
    egrep '2\.?[0-9]' datafile 打印包含一个2,后跟0个或者一个句号,然后跟一个数字的行。

    3 fgrep (= grep -F)
    fgrep 跟grep类似, 但是它将所有元字符当作其本身。
    例如: fgrep '[A-Z]****[0-9]..$5.00' file 匹配包含[A-Z]****[0-9]..$5.00的行

五. sed
    1.
sed命令简介
    sed是流式、非交互式编辑器。它允许你执行与vi和ex编辑器里一样的编辑任务。Sed 程序不是与编辑器交互式工作的,而是让你在命令行里敲入编辑的命令,给文件命名,然后在屏幕上查看命令输出结果。
    2.sed工作原理
    sed编辑器按一次处理一行的方式来处理文件,并把输出送到屏幕上。sed将每次正在处理的行放到称为“模式空间”的临时缓存区中。sed处理完模式空间的行后,就把这行发送到屏幕上。sed没处理一行就将其从模式空间中删除,然后将下一行读入空间,进行处理和显示。sed把每一行都存到临时缓存区中,并对这个副本进行处理, 所以不会修改或破坏文件
    3.sed命令和选项
      sed 命令
a\  在当前行上添加一个文本行或者多个文本行
c\  用新闻本改变(取代)当前行里的文本
d  删除行
i\  在当前行之前插入文本
h  把模式空间内容复制到一个固定缓存
H  把模式空间内容添加到一个固定缓存
g  得到固定缓存里所有的禀复制到模式缓存,重写其内容
G  得到固定缓存的内容并复制到模式缓存,添加到里面
I  列出不打印的字符
p  打印行
n  读下一输入行,并开始用下一个命令处理换行符,而不是用第一个命令
q  结束或退出sed
r  从一个文件读如行
!  把命令应用到除了选出的行以外的其他所有行
s  把一个字串替换成另一个

替换标志
g  在一行上进行全局替换
p  打印行
w  把行写到一个文件中
x  用模式空间的内容交换固定缓存的内容
y  把一个字符转换成另一个(不能和整则表达式元字符一起使用)
sed选项
-e  允许多项编辑
-f  指定sed脚步文件名
-n  取消缺省的输出
如何需要使用多条命令,或者需要在某个地址范围内嵌套地址,就必须用花括号将命令括起来, 每行只写一条命令,或者用分号分隔同一行中的多条命令
   4. sed 实例
1> 打印:p命令
sed '/north/p' datafile
默认输出所有行,找到north的行重复打印
sed –n '/north/p' datafile
禁止默认输出,只打印找到north的行
打印文件的第100行:
sed -n '100p' datafile
打印文件的第10行~100行
sed - n '10, 100p' datafile
2> 删除:d命令
sed '3d' datafile
删除第三行,其余行输出到屏幕
sed '3,$d' datafile
从第3行到最后一行都删除,将剩余部分输出到屏幕
sed '/north/d' datafile
将含有north的行删除,其余输出到屏幕
3> 替换:s命令
sed 's/west/north/g' datafile
解释:找到datafile中的所有west并替换成north,将替换后的内容输出到屏幕。
sed 's/[0-9][0-9]$/&.5/' datafile
解释:在替代串里的&字符代表在搜索串中真正找到的。每个以两个数字结尾的行都被它自己取代,且要在后面加上.5
sed -n 's/Hemenway/Jones/gp' datafile
解释:所有的Hemenway所在的位置都用Jones来取代,而且只有改变的行被打印。-n与p命令选项相结合来禁止默认输出。g代表全局替换
sed -n 's/\(Mar\)got/\1ianne/p' datafile
解释:模式Mar被封装在括弧里且在一个专用寄存器里存为标记1。在替换串里它将被引用做\1。然后用Marianne替代Margot。
sed 's#3#88#g' datafile
解释:s命令后面的字符是搜索串和替换串之间的分界符。默认的分界符是一个正斜杠,但也可以改变(只有使用s命令时)。无论s命令后面跟什么字符,它都是新的串分界符。当搜索包含一个正斜杠的模式,如路径或生日时,这种技巧可能有用的 ^V^
4> 被选中的行的范围:逗号
sed -n '/west/,/east/p' datafile
解释:打印在west和east之间的模式范围内所有行。如果west出现在east之后,则打印从west到下一个east或者到文件末尾的行,无论哪种情况先出现都可以。
sed '/west/,/east/s/$/**VACA**/' datafile
解释:对于在模式west到east范围内的行,行末尾将用**VACA**来取代。
5> 多次编辑 -e 选项
sed -e '1,3d' -e 's/Hemenway/Jones/' datafile
-e选项允许多次编辑。不同的编辑顺序可能导致不同的结果。
例如,如果两个命令都执行了替换,第一次替换可能影响第二次替换。
6> 从文件中读取:r命令
sed '/Suan/r newfile' datafile
解释:r命令从newfile中读取内容,将内容输出到Suan的后面。如果datafile中Suan出现的次数不只一次,则分别放到Suan的后面。
7> 写入文件:w命令
sed -n '/north/w newfile' datafile
解释:w命令把指定的行写入到一个文件。本例中所有的包含north的行写入到newfile中。
等同于 sed -n '/north/p' datafile > newfile
8> 添加:a命令
$ sed '/north/a\
 > ---->THE NORTH SALES DISTRICT HAS MOVED<-----' datafile
解释:红颜色的内容是要输入的内容。a\命令后面跟要添加的内容。奇怪的是a\后面必须另起一行,在输入要添加的内容,否则会提示命令错乱。
9> 插入:i命令
$ sed '/north/i\
  > ---->THE NORTH SALES DISTRICT HAS MOVED<-----' datafile
10>下一个:n命令
解释:如果在某一行匹配到模式eastern, n命令就指示sed用下一个输入行替换模式空间中的当前行, 用Archie替换(s)其中的AM, 然后打印改行。再继续往下处理。
11>变换:y 命令
% sed '1,3y/abcdefghijklmnopqrst/ABCDEFGHIJKLMNOPQRST/' datafile
解释:将对应字母进行转换。
12>退出:q命令
% sed '5q' datafile
解释:在打印了5行之后,用q命令退出sed程序。
13>保存和取得:h和G命令
sed -e '/southeast/h' -e '$G' datafile
解释:当sed处 理文件时,每行都存在模式空间(pattern space)的临时缓存中。除非行被禁止打印或删除,否则行将在处理完后被打印到屏幕,然后清模式空间并把下一输入行保存在那里等待处理。在这个例子中, 在找到模式之后,把它放在模式空间里,而且h命令复制它并把它存到另一个叫做保存缓存(holding buffer)中。
第二个sed指令里,当读入最后一行($)时,G命令告诉sed从保存缓存中取得该行并放回模式空间缓存,添加到当前存在那里的行中。
sed -e '/WE/{h;d;}' -e '/CT/G' datafile
解释:第一个命令h将找到了WE的行放到保存缓存中,然后删除该行;第二个命令/CT/G就是在找到了CT的行的后面加入保存缓存的内容。
14>G和g的区别
/G命令在符合的条件行后面添加保存缓存中的内容;g命令用保存缓存中的内容覆盖符合条件的行。15>sed 命令的花括号{}的作用
花括号{}中可以放入多个命令,每个命令后面要用分号;。
16>保存和交换:h 和 x命令
解释:x命令将找到的行用保存缓存中的内容替换。
  5. 用sed来编写命令表
    sed 命令表(script)是文件里的一个sed命令列表。用-f选项来引用一个命令表文件。编辑sed命令表有特殊要求:命令末尾不能有任何为岁的空白符或者文本。如果命令不是自成一行,就必须用分号结束。
$sed -f sedding1 datafile. 其中sedding1的内容如下:
# My first sed script
1i\
 PERSONNEL FILE
/500/d
s/\([A-Z][a-z]*\) \([A-Z][a-z]*\):/\2 \1:/
$a\
内容解释:
a. 在第1行之前插入标题PERSONNEL FILE
b. 删除以500结尾的工资
c. 打印文件内容,把姓和名颠倒
  6. sed补充命令 : sed -i 's/RWLockST.h/RWLock.h/g' */*.h 替换当前所有目录下的.h文件的里的RWLockST.h为RWLock.h
 


参考:
1. UNIX.Shells.by.Example.4th.Edition
2. unix shell 范例精解学习笔记

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