天天看點

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的字元都全部删除

檔案的排序、合并就介紹到這裡

繼續閱讀