Linux Shell常用技巧(六)
十二.?? 行的排序命令sort:
? 1.? sort命令行選項:
| 選項 | 描述 |
| -t | 字段之間的分隔符 |
| -f | 基于字符排序時忽略大小寫 |
| -k | 定義排序的域字段,或者是基于域字段的部分數據進行排序 |
| -m | 將已排序的輸入文件,合并為一個排序后的輸出數據流 |
| -n | 以整數類型比較字段 |
| -o outfile | 將輸出寫到指定的文件 |
| -r | 倒置排序的順序為由大到小,正常排序為由小到大 |
| -u | 只有唯一的記錄,丟棄所有具有相同鍵值的記錄 |
| -b | 忽略前面的空格 |
?? 2.? sort使用實例:
??? 提示:在下面的輸出結果中紅色標注的為第一排序字段,后面的依次為紫、綠。
?? ?/> sed -n '1,5p' /etc/passwd > users
?? ?/> cat users
?? ?root:x:0:0:root:/root:/bin/bash
?? ?bin:x:1:1:bin:/bin:/sbin/nologin
?? ?daemon:x:2:2:daemon:/sbin:/sbin/nologin
?? ?adm:x:3:4:adm:/var/adm:/sbin/nologin
?? ?lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
?? ?#-t定義了冒號為域字段之間的分隔符,-k 2指定基于第二個字段正向排序(字段順序從1開始)。
?? ?/> sort -t':' -k 1 users
??? adm:x:3:4:adm:/var/adm:/sbin/nologin
??? bin:x:1:1:bin:/bin:/sbin/nologin
??? daemon:x:2:2:daemon:/sbin:/sbin/nologin
??? lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
??? root:x:0:0:root:/root:/bin/bash
?? ?#還是以冒號為分隔符,這次是基于第三個域字段進行倒置排序。
?? ?/> sort -t':' -k 3r users
?? ?lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
?? ?adm:x:3:4:adm:/var/adm:/sbin/nologin
?? ?daemon:x:2:2:daemon:/sbin:/sbin/nologin
?? ?bin:x:1:1:bin:/bin:/sbin/nologin
?? ?root:x:0:0:root:/root:/bin/bash
?? ?#先以第六個域的第2個字符到第4個字符進行正向排序,在基于第一個域進行反向排序。
??? /> sort -t':' -k 6.2,6.4 -k 1r users
??? bin:x:1:1:bin:/bin:/sbin/nologin
??? root:x:0:0:root:/root:/bin/bash
??? daemon:x:2:2:daemon:/sbin:/sbin/nologin
??? lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
??? adm:x:3:4:adm:/var/adm:/sbin/nologin
?? ?#先以第六個域的第2個字符到第4個字符進行正向排序,在基于第一個域進行正向排序。和上一個例子比,第4和第5行交換了位置。
?? ?/> sort -t':' -k 6.2,6.4 -k 1 users
?? ?bin:x:1:1:bin:/bin:/sbin/nologin
?? ?root:x:0:0:root:/root:/bin/bash
?? ?daemon:x:2:2:daemon:/sbin:/sbin/nologin
?? ?adm:x:3:4:adm:/var/adm:/sbin/nologin
?? ?lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
?? ?#基于第一個域的第2個字符排序
?? ?/> sort -t':' -k 1.2,1.2 users?? ?
?? ?daemon:x:2:2:daemon:/sbin:/sbin/nologin
?? ?adm:x:3:4:adm:/var/adm:/sbin/nologin
?? ?bin:x:1:1:bin:/bin:/sbin/nologin
?? ?root:x:0:0:root:/root:/bin/bash
?? ?lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
?? ?#基于第六個域的第2個字符到第4個字符進行正向排序,-u命令要求在排序時刪除鍵值重復的行。
??? /> sort -t':' -k 6.2,6.4 -u users
?? ?bin:x:1:1:bin:/bin:/sbin/nologin
?? ?root:x:0:0:root:/root:/bin/bash
?? ?daemon:x:2:2:daemon:/sbin:/sbin/nologin
?? ?adm:x:3:4:adm:/var/adm:/sbin/nologin
??? /> cat /etc/passwd | wc -l? #計算該文件中文本的行數。
?? ?39
??? /> sed -n '35,$p' /etc/passwd > users2? #取最后5行并輸出到users2中。
??? /> cat users2
?? ?sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
?? ?mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
?? ?pulse:x:496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
?? ?gdm:x:42:42::/var/lib/gdm:/sbin/nologin
?? ?stephen:x:500:500:stephen:/home/stephen:/bin/bash
?? ?#基于第3個域字段以文本的形式排序
??? /> sort -t':' -k 3 users2
?? ?mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
?? ?gdm:x:42:42::/var/lib/gdm:/sbin/nologin
?? ?pulse:x:496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
?? ?stephen:x:500:500:stephen:/home/stephen:/bin/bash
?? ?sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
?? ?#基于第3個域字段以數字的形式排序
??? /> sort -t':' -k 3n users2
?? ?mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
?? ?gdm:x:42:42::/var/lib/gdm:/sbin/nologin
?? ?sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
?? ?pulse:x:496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
?? ?stephen:x:500:500:stephen:/home/stephen:/bin/bash
?? ?#基于當前系統執行進程的owner名排序,并將排序的結果寫入到result文件中
??? /> ps -ef | sort -k 1 -o result
十三. 刪除重復行的命令uniq:
?? ?uniq有3個最為常用的選項,見如下列表:
| 選項 | 命令描述 |
| -c | 可在每個輸出行之前加上該行重復的次數 |
| -d | 僅顯示重復的行 |
| -u | 顯示為重復的行 |
??? /> cat testfile
?? ?hello
?? ?world
?? ?friend
?? ?hello
?? ?world
?? ?hello
?? ?#直接刪除未經排序的文件,將會發現沒有任何行被刪除
?? ?/> uniq testfile ?
?? ?hello
?? ?world
?? ?friend
?? ?hello
?? ?world
?? ?hello
?? ?#排序之后刪除了重復行,同時在行首位置輸出該行重復的次數
?? ?/> sort testfile | uniq -c ?
??? 1 friend
??? 3 hello
??? 2 world
?? ?#僅顯示存在重復的行,并在行首顯示該行重復的次數
?? ?/> sort testfile | uniq -dc
??? 3 hello
??? 2 world
??? #僅顯示沒有重復的行
??? /> sort testfile | uniq -u
?? ?friend ?
十四. 文件壓縮解壓命令tar:
? ?1.? tar命令行選項
| 選項 | 命令描述 |
| -c | 建立壓縮檔案 |
| -x | 解壓 |
| --delete | 從壓縮包中刪除已有文件,如果該文件在包中出現多次,該操作其將全部刪除。 |
| -t | 查看壓縮包中的文件列表 |
| -r | 向壓縮歸檔文件末尾追加文件 |
| -u | 更新原壓縮包中的文件 |
| -z | 壓縮為gzip格式,或以gzip格式解壓 |
| -j | 壓縮為bzip2格式,或以bzip2格式解壓 |
| -v | 顯示壓縮或解壓的過程,該選項一般不適于后臺操作 |
| -f | 使用檔案名字,這個參數是最后一個參數,后面只能接檔案名。 |
?? ?2.? tar使用實例:
?? ?#將當前目錄下所有文件壓縮打包,需要說明的是很多人都習慣將tar工具壓縮的文件的擴展名命名為.tar
??? /> tar -cvf test.tar *
?? ?-rw-r--r--. 1 root root?? 183 Nov 11 08:02 users
?? ?-rw-r--r--. 1 root root?? 279 Nov 11 08:45 users2
??? /> cp ../*.log .????????????????? #從上一層目錄新copy一個.log文件到當前目錄。
??? /> tar -rvf test.tar *.log ?? ?#將擴展名為.log的文件追加到test.tar包里。
??? /> tar -tvf test.tar
?? ?-rw-r--r-- root/root??????? 183 2011-11-11 08:02 users
?? ?-rw-r--r-- root/root??????? 279 2011-11-11 08:45 users2
?? ?-rw-r--r-- root/root???? 48217 2011-11-11 22:16 install.log
??? /> touch install.log?????????? #使原有的文件更新一下最新修改時間
??? /> tar -uvf test.tar *.log??? #重新將更新后的log文件更新到test.tar中
??? /> tar -tvf test.tar???????????? #從輸出結果可以看出tar包中多出一個更新后install.log文件。
?? ?-rw-r--r-- root/root???????? 183 2011-11-11 08:02 users
?? ?-rw-r--r-- root/root???????? 279 2011-11-11 08:45 users2
?? ?-rw-r--r-- root/root???? 48217 2011-11-11 22:16 install.log
?? ?-rw-r--r-- root/root???? 48217 2011-11-11 22:20 install.log
??? /> tar --delete install.log -f test.tar #基于上面的結果,從壓縮包中刪除install.log
?? ?-rw-r--r-- root/root?????? 183 2011-11-11 08:02 users
?? ?-rw-r--r-- root/root?????? 279 2011-11-11 08:45 users2
??? /> rm -f users users2????? #從當前目錄將tar中的兩個文件刪除
??? /> tar -xvf test.tar????????? #解壓
??? /> ls -l users*?? ??? ??? ????? #僅列出users和users2的詳細列表信息
?? ?-rw-r--r--. 1 root root 183 Nov 11 08:02 users
?? ?-rw-r--r--. 1 root root 279 Nov 11 08:45 users2
?? ?#以gzip的格式壓縮并打包,解壓時也應該以同樣的格式解壓,需要說明的是以該格式壓縮的包習慣在擴展名后加.gz
??? /> tar -cvzf test.tar.gz *
??? /> tar -tzvf test.tar.gz????? #查看壓縮包中文件列表時也要加z選項(gzip格式)
?? ?-rw-r--r-- root/root???? 48217 2011-11-11 22:50 install.log
?? ?-rw-r--r-- root/root???????? 183 2011-11-11 08:02 users
?? ?-rw-r--r-- root/root???????? 279 2011-11-11 08:45 users2
??? /> rm -f users users2 install.log
??? /> tar -xzvf test.tar.gz???? #以gzip的格式解壓
??? /> ls -l *.log users*
?? ?-rw-r--r-- root/root???? 48217 2011-11-11 22:50 install.log
?? ?-rw-r--r-- root/root???????? 183 2011-11-11 08:02 users
?? ?-rw-r--r-- root/root???????? 279 2011-11-11 08:45 users2
??? /> rm -f test.*??????????????? #刪除當前目錄下原有的壓縮包文件
?? ?#以bzip2的格式壓縮并打包,解壓時也應該以同樣的格式解壓,需要說明的是以該格式壓縮的包習慣在擴展名后加.bz2
??? /> tar -cvjf test.tar.bz2 *
??? /> tar -tjvf test.tar.bz2?? ?#查看壓縮包中文件列表時也要加j選項(bzip2格式)
?? ?-rw-r--r-- root/root???? 48217 2011-11-11 22:50 install.log
?? ?-rw-r--r-- root/root???????? 183 2011-11-11 08:02 users
?? ?-rw-r--r-- root/root???????? 279 2011-11-11 08:45 users2
??? /> rm -f *.log user*
??? /> tar -xjvf test.tar.bz2??? #以bzip2的格式解壓
??? /> ls -l
?? ?-rw-r--r--. 1 root root 48217 Nov 11 22:50 install.log
?? ?-rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
?? ?-rw-r--r--. 1 root root???? 183 Nov 11 08:02 users
?? ?-rw-r--r--. 1 root root???? 279 Nov 11 08:45 users2
十五. 大文件拆分命令split:
?? ?下面的列表中給出了該命令最為常用的幾個命令行選項:
| 選項 | 描述 |
| -l | 指定行數,每多少分隔成一個文件,缺省值為1000行。 |
| -b | 指定字節數,支持的單位為:k和m |
| -C | 與-b參數類似,但切割時盡量維持每行的完整性 |
| -d | 生成文件的后綴為數字,如果不指定該選項,缺省為字母 |
??? /> ls -l
?? ?-rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
??? /> split -b 5k test.tar.bz2???? #以每文件5k的大小切割test.tar.bz2
??? /> ls -l??????????????????????????????? #查看切割后的結果,缺省情況下拆分后的文件名為以下形式。
?? ?-rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
?? ?-rw-r--r--. 1 root root?? 5120 Nov 11 23:34 xaa
?? ?-rw-r--r--. 1 root root?? 5120 Nov 11 23:34 xab
?? ?-rw-r--r--. 1 root root? ?? 290 Nov 11 23:34 xac
??? /> rm -f x*???????????????????????? #刪除拆分后的小文件
??? /> split -d -b 5k test.tar.bz2 #-d選項以后綴為數字的形式命名拆分后的小文件
??? /> ls -l
?? ?-rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
?? ?-rw-r--r--. 1 root root?? 5120 Nov 11 23:36 x00
?? ?-rw-r--r--. 1 root root ? 5120 Nov 11 23:36 x01
?? ?-rw-r--r--. 1 root root? ?? 290 Nov 11 23:36 x02
??? /> wc install.log -l???????????? #計算該文件的行數
??? /> split -l 300 install.log???? #每300行拆分成一個小文件
??? /> ls -l x*
?? ?-rw-r--r--. 1 root root 11184 Nov 11 23:42 xaa
?? ?-rw-r--r--. 1 root root 10805 Nov 11 23:42 xab
?? ?-rw-r--r--. 1 root root 12340 Nov 11 23:42 xac
?? ?-rw-r--r--. 1 root root 11783 Nov 11 23:42 xad
?? ?-rw-r--r--. 1 root root?? 2105 Nov 11 23:42 xae
總結
以上是生活随笔為你收集整理的Linux Shell常用技巧(六)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Shell常用技巧(五)
- 下一篇: Linux Shell常用技巧(八)