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為定向輸出,但直接用>來代替就行了,這個選項很少用
-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 > 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 <标準輸入檔案,也可以使用管道
-c 標明字元串1中字元集的補集,即反選字元串1中的字元集
-d 删除字元串1中出現的所有字元(常用)
-s 删除所有重複出現的字元序列,隻保留一個
tr指令要麼在管道後面使用,要麼在标準輸入”<”使用
<code>[root@localhost ~]</code><code># tr -d 555 < abc</code>
<code>:rr</code>
從abc中标準輸入,然後比對到555字元串就删除,-d是删除字元串
[root@localhost~]# cat abc
555:rrad
60:bb
hello:333
[root@localhost~]# tr -d a-z < 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 < abc</code>
<code>:rrad</code>
<code>:bb</code>
<code>hello:</code>
這樣0-9範圍的數字就被删除
-s為删除重複的字元,隻保留1個
<code>[root@localhost ~]</code><code># tr -s a,b < aa</code>
<code>a</code>
<code>b</code>
指定的條件是a,b這兩個重複的字元,然後删除重複隻保留1個
删除文本中有多個空白行
<code>[root@localhost ~]</code><code># tr -s "\n" < aa</code>
把空白行都删除,這裡\n是代表換行的意思
也可以指定範圍進行删除
<code>winnnnenrrrrtteeemmm</code>
<code>222223333441234</code>
<code>[root@localhost ~]</code><code># tr -s "[a-z][0-9]" < abc</code>
<code>winenrttem</code>
<code>2341234</code>
可以看到,隻删除剩1個的重複字元
若上面的指令改成 tr “[a-z][0-9]” < abc
<code>[root@localhost ~]</code><code># tr "[a-z]" "9" < abc</code>
<code>9innnne9rrrr9teeemmm</code>
這也可以比對凡是大寫的字元都更改為9,注意更改的字元隻能是單個,不能是多個,如:
tr“[a-z]” “999” < 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的字元都全部删除
檔案的排序、合并就介紹到這裡