1. 程式人生 > >Linux 命令 打包與壓縮

Linux 命令 打包與壓縮

【檔案打包與壓縮】
介紹
在學習Linux上的壓縮工具之前,有必要先了解一下常見常用的壓縮包檔案格式。在 Windows 上最常見的不外乎這三種 .zip,.rar 字尾的壓縮檔案。而在 Linux 上面常見的格式除了以上三種外,還有 .gz,.xz,.bz2,.tar,.tar.gz,.tar.xz,*.tar.bz2,簡單介紹如下:

 檔案字尾名  說明
*.zip   zip 程式打包壓縮的檔案
*.rar   rar 程式壓縮的檔案
*.7z    7zip 程式壓縮的檔案
*.tar   tar 程式打包,未壓縮的檔案
*.gz    gzip 程式(GNU zip)壓縮的檔案
*.xz    xz 程式壓縮的檔案
*.bz2   bzip2 程式壓縮的檔案
*.tar.gz    tar 打包,gzip 程式壓縮的檔案
*.tar.xz    tar 打包,xz 程式壓縮的檔案
*.tar.bz2   tar 打包,bzip2 程式壓縮的檔案
*.tar.7z    tar 打包,7z 程式壓縮的檔案

1.1 tar【重點掌握】
在 Linux 上面更常用的是 tar 工具,tar 原本只是一個打包工具,只是同時還是實現了對 7z、gzip、xz、bzip2 等工具的支援,這些壓縮工具本身只能實現對檔案或目錄(單獨壓縮目錄中的檔案)的壓縮。

語法:tar [-zjxcvfpP] filename
-z :是否同時用gzip壓縮
-j :是否同時用bzip2壓縮
-x :解包或者解壓縮
-t :檢視tar包裡面的檔案
-c :建立一個tar包或者壓縮檔案包
-v :視覺化
-f :後面跟檔名,壓縮時跟-f檔名,意思是壓縮後的檔名為filename,解壓時跟-f檔名,意思是解壓filename。請注意,如果是多個引數組合的情況下帶有-f,請把f寫到最後面。
-p :使用原檔案的屬性,壓縮前什麼屬性壓縮後還什麼屬性。(不常用)
-P :可以使用絕對路徑。(不常用)


【例項:】
將桌面上的zhiyou打成rar的包
tar -cvf zhiyou.rar zhiyou
將zhiyou刪除,解壓縮rar
tar -xvf zhiyou.rar

將桌面上的zhiyou打成tar的包,並進行壓縮
tar -cvf zhiyou.tar.gz zhiyou
將zhiyou刪除,解壓縮rar
tar -xvf zhiyou.tar.gz

1.2 gzip
[注:gzip只能壓縮檔案,不能壓縮目錄]
語法:gzip [-d#] filename 其中#為1-9的數字
-d :解壓縮時使用
-# :壓縮等級,1壓縮最差,9壓縮最好,6為預設

[例項:]
壓縮aa.txt檔案:
gzip aa.txt    (壓縮之後,變成了aa.txt.gz)
解壓縮
gzip -d aa.txt.gz

1.3 bzip2
語法:bzip2 [-dz] filename
-d :解壓縮
-z :壓縮

壓縮:
bzip2 -z aa.txt   (壓縮之後,變成了aa.txt.bz2)
解壓縮:
bzip2 -d aa.txt.bz2

【管道命令】
管道是一種通訊機制,通常用於程序間的通訊(也可通過socket進行網路通訊),它表現出來的形式就是將前面每一個程序的輸出(stdout)直接作為下一個程序的輸入(stdin)。

管道又分為匿名管道和具名管道。我們在使用一些過濾程式時經常會用到的就是匿名管道,在命令列中由|分隔符表示。具名管道簡單的說就是有名字的管道,通常只會在源程式中用到具名管道。

[例項:]
通過管道將前一個命令(ls)的輸出作為下一個命令(less)的輸入:
ls -al /etc | less

相關命令
2.1 cat 列印某一行中的某個欄位
語法:cut -d ‘分割字元’ -f fields
cut -c 字元範圍

-d : 後面接分隔符,與-f一起使用;
-f : 依據-d的分隔符將一段資訊切割成為數段,用-f取出第幾段的意思;
-c : 以字元(characters)的單位取出固定字元區間;

[例項:]
打印出/etc/passwd中使用者名稱和使用者家目錄
cut /etc/passwd -d ':' -f 1,6

打印出檔案許可權,檔案所屬使用者,檔名
ls -l |cut -d  ' ' -f 1,3,12

列印/etc/passwd檔案中每一行的前N個字元:
# 前五個(包含第五個)
$ cut /etc/passwd -c -5
# 前五個之後的(包含第五個)
$ cut /etc/passwd -c 5-
# 第五個
$ cut /etc/passwd -c 5
# 2到5之間的(包含第五個)
$ cut /etc/passwd -c 2-5

2.2 grep分析一行資料,如果有匹配的,就顯示出來
grep (global search regular expression(RE) and print out the line,全面搜尋正則表示式並把行打印出來)是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並把匹配的行打印出來。
語法:grep [-acinv] [–color=auto] ‘查詢字串’ filename

-a : 將binary檔案以text檔案的方式查詢資料;
-c : 計算找到’查詢字串‘的次數;
-i : 忽略大小寫的不同;
-n : 帶行號;
-v : 反向選擇,顯示沒有‘查詢字串’的行;
--color=auto : 可以將找到查詢的關鍵字部分加上顏色顯示
-r 引數表示遞迴搜尋子目錄中的檔案

[例項:]
將/etc/passwd,有出現 root 的行取出來:
grep root /etc/passwd
將/etc/passwd,有出現 root 的行取出來,同時顯示這些行在/etc/passwd的行號:
grep -n root /etc/passwd
將/etc/passwd,將沒有出現 root 和nologin的行取出來:
grep -v root /etc/passwd | grep -v nologin
搜尋/home/smile目錄下所有包含"zhiyou"的所有文字檔案,並顯示出現在文字中的行號:
grep -rn "zhiyou" /home/smile

2.3 wc命令
wc 命令是一個統計的工具,主要用來顯示檔案所包含的行、字和位元組數。
wc 命令是 word count 的縮寫。
語法:wc [-lwm] 檔案
-l : 統計行數
-w : 統計字數(英文單字,由空白、跳格或換行字元分隔的字串)
-m : 統計字元數,這個標誌不能與 -c 標誌一起使用
-c : 統計位元組數

[例項:]
統計a.txt檔案行數:
wc -l a.txt
統計檔案的字元數,只打印數字,不列印檔名:
cat a.txt | wc -m
統計/bin 目錄下的命令個數,可以使用如下命令:
ls /bin | wc -l

【正則表示式】
它是指一個用來描述或者匹配一系列符合某個句法規則的字串的單個字串。在很多文字編輯器或其他工具裡,正則表示式通常被用來檢索和/或替換那些符合某個模式的文字內容。許多程式設計語言都支援利用正則表示式進行字串操作。對於系統管理員來講,正則表示式貫穿在我們的日常運維工作中,無論是查詢某個文件,抑或查詢某個日誌檔案分析其內容,都會用到正則表示式。

正則表示式元字元由以下字元組成:
^ $ . [ ] { } - ? * + ( ) | \

正在表示式  描述               
^    匹配行的開始
$    匹配行尾的文字
.    匹配除換行符以外的任意字元
[]    匹配包含在[字元]之中的任意一個字元
[^]   匹配除了[^字元]之外的任意一個字元
[-]   匹配[]指定範圍內的任意一個字元
{n}   匹配之前的項n次
{n,}  之前的項至少匹配n次
{n,m} 指定之前的項需要匹配的最小和最大次數
?    匹配之前的項零次或一次
*    匹配之前的項零次或更多次
+    匹配之前的項一次或更多次
()    建立一個用於匹配的子串
|     匹配|兩邊的任意一項
\     將上面特殊字元進行轉義

\w    匹配字母或數字或下劃線或漢字
\s   匹配任意的空白符
\d   匹配數字
\b   匹配單詞的開始或結束
\W   匹配任意不是字母,數字,下劃線,漢字的字元
\S   匹配任意不是空白符的字元
\D   匹配任意非數字的字元
\B   匹配不是單詞開頭或結束的位置


示例:
^zhiyou 匹配以zhiyou開始的行
$zhiyou 匹配以zhiyou結尾的行
a.c   匹配abc、aac...但不匹配abbc
ab[cd] 匹配abc或abd
1[^01] 匹配12、13,但不匹配10、11
[1-5] 匹配1-5之間的任意一個數字
[0-9]{2} 匹配任意一個兩位數
[0-9]{2,} 匹配任意一個兩位或更多位數字
[0-9]{2,5} 匹配從兩位數到五位數之間的任意一個數字
zhiy?ou   匹配zhiyou 或 zhiou
zhiy*ou   匹配zhiou、zhiyou、zhiyyou
zhiy+ou   匹配zhiyou 、zhiyyou、zhiyyyyou
ma(in)?  匹配 ma或main
1(2|3)   匹配12或13
a\+b     匹配a+b

[例項:]
列出/etc/passwd中帶有zy的行
grep 'z.*y' /etc/passwd
利用 Linux 系統自帶的字典查詢一個五個字母的單詞,第三個字母為 j,最後一個字母為 r ,/usr/share/dict 目錄下存放字典檔案:
grep '^..j.r$' /usr/share/dict/linux.words

驗證固定電話,列印符合條件的電話,固定電話格式基本都是帶有 0 的區號+連線符“-”+電話號碼,另外還有可能有分機號,區號有 3 位、4 位,電話號碼有 7 位和 8 位的:
grep -E "^0[0-9]{2,3}-[0-9]{7,8}(-[0-9]{3,4})?$" telphone.txt