Chinaunix首页 | 论坛 | 博客
  • 博客访问: 132484
  • 博文数量: 28
  • 博客积分: 527
  • 博客等级: 中士
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-09 17:05
个人简介

运维开发工程师。致力于网络,WEB应用服务,Linux系统运维。方向:操作系统,监控,自动化

文章分类

全部博文(28)

文章存档

2013年(12)

2012年(16)

分类: Python/Ruby

2012-12-30 13:29:16

导论
sort是shell编程里排序的首选,它将输入行按参照键值和数据类型,以locale排序。
sort后经常面临去重的需求,接着介绍uniq的用法。
最后,提一下wc字数统计工具的用法。
sort和uniq都是管道命令

sort用法
command
  1. sort option input_files
sort将input_files顺次读入,默认按照ASCII顺序排序记录,输出到stdout。
Write sorted concatenation of all FILE(s) to standard output.
选项(较重要的)
-t 默认用空白间隔字段,并按照第一字段为参照键值进行排序,-t指定分隔符;
-k 配合-t使用,指定排序的参照键值范围,-kn.m,p.q,即指定第n个字段的第m个字符开始,到第p个字段的第q个字符为止;
-r 反序
-c 检查是否排序,若是文件是乱序的,返回值为非0
-n 数字排序
-u 去重,只输出一次相同键值的记录


举例
-t,-k:指定字段排序
  1. $ sort -t':' -k3,3 /etc/passwd #用uid排序,注意排序顺序
  2. #等效 sort -t ':' -k3 /etc/passwd
  3. uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
  4. pegasus:x:100:500:tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin
  5. operator:x:11:0:operator:/root:/sbin/nologin
  6. games:x:12:100:games:/usr/games:/sbin/nologin
  7. gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
  8. ftp:x:14:50:FTP User:/:/sbin/nologin
  9. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  10. nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

-k:组合字段排序
  1. $ sort -t':' -k 1.2,1.3 /etc/passwd #用第一个字段username的第二个字符和第三个字符排序
  2. ma:x:527:528::/home/ma:/bin/bash
  3. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  4. baiy:x:515:517::/home/baiy:/bin/bash
  5. mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
  6. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

-k:指定字符范围排序
-n:用数字排序
  1. $ sort -t':' -k3n -k4n /etc/passwd|less #先用uid排序,再用gid排序,注意这里按照数字排序
  2. landscape:x:102:108::/var/lib/landscape:/bin/false
  3. sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
  4. postgres:x:104:113:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
  5. mysql:x:105:114:MySQL Server,,,:/var/lib/mysql:/bin/false
  6. work:x:1000:1000:work,,,:/home/work:/bin/bash

-u:去重记录
注意:uniq也可以达到一样的效果,稍后介绍
  1. $ sort -u sort.txt #sort去重,去重以整条记录为单位
  2. ---- #inputfile
  3. sort.txt
  4. aber 200
  5. aber 200
  6. aber 200
  7. aber 201
  8. aber 400
  9. ---- #output
  10. aber 200
  11. aber 201
  12. aber 400
-r:反序,不多赘述。

sort不稳定
#相同的顺序输入记录是否输出也保持原样?
  1. $ sort -t'_' -k1,1 -k2,2 < #here-document可以视作一个文件
  2. > o_t
  3. > o_t_three
  4. > o_t_four
  5. > o_t_five
  6. > EOF
  7. o_t
  8. o_t_five
  9. o_t_four
  10. o_t_three
----------------------------------------------------------------------
uniq用法
command
  1. uniq option input_files
对连续且相同的记录去重,只保留一行,写入标准输出
Discard all but one of successive identical lines from INPUT (or standard input), writing to OUTPUT (or standard output).


举例
默认行为:uniq不会把所有的行去重,只会去重连续相同的行。
  1. $ uniq uniq.txt
  2. tres
  3. unus
  4. duo
  5. tres
  6. duo
  7. tres
配合sort:因此要配合sort,先把相同的记录归并在一起,去重
  1. $ sort uniq.txt | uniq
  2. duo
  3. tres
  4. unus
-c计数:在每个输出前加上重复的次数
  1. $ sort uniq.txt | uniq -c
  2. 4 duo
  3. 3 tres
  4. 1 unus
-d显示重复的行:只显示重复的行
  1. $ sort uniq.txt | uniq -d
  2. duo
  3. tres
-u显示从未重复的行:在取单值时候非常有效
  1. $ sort uniq.txt | uniq -u
  2. unus
-i不区分大小写,暂不举例


样例文件
  1. $ cat uniq.txt
  2. tres
  3. unus
  4. duo
  5. duo
  6. duo
  7. tres
  8. duo
  9. tres

-----------------------------------
wc用法
command
wc读入一批文件,产出字数报告,顺序产出-l(行数),-w(单词字数),-c(字节数:通常就是字符数)
  1. $ wc uniq.txt
  2. 9 9 40 uniq.txt
  3. #行数 词数 字节数
  4. $ ls -l uniq.txt
  5. -rw-rw-r--  1 lordzzr lordzzr 40 Dec 30 15:53 uniq.txt #字节数和文件大小是一致的

其中,换行符也算在里面:
  1. $ echo abc | wc -c
  2. 4 #隐含了'\n'
  3. $ echo -n abc | wc -c
  4. 3

awk关于wc的一种实现:(见awk篇)
  1. $ awk '{count+=length($0)+1;word+=NF } END{ print NR , word , count }' plain.txt
  2. #length($0)计算整个行的字符数,+1算上换行符;
阅读(1319) | 评论(0) | 转发(0) |
0

上一篇:源码安装ruby

下一篇:009-head和tail

给主人留下些什么吧!~~