天天看点

linux 命令

sort命令,只是对文件排行排序

选项意义

-c 测试文件是否已经被排序

-k 指定排序的区域(常用)

-m 合并两个已排序的文件

-n 根据数字大小进行排序(常用)

-o 将输出写到指定文件,相当于重定向输出文件

-r 将排序结果逆向显示

-t 改变区域分隔符(常用)

-u 去除结果中的重复行

格式:sort 选项输入文件

下面详细解说:

-t选项——原理从第一区域开始排序,若第一区域内容相同,则以第二区域排序

-k

1

2

3

4

5

6

7

8

9

10

<code>[root@localhost ~]</code><code># cat abc</code>

<code>aa:ff:kk</code>

<code>bb:qq:gg</code>

<code>dd</code><code>:ee:ww</code>

<code>xx cc</code>

<code>[root@localhost ~]</code><code># sort -t: -k3 abc</code>

可以留意到,从第三区域才开始排序,前2个区域是没有排序,而-t就以:为分隔符

也可以用sort -t: -k3 /etc/passwd

<code>[root@localhost ~]</code><code># sort -t: -k3 /etc/passwd</code>

<code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>

<code>uucp:x:10:14:uucp:</code><code>/var/spool/uucp</code><code>:</code><code>/sbin/nologin</code>

<code>operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>

<code>bin:x:1:1:bin:</code><code>/bin</code><code>:</code><code>/sbin/nologin</code>

<code>games:x:12:100:games:</code><code>/usr/games</code><code>:</code><code>/sbin/nologin</code>

<code>gopher:x:13:30:gopher:</code><code>/var/gopher</code><code>:</code><code>/sbin/nologin</code>

<code>ftp</code><code>:x:14:50:ftp user:</code><code>/var/ftp</code><code>:</code><code>/sbin/nologin</code>

<code>daemon:x:2:2:daemon:</code><code>/sbin</code><code>:</code><code>/sbin/nologin</code>

<code>squid:x:23:23::</code><code>/var/spool/squid</code><code>:</code><code>/sbin/nologin</code>

这样第3区域刚好是uid就会排序,但会发现这里只以第一个字符大小进行排序,而不会以整体大小排序

如:这样只达到第1个字符进行排序,而不是对整个数进行排序

1 1

400 400

67 501

89 602

501 67

602 89

-n选项,为指定列的数字大小,属于整体性质来排序

如:

900 3

60 60

3 100

100 900

11

12

13

14

15

<code>900:aa</code>

<code>60:bb</code>

<code>3:rr</code>

<code>100:pp</code>

<code>[root@localhost ~]</code><code># sort -t: -k1 abc</code>

<code>[root@localhost ~]</code><code># sort -t: -k1n abc</code>

可以看出,加了-n是对整体排序,而不加-n则只以单个字符排序

所以用 sort -t: -k3n /etc/passwd 这样就可以对uid进行从小到大排序了

-r是反向,从大到小排序

<code>[root@localhost ~]</code><code># sort -t: -k1nr abc</code>

-u选项,去除重复出现的区域

<code>[root@localhost ~]</code><code># sort -t: -k1n -u abc</code>

其中重复了2行的900:aa就不会显示出来

-o为定向输出,但直接用&gt;来代替就行了,这个选项很少用

-m为排序后2个文件合并,前提2个文件内容没有重复

<code>555:rr</code>

<code>[root@localhost ~]</code><code># cat aaa</code>

<code>xxx</code>

<code>xxxxx</code>

<code>[root@localhost ~]</code><code># sort -t: -m abc aaa</code>

这样就把abc的内容全部到aaa里了

其实还可以简写为sort -t: abc aaa 就行了

也可以按2个文件的区域进行排序

<code>777:xxx</code>

<code>444444:xxxxx</code>

<code>[root@localhost ~]</code><code># sort -t: -k1n abc aaa</code>

这样就达到2个文件内容合并后再进行区域排序

sort命令就介绍到这里

uniq命令——用于去除重复行,其实跟sort -u差不多

-c 打印每行在文本中重复出现的次数

-d 只显示有重复的记录,每个重复记录只出现一次

-u 只显示没有重复的记录

<code>[root@localhost ~]</code><code># uniq abc</code>

去除2行重内容

与sort -u的区别,sort -u只会把重复行删除剩下1个

16

17

18

19

20

<code>show me</code>

<code>hello</code>

<code>[root@localhost ~]</code><code># sort -u abc</code>

可以留意到,uniq只是把连续重复的行删除,第4行的555:rr是没有删除,但sort -u则认为都是重复,所以一并删除

-c为打印文本中出现重复的次数

<code>[root@localhost ~]</code><code># uniq -c abc</code>

<code></code><code>3 555:rr</code>

<code></code><code>2 60:bb</code>

<code></code><code>1 show me</code>

<code></code><code>1 555:rr</code>

<code></code><code>1 hello</code>

可以显示出重复的次数

-d只打印连续重复的记录

<code>[root@localhost ~]</code><code># uniq -d abc</code>

只显示出连续重复的行记录

-u只打印没有连续重复的记录

<code>[root@localhost ~]</code><code># uniq -u abc</code>

其实-d和-u是正反向的对比效果

cut命令——用于从标准输入或文本文件中按区域或行提取文本

格式:cut 选项文件

-c 指定提取的字符数或字符范围

-f 指定提取的区域数或范围

-d 改变区域分隔符

<code>hello:333</code>

<code>[root@localhost ~]</code><code># cut -c1 abc</code>

<code>5</code>

<code>6</code>

<code>h</code>

<code>[root@localhost ~]</code><code># cut -c1-5 abc</code>

<code>555:r</code>

<code>[root@localhost ~]</code><code># cut -c2,4 abc</code>

<code>5:</code>

<code>0b</code>

<code>el</code>

-c1只提取abc文件中第一个字符的列,而-c1-5即代表1-5个字符的列,-c2,4即代表第2和第4个字符的列

-d指定分隔符,-f为指定区域,这2个参数通常要一起使用

<code>[root@localhost ~]</code><code># cut -d: -f2 abc</code>

<code>rr</code>

<code>bb</code>

<code>333</code>

感觉跟awk的截取差不多

空格也可以用cut -d “ ” 来表示

<code>777 xxx</code>

<code>444444 xxxxx</code>

<code>[root@localhost ~]</code><code># cut -d" " -f2 aaa</code>

使用cut来截取ip也行

<code>[root@localhost ~]</code><code># ifconfig eth0 | grep "inet addr" | cut -d: -f2 | cut -d" " -f1</code>

<code>192.168.1.1</code>

这方法的原理跟awk一样,就是先过滤ip字段,再以:为分区过滤,再过滤出第1区域

也可以结合sort来使用对uid进行排序

<code>[root@localhost ~]</code><code># cat test</code>

<code>xfs:x:43:43:x font server:</code><code>/etc/x11/fs</code><code>:</code><code>/sbin/nologin</code>

<code>sabayon:x:86:86:sabayon user:</code><code>/home/sabayon</code><code>:</code><code>/sbin/nologin</code>

<code>leon:x:500:500::</code><code>/home/leon</code><code>:</code><code>/bin/bash</code>

<code>tom:x:501:501::</code><code>/home/tom</code><code>:</code><code>/bin/bash</code>

<code>[root@localhost ~]</code><code># sort -t: -k3n test | cut -d: -f3</code>

<code>23</code>

<code>43</code>

<code>86</code>

<code>500</code>

<code>501</code>

这样就把uid部分单独截取出来进行排序,当然用awk也能实现的

paste命令——把两个文件内容粘贴一起

-d 指定分隔符,默认是以tab键为分隔符

-s 将每个文件粘贴成一行

<code>[root@localhost ~]</code><code># cat aa</code>

<code>aaa</code>

<code>bbb</code>

<code>ccc</code>

<code>[root@localhost ~]</code><code># cat bb</code>

<code>111</code>

<code>222</code>

<code>[root@localhost ~]</code><code># paste aa bb</code>

<code>aaa 111</code>

<code>bbb 222</code>

<code>ccc 333</code>

可以留意到粘贴后,是以空格为分隔符

<code>[root@localhost ~]</code><code># paste aa bb &gt; newfile</code>

<code>[root@localhost ~]</code><code># cat newfile</code>

当然也可以排粘贴后的结果输出到另一个文件也行

<code>[root@localhost ~]</code><code># paste -d? abc aaa</code>

<code>555:rr?777 xxx</code>

<code>60:bb?444444 xxxxx</code>

<code>hello:333?</code>

-d为指定分隔,因为默认是以tab键为分隔符,现在改变了分隔符?,注意,分隔符只能指定1个字符,不能指定多个字符,如-d***,这样的效果只能是-d*

<code>[root@localhost ~]</code><code># paste -s aa bb</code>

<code>aaa bbb ccc</code>

<code>111 222 333</code>

-s可以排两个文件以的内容分别以一行方式排列再合并,但效果不好看

tr命令——实现字符转换功能,其功能类似于sed命令,但tr命令比较简单

格式:tr 选项字符串1 字符串2 &lt;标准输入文件,也可以使用管道

-c 选定字符串1中字符集的补集,即反选字符串1中的字符集

-d 删除字符串1中出现的所有字符(常用)

-s 删除所有重复出现的字符序列,只保留一个

tr命令要么在管道后面使用,要么在标准输入”&lt;”使用

<code>[root@localhost ~]</code><code># tr -d 555 &lt; abc</code>

<code>:rr</code>

从abc中标准输入,然后匹配到555字符串就删除,-d是删除字符串

[root@localhost~]# cat abc

555:rrad

60:bb

hello:333

[root@localhost~]# tr -d a-z &lt; abc

555:rd

60:b

heo:333

从abc文本中删除大写a-z范围的字符串

同理,也可以删除数字0-9的范围

<code>555:rrad</code>

<code>[root@localhost ~]</code><code># tr -d 0-9 &lt; abc</code>

<code>:rrad</code>

<code>:bb</code>

<code>hello:</code>

这样0-9范围的数字就被删除

-s为删除重复的字符,只保留1个

<code>[root@localhost ~]</code><code># tr -s a,b &lt; aa</code>

<code>a</code>

<code>b</code>

指定的条件是a,b这两个重复的字符,然后删除重复只保留1个

删除文本中有多个空白行

<code>[root@localhost ~]</code><code># tr -s "\n" &lt; aa</code>

把空白行都删除,这里\n是代表换行的意思

也可以指定范围进行删除

<code>winnnnenrrrrtteeemmm</code>

<code>222223333441234</code>

<code>[root@localhost ~]</code><code># tr -s "[a-z][0-9]" &lt; abc</code>

<code>winenrttem</code>

<code>2341234</code>

可以看到,只删除剩1个的重复字符

若上面的命令改成 tr “[a-z][0-9]” &lt; abc

<code>[root@localhost ~]</code><code># tr "[a-z]" "9" &lt; abc</code>

<code>9innnne9rrrr9teeemmm</code>

这也可以匹配凡是大写的字符都更改为9,注意更改的字符只能是单个,不能是多个,如:

tr“[a-z]” “999” &lt; abc 这样的效果也只能替换1个9的字符而不能是多个

使用管道方式用tr命令

<code>[root@localhost ~]</code><code># ifconfig eth0 | grep "inet addr"</code>

<code></code><code>inet addr:192.168.1.1 bcast:192.168.1.255 mask:255.255.255.0</code>

<code>[root@localhost ~]</code><code># ifconfig eth0 | grep "inet addr" | tr -d 19</code>

<code></code><code>inet addr:2.68.. bcast:2.68..255 mask:255.255.255.0</code>

这样匹配19的字符都全部删除

文件的排序、合并就介绍到这里

继续阅读