Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19699136
  • 博文数量: 679
  • 博客积分: 10495
  • 博客等级: 上将
  • 技术积分: 9308
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-18 10:51
文章分类

全部博文(679)

文章存档

2012年(5)

2011年(38)

2010年(86)

2009年(145)

2008年(170)

2007年(165)

2006年(89)

分类:

2006-07-27 14:57:48

本章内容有:
• 实用的分类(sort)操作。
• uniq。
• join。
• cut。
• paste。
• split。

11.1 sort用法
sort命令的一般格式为:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面简要介绍一下sort的参数:
-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
个字符开始。



基本sort
sort -t: seg.txt
sort分类求逆
sort -t: -r seg.txt
按指定域分类   sort +9 seg.txt  按照第10列来排序(字符顺序)
数值域分类   sort +0n seg.txt   按照第1列的数字大小来排序
使用- u选项去除重复行

使用实例:

比如有如下文件:

 

[root@MD_90_22 bin]# vi test

 

   10061    2575617 300318-014640 241187940  53755056 6030   2 MPEG4-PS

 8399474 2150265363 300318-014640 241193970  65424832 6030   2 MPEG4-PS

 8399537 2150281477 300318-014640 240000000  65100604 6000   2 MPEG2-PS

   10060    2575373 300318-014640 241193970  65423496 6030   2 MPEG4-PS

 8399467 2150263558 300318-014640 241200000 134432220 6030   2 MPEG2-TS

 8399464 2150262785 300318-014640 31633740   8513976 1035   2 MPEG4-PS

  439496  112510976 300318-014640 240635200  67449152 8048   2 MPEG4-TS

 8399465 2150263044 300318-014640 215360000  60488624 5384   2 MPEG4-TS

  484571  124050176 300318-014640 240635200  67449152 8048   2 MPEG4-TS

 8398621 2150046979 300318-014640 241048868  64734527 9157   2 MPEG4-PS

 8398620 2150046722 300318-014640 240199245  72871244 6435   2 MPEG2-TS

 8398620 2150046720 300318-014640 241265752  73071088 6253   2 MPEG2-TS

 8398618 2150046214 300318-014640 97027167  26463109 3173   2 MPEG4-PS

 8399537 2150281481 300318-014640 240000000  65104048 6000   2 MPEG2-PS

 8399467 2150263552 300318-014640 241120000 134398944 6028   2 MPEG2-TS

 8399474 2150265355 300318-014640 241193970  65424156 6030   2 MPEG4-PS

   10063    2576128 300318-014640 240299571  65265662 7881   2 MPEG4-PS

  527000  134912001 300318-014640 240478975  67841076 8063   2 MPEG4-TS

 8399474 2150265354 300318-014640 241193970  65424464 6030   2 MPEG4-PS

 

测试它是否排序ok

 

[root@MD_90_22 bin]# sort -c test

sort: test:4: disorder:    10060    2575373 300318-014640 241193970  65423496 6030   2 MPEG4-PS

 

表示从第4行开始不符合排序规则,它的排序是以第一行为基准的,以其他行排序,它未必能检测出来

下面对之进行默认的排序,排序是以第一行为基准的.等同于

[root@MD_90_22 bin]# sort test

   10060    2575373 300318-014640 241193970  65423496 6030   2 MPEG4-PS

   10061    2575617 300318-014640 241187940  53755056 6030   2 MPEG4-PS

   10063    2576128 300318-014640 240299571  65265662 7881   2 MPEG4-PS

  439496  112510976 300318-014640 240635200  67449152 8048   2 MPEG4-TS

  484571  124050176 300318-014640 240635200  67449152 8048   2 MPEG4-TS

  527000  134912001 300318-014640 240478975  67841076 8063   2 MPEG4-TS

 8398618 2150046214 300318-014640 97027167  26463109 3173   2 MPEG4-PS

 8398620 2150046720 300318-014640 241265752  73071088 6253   2 MPEG2-TS

 8398620 2150046722 300318-014640 240199245  72871244 6435   2 MPEG2-TS

 8398621 2150046979 300318-014640 241048868  64734527 9157   2 MPEG4-PS

 8399464 2150262785 300318-014640 31633740   8513976 1035   2 MPEG4-PS

 8399465 2150263044 300318-014640 215360000  60488624 5384   2 MPEG4-TS

 8399467 2150263552 300318-014640 241120000 134398944 6028   2 MPEG2-TS

 8399467 2150263558 300318-014640 241200000 134432220 6030   2 MPEG2-TS

 8399474 2150265354 300318-014640 241193970  65424464 6030   2 MPEG4-PS

 8399474 2150265355 300318-014640 241193970  65424156 6030   2 MPEG4-PS

 8399474 2150265363 300318-014640 241193970  65424832 6030   2 MPEG4-PS

 8399537 2150281477 300318-014640 240000000  65100604 6000   2 MPEG2-PS

 8399537 2150281481 300318-014640 240000000  65104048 6000   2 MPEG2-PS

 

可以使用-r 逆向排序:

[root@MD_90_22 bin]# sort -r test

 8399537 2150281481 300318-014640 240000000  65104048 6000   2 MPEG2-PS

 8399537 2150281477 300318-014640 240000000  65100604 6000   2 MPEG2-PS

 8399474 2150265363 300318-014640 241193970  65424832 6030   2 MPEG4-PS

 8399474 2150265355 300318-014640 241193970  65424156 6030   2 MPEG4-PS

 8399474 2150265354 300318-014640 241193970  65424464 6030   2 MPEG4-PS

 8399467 2150263558 300318-014640 241200000 134432220 6030   2 MPEG2-TS

 8399467 2150263552 300318-014640 241120000 134398944 6028   2 MPEG2-TS

 8399465 2150263044 300318-014640 215360000  60488624 5384   2 MPEG4-TS

 8399464 2150262785 300318-014640 31633740   8513976 1035   2 MPEG4-PS

 8398621 2150046979 300318-014640 241048868  64734527 9157   2 MPEG4-PS

 8398620 2150046722 300318-014640 240199245  72871244 6435   2 MPEG2-TS

 8398620 2150046720 300318-014640 241265752  73071088 6253   2 MPEG2-TS

 8398618 2150046214 300318-014640 97027167  26463109 3173   2 MPEG4-PS

  527000  134912001 300318-014640 240478975  67841076 8063   2 MPEG4-TS

  484571  124050176 300318-014640 240635200  67449152 8048   2 MPEG4-TS

  439496  112510976 300318-014640 240635200  67449152 8048   2 MPEG4-TS

   10063    2576128 300318-014640 240299571  65265662 7881   2 MPEG4-PS

   10061    2575617 300318-014640 241187940  53755056 6030   2 MPEG4-PS

将其进行排序在进行判断:

[root@MD_90_22 bin]# sort test > test_sort

[root@MD_90_22 bin]# test -c test_sort

 

 

-t 使用的分隔符,默认情况下使用空格分隔,这个主要适用于不采用首列排序的情况

如下表示 以第3列,按字符顺序排序,这里有点纳闷,1居然排在11后面?

[root@MD_90_22 bin]# sort -t: +2 /etc/passwd

root:x:0:0:root:/root:/bin/bash

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

bin:x:1:1:bin:/bin:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

 

上面的使用的是文本域, 以下使用数值域:

[root@MD_90_22 bin]# sort  +3n test

 8399464 2150262785 300318-014640 31633740   8513976 1035   2 MPEG4-PS

 8398618 2150046214 300318-014640 97027167  26463109 3173   2 MPEG4-PS

 8399465 2150263044 300318-014640 215360000  60488624 5384   2 MPEG4-TS

 8399537 2150281477 300318-014640 240000000  65100604 6000   2 MPEG2-PS

 8399537 2150281481 300318-014640 240000000  65104048 6000   2 MPEG2-PS

 8398620 2150046722 300318-014640 240199245  72871244 6435   2 MPEG2-TS

   10063    2576128 300318-014640 240299571  65265662 7881   2 MPEG4-PS

  527000  134912001 300318-014640 240478975  67841076 8063   2 MPEG4-TS

  439496  112510976 300318-014640 240635200  67449152 8048   2 MPEG4-TS

  484571  124050176 300318-014640 240635200  67449152 8048   2 MPEG4-TS

 8398621 2150046979 300318-014640 241048868  64734527 9157   2 MPEG4-PS

 8399467 2150263552 300318-014640 241120000 134398944 6028   2 MPEG2-TS

   10061    2575617 300318-014640 241187940  53755056 6030   2 MPEG4-PS

   10060    2575373 300318-014640 241193970  65423496 6030   2 MPEG4-PS

 8399474 2150265354 300318-014640 241193970  65424464 6030   2 MPEG4-PS

 8399474 2150265355 300318-014640 241193970  65424156 6030   2 MPEG4-PS

 8399474 2150265363 300318-014640 241193970  65424832 6030   2 MPEG4-PS

 8399467 2150263558 300318-014640 241200000 134432220 6030   2 MPEG2-TS

 8398620 2150046720 300318-014640 241265752  73071088 6253   2 MPEG2-TS

 

  使用-k, 则从1开始排序.

[root@MD_90_22 bin]# sort  -k +4n test

 8399464 2150262785 300318-014640 31633740   8513976 1035   2 MPEG4-PS

 8398618 2150046214 300318-014640 97027167  26463109 3173   2 MPEG4-PS

 8399465 2150263044 300318-014640 215360000  60488624 5384   2 MPEG4-TS

 8399537 2150281477 300318-014640 240000000  65100604 6000   2 MPEG2-PS

 8399537 2150281481 300318-014640 240000000  65104048 6000   2 MPEG2-PS

 8398620 2150046722 300318-014640 240199245  72871244 6435   2 MPEG2-TS

   10063    2576128 300318-014640 240299571  65265662 7881   2 MPEG4-PS

  527000  134912001 300318-014640 240478975  67841076 8063   2 MPEG4-TS

  439496  112510976 300318-014640 240635200  67449152 8048   2 MPEG4-TS

  484571  124050176 300318-014640 240635200  67449152 8048   2 MPEG4-TS

 8398621 2150046979 300318-014640 241048868  64734527 9157   2 MPEG4-PS

 8399467 2150263552 300318-014640 241120000 134398944 6028   2 MPEG2-TS

   10061    2575617 300318-014640 241187940  53755056 6030   2 MPEG4-PS

   10060    2575373 300318-014640 241193970  65423496 6030   2 MPEG4-PS

 8399474 2150265354 300318-014640 241193970  65424464 6030   2 MPEG4-PS

 8399474 2150265355 300318-014640 241193970  65424156 6030   2 MPEG4-PS

 8399474 2150265363 300318-014640 241193970  65424832 6030   2 MPEG4-PS

 8399467 2150263558 300318-014640 241200000 134432220 6030   2 MPEG2-TS

 8398620 2150046720 300318-014640 241265752  73071088 6253   2 MPEG2-TS

 

另外 –num 则表示忽略这列的排序

 

Unix下面可以采用 –m来合并文件

 



11.2 系统sort

cat /etc/passwd| sort  -t: +0 |awk -F":" '{print $1}' 按字母顺序打印用户名,这里awk$1表示第一列。

[root@Meil_88 root]# df -ah | sort -r +4n
usbdevfs                 0     0     0   -  /proc/bus/usb
none                  505M     0  505M   0% /dev/shm
none                     0     0     0   -  /proc
none                     0     0     0   -  /dev/pts
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda3             218G   13G  194G   7% /opt
/dev/hda3             218G   13G  194G   7% /home/bbca/vod
/dev/sdb1             230G   43G  176G  20% /home/bbca/oss_database2
/dev/hdc1             230G  144G   75G  66% /home/bbca/software
/dev/hda1             9.9G  6.9G  2.5G  74% /
/dev/sda1             230G  200G   18G  92% /home/bbca/oss_database1

11.3 uniq用法
命令一般格式:
其选项含义:
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-f n为数字,前n个域被忽略。
一些系统不识别- f选项,这时替代使用- n。

uniq 只将连续的重复行视为重复,暂略
11.4 join用法
暂略

11.5 cut用法
c u t用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
下一节将介绍粘贴用法。
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 -d: -f1 /etc/passwd 提取第一行
[root@Meil_88 root]#  cut -d: -f 1,3 /etc/passwd
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
以上提取了域1和域3
其他功能暂略

11.6 paste用法
paste 格式为;
paste -d -s -file1 file2
选项含义如下:
-d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。


paste命令管道输入
每行显示2个文件
[root@MD_100_22 bin]# ls | paste -d" " - -
agent-t aum
aum.bak board_mng
bootUtil channelUtil
效果等同于: ls | paste  - -

其他暂略

11.7 split用法
split 命令一般格式:
split -output_file-size input-filename output-filename

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