linux腳本攻略 sort,uniq,cut 命令詳解

sort 命令

作用

NAME
       sort - sort lines of text files

sort 常用選項和參數:

選項與參數:
-f  :忽略大小寫的差異,例如 A 與 a 視爲編碼相同;
-b  :忽略最前面的空格符部分;
-M  :以月份的名字來排序,例如 JAN, DEC 等等的排序方法;
-n  :使用『純數字』進行排序(默認是以文字型態來排序的);
-r  :反向排序;
-u  :就是 uniq ,相同的數據中,僅出現一行代表;
-t  :分隔符,默認是用 [tab] 鍵來分隔;
-k  :以那個區間 (field) 來進行排序的意思

sort 是默認以第一個數據來排序,而且默認是以字符串形式來排序,所以由字母 a 開始升序排序。

ld@ubuntu:~$ cat /etc/passwd | sort | head
avahi-autoipd:x:105:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:111:117:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
colord:x:113:121:colord colour management daemon,,,:/var/lib/colord:/bin/false
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
dnsmasq:x:104:65534:dnsmasq,,,:/var/lib/misc:/bin/false
games:x:5:60:games:/usr/games:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
hplip:x:114:7:HPLIP system user,,,:/var/run/hplip:/bin/false

/etc/passwd 內容是以 : 來分隔的,我想以第三欄來排序,該如何

ld@ubuntu:~$ cat /etc/passwd | sort -t ':' -k 3 | head
root:x:0:0:root:/root:/bin/bash
ld:x:1000:1000:haha,,,:/home/ld:/bin/bash
libuuid:x:100:101::/var/lib/libuuid:
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
syslog:x:101:104::/home/syslog:/bin/false
messagebus:x:102:106::/var/run/dbus:/bin/false
usbmux:x:103:46:usbmux daemon,,,:/home/usbmux:/bin/false
dnsmasq:x:104:65534:dnsmasq,,,:/var/lib/misc:/bin/false
avahi-autoipd:x:105:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
kernoops:x:106:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false

默認是以字符串來排序的,如果想要使用數字排序:

ld@ubuntu:~$ cat /etc/passwd | sort -t ':' -k 3n | head
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

默認是升序排序,如果要倒序排序,如下

ld@ubuntu:~$ cat /etc/passwd | sort -t ':' -k 3nr | head
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
ld:x:1000:1000:haha,,,:/home/ld:/bin/bash
sshd:x:116:65534::/var/run/sshd:/usr/sbin/nologin
pulse:x:115:122:PulseAudio daemon,,,:/var/run/pulse:/bin/false
hplip:x:114:7:HPLIP system user,,,:/var/run/hplip:/bin/false
colord:x:113:121:colord colour management daemon,,,:/var/lib/colord:/bin/false
lightdm:x:112:118:Light Display Manager:/var/lib/lightdm:/bin/false
avahi:x:111:117:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
speech-dispatcher:x:110:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/                                                                                        sh
whoopsie:x:109:116::/nonexistent:/bin/false

根據第一列排序,並且去重

ld@ubuntu:~$ cat /etc/passwd | sort -t ':' -k 1 -u | head
avahi-autoipd:x:105:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:111:117:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
colord:x:113:121:colord colour management daemon,,,:/var/lib/colord:/bin/false
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
dnsmasq:x:104:65534:dnsmasq,,,:/var/lib/misc:/bin/false
games:x:5:60:games:/usr/games:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
hplip:x:114:7:HPLIP system user,,,:/var/run/hplip:/bin/false

以第六個域的第2個字符到第4個字符進行正向排序,再基於第一個域進行反向排序。

ld@ubuntu:~$ cat /etc/passwd | sort -t ':' -k 6.2,6.4 -k 1r | head
kernoops:x:106:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
sync:x:4:65534:sync:/bin:/bin/sync
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
usbmux:x:103:46:usbmux daemon,,,:/home/usbmux:/bin/false
syslog:x:101:104::/home/syslog:/bin/false
saned:x:108:115::/home/saned:/bin/false
ld:x:1000:1000:haha,,,:/home/ld:/bin/bash
whoopsie:x:109:116::/nonexistent:/bin/false

uniq

作用:


NAME
       uniq - report or omit repeated lines

常用參數

-i   :忽略大小寫字符的不同;
-c  :進行計數
-u  :只顯示唯一的行

-c, --count
        prefix lines by the number of occurrences
-d, --repeated
       only print duplicate lines

-D, --all-repeated[=delimit-method]
       print all duplicate lines delimit-method={none(default),prepend,separate}  Delimit‐
       ing is done with blank lines

-f, --skip-fields=N
       avoid comparing the first N fields

-i, --ignore-case
       ignore differences in case when comparing

-s, --skip-chars=N
       avoid comparing the first N characters

-u, --unique
       only print unique lines

-z, --zero-terminated
       end lines with 0 byte, not newline

-w, --check-chars=N
       compare no more than N characters in lines

--help display this help and exit

--version
       output version information and exit

重複行必須是相鄰的,否則 uniq 無效。

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq
hello
world
friend
hello
world
hello
ld@ubuntu:/mnt/hgfs/haShare/test$ uniq testUniq
hello
world
friend
hello
world
hello

排序之後使得重複項目相鄰,這樣 uniq 才能生效:

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort
friend
hello
hello
hello
world
world

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort | uniq
friend
hello
world

排序之後刪除了重複行,同時在行首位置輸出該行出現的次數

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort | uniq -c
      1 friend
      3 hello
      2 world

僅顯示存在重複的行,並在行首顯示該行重複的次數

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort | uniq -dc
      3 hello
      2 world

僅顯示不重複的行

ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort | uniq -uc
      1 friend
ld@ubuntu:/mnt/hgfs/haShare/test$ cat testUniq | sort | uniq -u
friend

cat 命令

作用

NAME
       cut - remove sections from each line of files

SYNOPSIS
       cut OPTION... [FILE]...

DESCRIPTION
       Print selected parts of lines from each FILE to standard output.

       Mandatory arguments to long options are mandatory for short options too.

參數:

[root@www~]# cut -d'分隔字符' -f fields 用於有特定分隔字符
[root@www~]# cut -c 字符區間            用於排列整齊的信息
選項與參數:
-d  :後面接分隔字符。與 -f 一起使用;
-f  :依據 -d 的分隔字符將一段信息分割成爲數段,用 -f 取出第幾段的意思;
-c  :以字符 (characters) 的單位取出固定字符區間;
ld@ubuntu:~$ echo $PATH
/home/ld/dev/spark/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/jre/bin:/home/ld/anaconda2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

將 PATH 變量取出,我要找出第3個路徑。

ld@ubuntu:~$ echo $PATH | cut -d ':' -f 3
/usr/lib/jvm/java-8-oracle/jre/bin
ld@ubuntu:~$ echo $PATH | cut -d ':' -f 5
/usr/local/sbin

將 PATH 變量取出,我要找出第三和第五個路徑。

ld@ubuntu:~$ echo $PATH | cut -d ':' -f 3,5
/usr/lib/jvm/java-8-oracle/jre/bin:/usr/local/sbin

將 PATH 變量取出,我要找出第二到最後一個路徑。

ld@ubuntu:~$ echo $PATH | cut -d ':' -f 2-
/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/jre/bin:/home/ld/anaconda2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

將 PATH 變量取出,我要找出第一到第三個路徑。

ld@ubuntu:~$ echo $PATH | cut -d ':' -f 1-3
/home/ld/dev/spark/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/jre/bin

實用例子:只顯示/etc/passwd的用戶和shell

ld@ubuntu:~$ cat /etc/passwd | head | cut -d ':' -f 1,7
root:/bin/bash
daemon:/usr/sbin/nologin
bin:/usr/sbin/nologin
sys:/usr/sbin/nologin
sync:/bin/sync
games:/usr/sbin/nologin
man:/usr/sbin/nologin
lp:/usr/sbin/nologin
mail:/usr/sbin/nologin
news:/usr/sbin/nologin
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章