Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5352262
  • 博文数量: 1144
  • 博客积分: 11974
  • 博客等级: 上将
  • 技术积分: 12312
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-13 20:06
文章存档

2017年(2)

2016年(14)

2015年(10)

2014年(28)

2013年(23)

2012年(29)

2011年(53)

2010年(86)

2009年(83)

2008年(43)

2007年(153)

2006年(575)

2005年(45)

分类: LINUX

2007-06-19 09:10:17

11月5日
linux学习--sed,sort,uniq,join,cut,paste,split
==============================sed==========================
1、调用sed
 调用s e d有三种方式:在命令行键入命令;将s e d命令插入脚本文件,然后调用s e d;将s e d
命令插入脚本文件,并使s e d脚本可执行。
 使用s e d命令行格式为:
  sed [选项] s e d命令  输入文件。
 记住在命令行使用s e d命令时,实际命令要加单引号。s e d也允许加双引号
 
 使用s e d脚本文件,格式为:
  sed [选项] -f sed脚本文件输入文件
 
 要使用第一行具有s e d命令解释器的s e d脚本文件,其格式为
  sed脚本文件 [选项] 输入文件
 
 sed选项如下:
 n 不打印;s e d不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以
 用来打印编辑行。
 c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条s e d命令,
 此选项无用,但指定它也没有关系。
 f 如果正在调用s e d脚本文件,使用此选项。此选项通知s e d一个脚本文件支持所有的s e d
 命令,例如:sed -f myscript.sed input_file,这里m y s c r i p t . s e d即为支持s e d命令的文件。
2、使用sed在文件中查询文本的方式
 s e d浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
 1) 使用行号,可以是一个简单数字,或是一个行号范围。
 2) 使用正则表达式
    使用s e d在文件中定位文本的方式
  x x为一行号,如1
  x , y 表示行号范围从x到y,如2,5表示从第2行到第5行
  / p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]/
  / p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s /
  p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3
  x , / p a t t e r n / 通过行号和模式查询匹配行。3 . / v d u /
  x , y ! 查询不包含指定行号x和y的行。1 , 2 !
3、基本sed编辑命令
    sed编辑命令
  p 打印匹配行
  = 显示文件行号
  a \ 在定位行号后附加新文本信息
  i \ 在定位行号后插入新文本信息
  d 删除定位行
  c \ 用新文本替换定位文本
  s 使用替换模式替换相应模式
  r 从另一个文件中读文本
  w 写文本到一个文件
  q 第一个模式匹配完成后推出或立即推出
  l 显示与八进制A S C I I代码等价的控制字符
  { } 在定位行执行的命令组
  n 从另一个文件中读文本下一行,并附加在下一行
  g 将模式2粘贴到/pattern n/
  y 传送字符
  n 延续到下一输入行;允许跨行的
4、sed和正则表达式
  sed识别任何基本正则表达式和模式及其行匹配规则
5、基本sed编程举例
  使用p(rint)显示行:
  p r i n t命令格式为[ a d d r e s s [,a d d r e s s ] P。显示文本行必须提供s e d命令行号。
   sed -n '2p' quote.txt
  显示从2到4行
   sed -n '2,4p' url_access_detail.txt
 
  打印模式:
   sed -n '/1028f/p' url_access_detail.txt
   sed -n '/\/\?1028f/p' url_access_detail.txt
  
  使用模式和行号进行查询:
   只在第4行查询
    sed -n '4,/\/\?1028f/'p url_access_detail.txt
   
  显示整个文件:
   只需将行范围设为第一行到最后一行1 , $。$意为最后一行:
   sed -n '1,$p' quote.txt
  
  任意字符:
    匹配任意字母,后跟任意字母的0次或多次重复,并以i n g结尾,模式为/ . * i n g /。可以使用
 这个模式查询以i n g结尾的任意单词
   sed -n '/.*ing/'p quote.txt
  
  打印行号:
  要打印行号,使用等号=。打印模式匹配的行号,使用格式/pattern/=。
   sed -e '/music/=' quote.txt
  (不过这些好像在linux里面不支持)
 
  附加文本:
  sed -n  '/1028f/'p  url_access_detail.txt |sed '/h/ a\then haha'
  在前面添加,用i\
  替换,用c\
  删除,用d\
6、替换文本
  替换命令用替换模式替换指定模式,格式为:
   [ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
  s选项通知s e d这是一个替换操作,并查询p a t t e r n - t o - f i n d,成功后用r e p l a c e m e n t - p a t t e r n替
 换它。
  g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
  p 缺省s e d将所有被替换行写入标准输出,加p选项将使- n选项无效。- n选项不打印输出
 结果。
  w 文件名使用此选项将输出定向到一个文件。
   sed 's/haha/hehe/g w a.out' quote.txt
  
  使用替换修改字符串:
  如果要附加或修改一个字符串,可以使用( &)命令,&命令保存发现模式以便重新调用
 它,然后把它放在替换字符串里面。这里给出一个修改的设计思路。先给出一个被替换模式,
 然后是一个准备附加在第一个模式后的另一个模式,并且后面带有&,这样修改模式将放在
 匹配模式之前。例如, s e d语句s/nurse/"Hello"&/p 的结果如下
  sed 's/nurse/"Hello" &/p' quote.txt
 比如原来的句子为: The nurse come from china.
 替换后的句子为:  The "Hello" nurse come from china.
7、从文件中读文本
  处理文件时, s e d允许从另一个文件中读文本,并将其文本附加在当前文件。此命令放在
 模式匹配行后,格式为:address r filename
  sed '/companty/r append.txt' quote.txt
8、显示文件中的控制字符
  s e d格式为:
  [ a d d r e s s,[ a d d r e s s ] ] l
  sed '1,$1' quote.txt
  (linux 不支持)
9、处理报文输出
  比如有如下输出:
   Database Size DateCreated
   ----------------------------
   newlog  2289 12/11/2005
   mysql   1909 09/12/2005
  
   (2 row affected)
  
  为了使用上述输出信息做进一步自动处理,需要知道所存数据库名称,为此需执行以下操作:
  1) 使用s / - * / / g删除横线- - - - - -。
  2) 使用/ ^ $ / d删除空行。
  3) 使用$ d删除最后一行
  4) 使用1 d删除第一行。
  5) 使用awk {print $1}打印第一列。
  命令如下,这里使用了c a t,并管道传送结果到s e d命令 
  最后的命令如下:
   cat sql.txt| sed 's/-*//g'|sed '/^$//g'|sed '$d'|sed '1d'|awk '{print $1}'
  
  去除行首数字:
   sed 's/^[0-9]//g' data.txt
  
10、一些常用的处理
  ‘s / \ . $ / / g’ 删除以句点结尾行
  ‘-e /abcd/d’ 删除包含a b c d的行
  ‘s / [ ] [ ] [ ] * / [ ] / g’ 删除一个以上空格,用一个空格代替
  ‘s / ^ [ ] [ ] * / / g’ 删除行首空格
  ‘s / \ . [ ] [ ] * / [ ] / g’ 删除句点后跟两个或更多空格,代之以一个空格
  ‘/ ^ $ / d’ 删除空行
  ‘s / ^ . / / g’ 删除第一个字符
  ‘s /CO L \ ( . . . \ ) / / g’ 删除紧跟C O L的后三个字母
  ‘s / ^ \ / / / g’ 从路径中删除第一个\
  ‘s / [ ] / [ ] / / g’ 删除所有空格并用t a b键替代
  ‘S / ^ [ ] / / g’ 删除行首所有t a b键
  ‘s / [ ] * / / g’ 删除所有t a b键
================================合并与分割==========================
sort uniq join cut paste split
  ================sort用法=====================
 sort命令将许多不同的域按不同的列顺序分类。
1、sort选项
 sort命令的一般格式为:
  sort -cmu -o output_file [other options] +pos1 +pos2 input_files
  下面简要介绍一下s o r t的参数:
  -c 测试文件是否已经分类。
  -m 合并两个分类文件。
  -u 删除所有复制行。
  -o 存储s o r t结果的输出文件名。
  其他选项有:
  -b 使用域进行分类时,忽略第一个空格。
  -n 指定分类是域上的数字分类。
  -t 域分隔符;用非空格或t a b键分隔域。
  -r 对分类次序或比较求逆。
  +n n为域号。使用此域号开始分类。
  n n为域号。在分类比较时忽略此域,一般与+ n一起使用。
  post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。
2、sort启动方式
  缺省情况下, s o r t认为一个空格或一系列空格为分隔符。要加入其他方式分隔,使用- t选项。
  sort执行时,先查看是否为域分隔设置了- t选项,如果设置了,则使用它来将记录分隔成域0、域1等等;
 如果未设置,用空格代替。缺省时s o r t将整个行排序,指定域号的情况例外。
  关于s o r t的一个重要事实是它参照第一个域作为域0,域1是第二个域,等等。
3、文件是否已分类
  sort -c data.txt
4、sort分类求逆
 如果要逆向s o r t结果,使用-r选项。
   sort -t: -r video.txt
5、按指定域分类
 有时需要只按第2域(分类键1)分类。
  sort -t: +1 video.txt
6、数值域分类
 用-n选项。必须用,不然得不到想要的结果。
  sort -t: +3n video.txt
7、唯一性分类
 使用- u选项进行唯一性(不重复)分类以去除重复行。
8、使用k的其他sort方法
 sort还有另外一些方法指定分类键。可以指定k选项。
  sort -t: -k4 video.txt
 
 使用k做分类键排序: 
 可以指定分类键次序。先以第4域,再以第1域分类,命令为-k4 -k1
  sort -t: -k4 -k1 video.txt
9、指定sort序列
 可以指定分类键顺序,也可以使用- n选项指定不使用哪个分类键进行查询。看下面的sort命令:
  sort +0 -2 +3
 该命令意即开始以域0分类,忽略域2,然后再使用域3分类。
10、pos用法
 指定开始分类的域位置的另一种方法是使用如下格式:
  sort  +filed.characterin
 意即从filed开始分类,但是要在此域的第characterin个字符开始。
11、使用head和tail将输出分类
  可以使用h e a d或t a i l查阅任何大的文本文件
  head -200 filename
12、awk使用sort输出结果
13、将两个分类文件合并
  将文件合并前,它们必须已被分类.
  使用-m +0。将这个文件并入已存在的分类文件v i d e o . s o r t,要以名称域进行分类,实际上没有必要加入+ o,但为了保险起见,还是加上的好。
   sort -t: -m +0 video2.txt video.sort
  
   ===================uniq用法====================
  uniq用来从一个文本文件中去除或禁止重复行。一般u n i q假定文件已分类,并且结果正确。
  sort的唯一性选项去除所有重复行,而uniq命令并不这样做。重复行是什么?在uniq里意即持续不断重复出现的行,中间不夹杂任何其他文本.
  命令一般格式:
   uniq -u d c -f inputfile outputfile
  其选项含义:
   -u 只显示不重复行。
   -d 只显示有重复数据行,每种重复行只显示其中一行
   -c 打印每一重复行出现次数。
   -f n为数字,前n个域被忽略。
   一些系统不识别- f选项,这时替代使用- n。
  对特定域进行测试:
  使用- n只测试一行一部分的唯一性。例如- 5意即测试第5域后各域唯一性。域从1开始记数。
 如果忽略第1域,只测试第2域唯一性,使用- n 2,下述文件包含一组数据,其中第2域代表组代码。
   uniq -f2 parts.txt或
   uniq -n2 parts.txt
  ==================join用法(强大呀,像sql里面的join 呢)========================
 join用来将来自两个分类文本文件的行连在一起。
 下面讲述join工作方式。这里有两个文件f i l e 1和f i l e 2,当然已经分类。每个文件里都有一
些元素与另一个文件相关。由于这种关系, join将两个文件连在一起,这有点像修改一个主文
件,使之包含两个文件里的共同元素。
 为有效使用join,需分别将输入文件分类:
 join的格式:
  join [option] file1,file2
  an n 为一数字,用于连接时从文件n中显示不匹配行。例如, -a1显示第一个文件的不匹
 配行,- a2为从第二个文件中显示不匹配行。
  o n.m n为文件号,m为域号。1.3表示只显示文件1第三域,每个n,m必须用逗号分隔,
 如1.3,2.1。
  j n m   n为文件号,m为域号。使用其他域做连接域
  t  域分隔符。用来设置非空格或t a b键的域分隔符。例如,指定冒号做域分隔符- t:
 
 连接域为域0,缺省join删除或去除连接键的第二次重复出现:
   join names.txt town.txt
 1、不匹配连接,下面的例子显示匹配及不匹配域
   join -a1 -a2 names.txt town.txt
  只显示第一个文件中不匹配行:
   join -a1 names.txt town.txt
 2、选择性连接
 使用- o选项选择连接域。例如要创建一个文件仅包含人名及城镇, j o i n执行时需要指定显示域。方式如下:
 使用1 . 1显示第一个文件第一个域,2 . 2显示第二个文件第二个域,其间用逗号分隔。命令为:
   join -o 1.1,2.2 names.txt town.txt
 使用-jn m进行其他域连接,例如用文件1域3和文件2域2做连接键,命令为:
   join -j1 3 -j2 2 names.txt town.txt
 
 ===========================cut用法=========================================
 cut用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
 cut一般格式为:
 cut [options] file1 file2
 下面介绍其可用选项:
 -c list 指定剪切字符数。
 -f field 指定剪切域数。
 -d 指定与空格和t a b键不同的域分隔符。
 -c 用来指定剪切范围,如下所示:
 -c 1,5-7 剪切第1个字符,然后是第5到第7个字符。
 -c1-50 剪切前5 0个字符。
 -f 格式与- c相同。
 -f 1,5 剪切第1域,第5域。
 - f 1,10-12 剪切第1域,第1 0域到第1 2域。
 
 剪切指定域:
 cut命令中剪切各域需用逗号分隔,如剪切域1和3,可以使用:
  cut -d: -f1,3 pers
 
 =========================paste用法==========================================
  cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴
 起来形成相关文件。粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。
  paste将按行将不同文件行信息放在一行。缺省情况下,paste连接时,用空格或t a b键分隔
 新行中不同文本,除非指定- d选项,它将成为域分隔符。
  paste格式为;
   paste -d -s -file1 file2
 选项含义如下:
  -d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。
  -s 将每个文件合并成行而不是按行粘
 
 paste命令管道输入:
 paste命令还有一个很有用的选项( -)。意即对每一个( -),从标准输入中读一次数据。
 使用空格作域分隔符,以一个4列格式显示目录列表。方法如下:
   ls |paste -d":" - - - -
 =========================split用法==========================================
  split用来将大文件分割成小文件。
 
 split -output_file-size input-filename output-filename
 每个文件格式为x [ a a ]到x [ z z ],x为文件名首字母, [ a a ]、[ z z ]为文件名剩余部分顺序字符组合.
   split -5000 url_access_user.txt splitfile
阅读(5011) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-01-18 17:08:54

网上关于JOIN的用法资料怎么那么少~