[转帖]linux学习--sed,sort,uniq,join,cut,paste,split_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3656 | 回复: 0   主题: [转帖]linux学习--sed,sort,uniq,join,cut,paste,split        下一篇 
zhou
注册用户
等级:中校
经验:2210
发帖:125
精华:6
注册:2012-11-19
状态:离线
发送短消息息给zhou 加好友    发送短消息息给zhou 发消息
发表于: IP:您无权察看 2012-11-27 10:52:33 | [全部帖] [楼主帖] 楼主

linux学习--sed,sort,uniq,join,cut,paste,split
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


该贴被zhou编辑于2012-11-27 10:53:51




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论