linux sort 命令详解(转载)

转载:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html#3374576

前言

sort是当Linux里老常用之一个令,管排序的,集中精力,五分钟将定sort,现在开头!

1 sort的做事原理

 

sort将文件之各国一样实行作为一个单位,相互比较,比较准是自从首字符向后,依次按ASCII码值进行比较,最后将他们仍升序输出。

[rocrocket@rocrocket programming]$ cat seq.txt
banana
apple
pear
orange
[rocrocket@rocrocket programming]$ sort seq.txt
apple
banana
orange
pear

2 sort的-u选项

它的企图很粗略,就是当输出行中去除重复行。

[rocrocket@rocrocket programming]$ cat seq.txt
banana
apple
pear
orange
pear
[rocrocket@rocrocket programming]$ sort seq.txt
apple
banana
orange
pear
pear
[rocrocket@rocrocket programming]$ sort -u seq.txt
apple
banana
orange
pear

pear由于还让-u选项无情之勾了。

3 sort的-r选项

sort默认的排序方式是升序,如果想改化降序,就加个-r就干定矣。

[rocrocket@rocrocket programming]$ cat number.txt
1
3
5
2
4
[rocrocket@rocrocket programming]$ sort number.txt
1
2
3
4
5
[rocrocket@rocrocket programming]$ sort -r number.txt
5
4
3
2
1

4 sort的-o选项

出于sort默认是将结果输出及标准输出,所以用用重定向才会以结果写副文件,形如sort
filename > newfile。

然,如果您想拿排序结果输出到原来文件中,用重定向而就是够呛了。

[rocrocket@rocrocket programming]$ sort -r number.txt >
number.txt
[rocrocket@rocrocket programming]$ cat number.txt
[rocrocket@rocrocket programming]$
看,竟然将number清空了。

纵使于这时段,-o选项出现了,它成之化解了之问题,让您放心的用结果写副原文件。这说不定也是-o比重定向的绝无仅有优势所当。

[rocrocket@rocrocket programming]$ cat number.txt
1
3
5
2
4
[rocrocket@rocrocket programming]$ sort -r number.txt -o number.txt
[rocrocket@rocrocket programming]$ cat number.txt
5
4
3
2
1

5 sort的-n选项

您发出无出碰到了10较2不怎么的状态。我左右逢了。出现这种情景是出于排序程序将这些数字以字符来排序了,排序程序会先比较1暨2,显然1有些,所以就以10位于2前面喽。这为是sort的一贯作风。

俺们设想改变这种现状,就要动用-n选项,来喻sort,“要因为数值来排序”!

[rocrocket@rocrocket programming]$ cat number.txt
1
10
19
11
2
5
[rocrocket@rocrocket programming]$ sort number.txt
1
10
11
19
2
5
[rocrocket@rocrocket programming]$ sort -n number.txt
1
2
5
10
11
19

6 sort的-t选项和-k选项

比方发生一个文本之情节是这么:

[rocrocket@rocrocket programming]$ cat facebook.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

此文件发出三列,列与列次用冒号隔开了,第一列表示水果项目,第二排表示水果数量,第三列表示水果价格。

那我思念坐水果数量来排序,也就是为第二排来排序,如何以sort实现?

多亏,sort提供了-t选项,后面可以设定间隔符。(是勿是想起了cut和paste的-d选项,共鸣~~)

点名了间隔符之后,就足以用-k来指定列数了。

[rocrocket@rocrocket programming]$ sort -n -k 2 -t : facebook.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3

咱俩下冒号作为间隔符,并针对性第二列来进展数值升序排序,结果十分乐意。

7 其他的sort常因此选项

-f会将小写字母都换为深写字母来开展比,亦即忽略大小写

-c会检查文件是否就清除好程序,如果乱序,则输出第一单乱序的尽之相干信息,最后回来1

-C会检查文件是否已解好程序,如果乱序,不出口内容,仅返回1

-M会以月份来排序,比如JAN小于FEB等等

-b会忽略每一行前面的拥有空白部分,从第一单可见字符开始于。

有时候学习脚本,你晤面发现sort命令后面与了一致堆类似-k1,2,或者-k1.2
-k3.4之东东,有些匪夷所想。今天,我们就来整治定它—-k选项!

1 准备材料

$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

 

首先个域是店铺称,第二个域是店人,第三个域是员工平均工资。(除了公司名称,其他的别信,都瞎写的^_^)

2
我思念让这个文件随号之假名逐一排序,也不怕是准第一个域进行排序:(这个facebook.txt文件发出三个域)

$ sort -t ‘ ‘ -k 1 facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

见状了咔嚓,就直用-k 1设定就好了。(其实这里并无严加,稍后你就见面理解)

3 我眷恋让facebook.txt按照企业人排序

$ sort -n -t ‘ ‘ -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

未用解释,我深信您可知懂。

唯独,此处出现了问题,那便是baidu和sohu的店人相同,都是100人数,这个时候怎么处置也?按照默认规矩,是起第一个域开始进行升序排序,因此baidu排在了sohu前面。

4  我思念叫facebook.txt按照企业人破序
,人数相同之照员工平均工资升序排序:

$ sort -n -t ‘ ‘ -k 2 -k 3 facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

扣押,我们加了一个-k2
-k3即解决了问题。对滴,sort支持这种设定,就是说如果定域排序的优先级,先盖第2个域进行排序,如果同,再因第3个域进行排序。(如果你肯,可以一直这样形容下去,设定很多单排序优先级)

5
我思念叫facebook.txt按照员工工资降序排序,如果职工人数相同之,则以公司人升序排序:(这个有些难度了)

$ sort -n -t ‘ ‘ -k 3r -k 2 facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

这边有动了一些粗技巧,你仔细看,在-k
3后面偷偷加上了一个小写字母r。你想,再成我们齐一样篇文章,能获答案么?揭晓:r和-r选项之图是同一的,就是表示逆序。因为sort默认是仍升序排序的,所以这里需要加上r表示第三只处(员工平均工资)是以降序排序。此处你还得增长n,就表示对是地区进行排序时,要依数值大小进行排序,举个例吧:

$ sort -t ‘ ‘ -k 3nr -k 2n facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

看,我们错过丢了无限前方的-n选项,而是用它加入到了各一个-k挑中了。

6 -k选之切实语法格式

万一累于下深入的话,就不得不来点理论知识。你得了解-k选项之语法格式,如下:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][
Modifier ] ]

这个语法格式可以让内部的逗号(“,”)分为两挺组成部分,Start部分以及End部分。

先行让你灌输一个思考,那便是“如果不若定End部分,那么即便以为End被设定为行尾”。这个定义好重点之,但往往你切莫见面珍惜它们。

Start部分为由三局部构成,其中的Modifier部分就是咱事先说了之好像n和r的抉择项有。我们要说说Start部分的FStart和C.Start。

C.Start也是足以简简单单的,省略的语句就是代表于本域的开端部分开始。之前例子中之-k
2和-k 3就是大概了C.Start的例证喽。

FStart.CStart,其中FStart就是意味用的域,而CStart则象征在FStart域中打第几单字符开始算“排序首字符”。

同理,在End部分受,你可以设定FEnd.CEnd,如果你看看略.CEnd,则意味最终到“域尾”,即本域的末尾一个字符。或者,如果您拿CEnd设定也0(零),也是意味最终到“域尾”。

7 突发奇想,从公司英文名称的老二个字母开始展开排序:

$ sort -t ‘ ‘ -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000

看,我们运用了-k
1.2,这即代表针对第一个域的老二个字符开始至本域的末尾一个字符为止的字符串进行排序。你见面发觉baidu因为第二个假名是a而卓越。sohu和
google第二只字符都是o,但sohu的h在google的o前面,所以两者分别排在第二同老三。guge只能屈居第四了。

8
以突发奇想,,只针对公司英文名称的次只假名进行排序,如果同样的准员工工资进行降序排序:

$ sort -t ‘ ‘ -k 1.2,1.2 -k 3,3nr facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

是因为单独针对第二独假名进行排序,所以我们运用了-k
1.2,1.2底表示法,表示我们“只”对亚个假名进行排序。(如果你问问“我用-k
1.2怎么老?”,当然很,因为若省略了End部分,这就算表示你用对准自第二独字母起至本域最后一个字符为止的字符串进行排序)。对于员工工资进行排
序,我们也以了-k
3,3,这是极规范之发表,表示我们“只”对本域进行排序,因为一旦你省略了尾的3,就变成了我们“对第3只地面开始至最终一个域岗位的情进行排序”
了。

9 于modifier部分尚足以据此到怎么选项?

好就此到b、d、f、i、n 或 r。

内部n和r你必曾特别熟悉了。

b表示忽略本域的报到空白符号。

d表示对本域按照字典顺序排序(即,只考虑空白和字母)。

f表示对本域忽略大小写进行排序。

i表示忽略“不可打印字符”,只对可打印字符进行排序。(有些ASCII就是不足打印字符,比如\a是报警,\b是退格,\n是换行,\r是回车等等)

10 思考思考关于-k和-u联合使用的事例:

$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

就是极其原始之facebook.txt文件。

$ sort -n -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

$ sort -n -k 2 -u facebook.txt
guge 50 3000
baidu 100 5000
google 110 5000

当设定为公司员工域进行数值排序,然后加-u后,sohu一实行就是吃删除了!原来-u只认别用-k设定的域,发现相同,就用继承相同的行都删除。

$ sort  -k 1 -u facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

$ sort  -k 1.1,1.1 -u facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500

这个例子吗同理,开头字符是g的guge就从未幸免于难。

$ sort -n -k 2 -k 3 -u facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

哟!这里设置了点儿层排序优先级的景象下,使用-u就从不去除任何履行。原来-u是碰头衡量所有-k选项,将都平等的才见面去除,只要中有一级不同还无见面自由去的:)(不信教,你可好加一行sina
100 4500跃跃欲试看)

11 最好奇的排序:

$ sort -n -k 2.2,3.1 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

因为老二个域的次只字符开始交第三个域的首先个字符结束之一些进行排序。

率先推行,会领取0 3,第二执行提取00 5,第三执行提取00 4,第四实施提取10 5。

又因为sort认为0小于00小于000小于0000….

因此0 3毫无疑问是在首先单。10 5必然是于终极一个。但怎么00 5却在00
4前面为?(你得好开尝试思考一下。)

答案揭晓:原来“跨域的设定是独假象”,sort只会于第二个域的第二单字符到第二个域的末梢一个字符的一些,而未会见拿第三个域的初始字符纳入比较范围。当发现00以及00互动同时,sort就会见活动比第一个域去了。当然baidu在sohu前面了。用一个范例即可验证:

$ sort -n -k 2.2,3.1 -k 1,1r facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

12 有时光在sort命令后会见看+1 -2这些号,这是呀东东?

关于这种语法,最新的sort是这么进行分解的:

On older systems, `sort’ supports an obsolete origin-zero syntax
`+POS1 [-POS2]‘ for specifying sort keys.  POSIX 1003.1-2001 (*note
Standards conformance::) does not allow this; use `-k’ instead.

原来,这种古老的意味方法已经为淘汰了,以后好理直气壮的轻视使用这种代表法的脚本喽!

(为了防止古老脚本的存,在当下再度说一下这种代表方法,加号表示Start部分,减号表示End部分。最极端要害的一点凡是,这种艺术方法是从0开始计数的,以前所说的首先个域,在这为代表也第0只地段。以前的第2独字符,在是表示也第1单字符。明白?)

好文要顶 已关注 收藏该文 葡京签到送彩金 1
葡京签到送彩金 2

高并发时会面来在闹甚活跃用户量,用户大聚集之政工场景中,如:秒杀活动,定时领取红包等。

为了让工作好通的运行而给用户一个吓的互相体验,我们得依据业务场景预估达到的并发量等因素,来统筹符合自己事情场景的高并发处理方案。

当电商相关产品开发的这些年,我幸运的遇到了并发下的各种坑,这一块儿搜索爬滚打过来有着众多底血泪史,这里展开的总结,作为友好的存档记录,同时享受给大家。

服务器架设

作业自进化的首到逐步成熟,服务器架设也是从相对单一到集群,再届分布式服务。

一个可以支撑大产出的劳动少不了好的服务器架设,需要出均负载,数据库需要着力集群,nosql缓存需要着力集群,静态文件需要上传cdn,这些都是力所能及吃工作程序流畅运行的精靠山。

服务器这块多是要运维人员来配合搭建,具体我不怕非多说了,点交了。

横需要使用的服务器架设如下:

葡京签到送彩金 3

服务器

均衡负载(如:nginx,阿里云SLB)

资源监察

分布式

数据库

核心分离,集群

DBA 表优化,索引优化,等

分布式

nosql

基本分离,集群

redis

mongodb

memcache

cdn

html

css

js

image

起测试

高并发相关的作业,需要开展并发的测试,通过大气底数码解析评估出全架构可以支撑的并发量。

测试赛并作得行使第三正值服务器或者好测试服务器,利用测试工具进行并发请求测试,分析测试数据获得可以支撑起数量之评估,这个好当作一个预警参考,俗话说知己自彼百战未殆。

老三正在服务:

阿里云性能测试 

并发测试工具:

Apache JMeter

Visual Studio性能负载测试 Microsoft Web A

pplication Stress Tool

实战方案

通用方案

天用户流量异常,但是正如粗放,偶尔会发出用户高聚的景况; 

情景: 用户登录,用户核心,用户订单,等

劳动器架构图: 

说明:

气象被的这些事情骨干是用户进入APP后会见操作及之,除了活动日(618,双11,等),这些工作的用户量都无见面高集,同时这些事情有关的表都是好数据表,业务多是询问操作,所以我们用减小用户直接命中DB的询问;优先查询缓存,如果缓存不设有,再开展DB查询,将查询结果缓存起来。

更新用户相关缓存需要分布式存储,比如使用户ID进行hash分组,把用户分布到不同之复苏存着,这样一个缓存集合的总量不会见很十分,不见面潜移默化查询效率。

方案如:

用户登录获取积分 

计量起用户分布的key,redis hash中查找用户今日签到信息 

若是查询及签到消息,返回签到信息 

若无查询及,DB查询今日是否签到过,如果来签到了,就管签证到消息同步redis缓存。 

倘DB中呢从没询问到今天之记名记录,就展开签到逻辑,操作DB添加今签证到记录,添加签到积分(这所有DB操作是一个事务) 

缓存签到信息及redis,返回签到信息 

顾这里会出出现情况下之逻辑问题,如:一龙签到数,发放多次积分为用户。 

用户订单 

此地我们才缓存用户率先页的订单信息,一页40长条数据,用户一般为只有会看率先页的订单数据 

用户访问订单列表,如果是率先页读缓存,如果不是读DB 

计量起用户分布的key,redis hash中摸索用户订单信息 

如果查询及用户订单信息,返回订单信息 

设若未在就进行DB查询第一页的订单数,然后缓存redis,返回订单信息

用户基本 

计算产生用户分布之key,redis hash中寻觅用户订单信息 

倘查询及用户信息,返回用户信息 

万一非有进展用户DB查询,然后缓存redis,返回用户信息

任何工作 

上面例子多是针对性用户存储缓存,如果是公用的缓存数据需要注意有题目,如下 

专注公用的缓存数据需要考虑并发下的或会见促成大量命中DB查询,可以动用管理后台更新缓存,或者DB查询的锁住操作。 

以上例子是一个对立简便易行的高并发架构,并发量不是可怜高之景好十分好的支持,但是随着事情的扩充,用户并发量增加,我们的架构也会见进行连发的优化和嬗变,比如对准业务展开服务化,每个服务来和好之出现架构,自己的平均服务器,分布式数据库,nosql主从集群,如:用户服务、订单服务;

消息队列 

秒杀、秒抢等活动工作,用户在刹那间涌入产生高并发请求 

此情此景:定时领取红包,等

劳器架构图: 

葡京签到送彩金 4

说明:

场面被的定时领取是一个高并发的业务,像秒杀活动用户会于交点之时间涌入,DB瞬间即令承受到同样笔记暴击,hold不停止就是见面宕机,然后影响整个业务;

如这种不是只有查询的操作而会时有发生大产出的插入或者更新数据的作业,前面提到的通用方案便无法支撑,并发的早晚都是直接命中DB;

规划这块工作的上便会动信息队列的,可以用涉足用户之音讯补充加到消息队列中,然后再度写单多线程程序去吃队列,给班中的用户发放红包;

方案如:

定时领取红包 

相似习惯使用 redis的 list 

当用户与活动,将用户与信息push到行列中 

接下来形容单多线程程序去pop数据,进行发放红包的业务 

诸如此类可支持大并发下的用户可健康的介入运动,并且避免数据库服务器宕机的安危

附加: 

通过信息队列可以做过多底劳务。

假若:定时短信发送服务,使用sset(sorted
set),发送时间穿作为排序依据,短信数据列根据时间升序,然后形容个次定时循环去读取sset队列中之首先长达,当前工夫是不是超发送时间,如果超过就进行短信发送。

一级缓存

高并发请求连接缓存服务器超出服务器能够吸收的乞求连接量,部分用户出现建立连接超时无法读取到多少的题目;

据此要出个方案当高起上下可减少命中缓存服务器;

这儿就涌出了一级缓存的方案,一级缓存就是行使站点服务器缓存去存储数据,注意才存储部分请求量大的数目,并且缓存的数据量要控制,不能够过分的行使站点服务器的内存而影响了站点应用程序的常规运转,一级缓存需要设置秒单位之过时,具体日子根据工作场景设定,目的是当有强起请求的上可叫数的落命中到一级缓存,而休用连缓存nosql数据服务器,减少nosql数据服务器底压力

比如APP首屏商品数量接口,这些多少是公私的匪见面针对用户从定义,而且这些多少未见面一再的更新,像这种接口的请求量比较充分就是可以入一级缓存;

劳务器架构图: 

葡京签到送彩金 5

支付宝架构师眼里的高并发架构

理所当然之正规化和采取nosql缓存数据库,根据业务拆分缓存数据库的集群,这样中心可十分好支持工作,一级缓存毕竟是运用站点服务器缓存所以还是如善。

静态化数据

高并发请求数据未扭转之场面下如可以免请自己之服务器获取数据那就好抽服务器的资源压力。

对更新频繁度不愈,并且数据允许短日外之缓,可以经过数量静态化成JSON,XML,HTML等数据文件上传CDN,在拉取数据的下先到CDN拉取,如果没取到数量更从缓存,数据库中得到,当管理人员操作后台编辑数据再次重转静态文件上传同步到CDN,这样在高并发的时光可以要数码的获取命中以CDN服务器上。

CDN节点同步有自然的延迟性,所以寻找一个指谱的CDN服务器商也老重大

任何方案

对于更新频繁度不强之数,APP,PC浏览器,可以缓存数据到地头,然后每次要接口的时候上传当前缓存数据的本子号,服务端接收及版本号判断版本号与风行数据版本号是否一致,如果不相同就是进展最新数据的查询并返时数据以及新型版本号,如果相同就是归状态码告知数据现已是时。

调减服务器压力:资源、带富

本着地方的技艺本身特意整理了一下,有为数不少技术不是依靠几句子话能开口明白,所以索性找朋友录制了有视频,很多题材其实答案非常简短,但是背后的构思和逻辑不略,要完成知其然还要知其所以然。如果想深造Java工程化、高性能和分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的情侣可以加以我的Java进阶群:680130298,群里有阿里大牛直播讲解技术,以及Java大型互联网技术之视频免费享受给大家。