LINUX基礎實驗報告


實驗一:主要是介紹Linux系統概況,無運行代碼。

 

 

實驗二:Linux的基本操作

重要知識點

[Tab]

使用Tab鍵來進行命令補全,Tab鍵一般鍵盤是在字母Q旁邊,這個技巧給你帶來的最大的好處就是當你忘記某個命令的全稱時你可以只輸入它的開頭的一部分然后按下Tab鍵就可以得到提示或者幫助完成,當然不止補全命令,補全目錄,補全命令參數都是沒問題的。

Ctrl+c鍵

用來強行終止當前程序。

一些其他常用快捷鍵

按鍵

作用

Ctrl+d

鍵盤輸入結束或退出終端

Ctrl+s

暫定當前程序,暫停后按下任意鍵恢復運行

Ctrl+z

將當前程序放到后台運行,恢復到前台為命令fg

Ctrl+a

將光標移至輸入行頭,相當於Home鍵

Ctrl+e

將光標移至輸入行末,相當於End鍵

Ctrl+k

刪除從光標所在位置到行末

Alt+Backspace

向前刪除一個單詞

Shift+PgUp

將終端顯示向上滾動

Shift+PgDn

將終端顯示向下滾動

通配符是一種特殊語句,主要有星號(*)和問號(?),用來對對字符串進行模糊匹配(比如文件名,參數名)。當查找文件夾時,可以使用它來代替一個或多個真正字符;當不知道真正字符或者懶得輸入完整名字時,常常使用通配符代替一個或多個真正的字符。

終端里面輸入的通配符是由 Shell 處理的,不是由所涉及到命令語句處理的,它只會出現在命令的“參數值”里(它不用在 命令名稱里, 命令不記得,那就用Tab補全)。當 Shell 在“參數值”中遇到了通配符時,Shell 會將其當作路徑或文件名去在磁盤上搜尋可能的匹配:若符合要求的匹配存在,則進行代換(路徑擴展);否則就將該通配符作為一個普通字符傳遞給“命令”,然后再由命令進行處理。總之,通配符 實際上就是一種 Shell 實現的路徑擴展功能。在 通配符被處理后, Shell 會先完成該命令的重組,然后再繼續處理重組后的命令,直至執行該命令。

Shell 常用通配符:

字符

含義

*

匹配 0 或多個字符

?

匹配任意一個字符

[list]

匹配 list 中的任意單一字符

[!list]

匹配 除list 中的任意單一字符以外的字符

[c1-c2]

匹配 c1-c2 中的任意單一字符 如:[0-9] [a-z]

{string1,string2,...}

匹配 sring1 或 string2 (或更多)其一字符串

{c2..c2}

匹配 c1-c2 中全部字符 如{1..10}

 

在linux命令行中獲取幫助

使用man 命令

通常情況下,man 手冊里面的內容都是英文的,這就要求你有一定的英文基礎。man 手冊的內容很多,涉及了 Linux 使用過程中的方方面面,為了便於查找,是做了分冊(分區段)處理的,在Research UNIX、BSD、OS X 和 Linux 中,手冊通常被分為8個區段,安排如下:

區段

說明

1

一般命令

2

系統調用

3

庫函數,涵蓋了C標准函數庫

4

特殊文件(通常是/dev中的設備)和驅動程序

5

文件格式和約定

6

游戲和屏保

7

雜項

8

系統管理命令和守護進程

 

實驗三:用戶及文件權限管理

重要知識點

1.查看用戶

請打開終端,輸入命令:

who am i

或者

who mom likes

 

who 命令其它常用參數

參數

說明

-a

打印能打印的全部

-d

打印死掉的進程

-m

同am i,mom likes

-q

打印當前登錄用戶數及用戶名

-u

打印當前登錄用戶登錄信息

-r

打印運行等級

 

2.創建用戶

在命令行中輸入

 sudo adduser +用戶名

3.用戶組

在 Linux 里面每個用戶都有一個歸屬(用戶組),用戶組簡單地理解就是一組用戶的集合,它們共享一些資源和權限,同時擁有私有資源,就跟家的形式差不多,你的兄弟姐妹(不同的用戶)屬於同一個家(用戶組),你們可以共同擁有這個家(共享資源),爸媽對待你們都一樣(共享權限),你偶爾寫寫日記,其他人未經允許不能查看(私有資源和權限)。當然一個用戶是可以屬於多個用戶組的,正如你既屬於家庭,又屬於學校或公司。

查詢自己屬於哪個用戶組:

方法一:使用groups命令

在命令行輸入 groups+用戶名

方法二:查看/etc/group文件

在命令行中輸入

cat /etc/group | sort

 

4.刪除用戶

在命令行中輸入:sudo deluser 用戶名 --remove-home

5.查看文件權限

在命令行中輸入: ls -l

 

6.顯示除了 '.'(當前目錄),'..' 上一級目錄之外的所有包含隱藏文件(Linux 下以 '.' 開頭的文件為隱藏文件)

在命令行中輸入: ls -A

 當然,你可以同時使用 '-A' 和 '-l' 參數:

在命令行中輸入: ls -Al

 

7.查看某一個目錄的完整屬性,而不是顯示目錄里面的文件屬性:

在命令行中輸入: ls -dl <目錄名>

 

8。顯示所有文件大小,並以普通人類能看懂的方式呈現:

在命令行中輸入:ls -AsSh

其中小 s 為顯示文件大小,大 S 為按文件大小排序,若需要知道如何按其它方式排序,請使用“man”命令查詢。

 

9.變更文件所有者

假設目前是 lilei 用戶登錄,新建一個文件,命名為 “iphone6”:

$ touch iphone6

可見文件所有者是 lilei :

現在,使用以下命令變更文件所有者為 shiyanlou :

$ cd /home/lilei

$ ls iphone6

$ sudo chown shiyanlou iphone6

$ cp iphone6 /home/shiyanlou

現在查看,發現 文件所有者成功修改為 shiyanlou 。

 
 
 
 
 
 
 

 

10.修改文件權限

  • 方式一:二進制數字表示

 

每個文件的三組權限(擁有者,所屬用戶組,其他用戶,記住這個順序是一定的)就對應這一個 "rwx",也就是一個 '7' ,所以如果我要將文件“iphone6”的權限改為只有我自己可以用那么就這樣:

在命令行中輸入:chmod 700 iphone6

 

  • 方式二:加減賦值操作

在命令行中輸入:chmod go-rw iphone

'g''o'還有'u',分別表示group,others,user,'+','-' 就分別表示增加和去掉相應的權限。

 

實驗截圖:

 

實驗四:Linux 目錄結構及文件基本操作

重要知識點:

1.Linux 目錄結構

在講 Linux 目錄結構之前,你首先要清楚一點東西,那就是 Linux 的目錄與 Windows 的目錄的區別,或許對於一般操作上的感受來說沒有多大不同,但從它們的實現機制來說是完全不同的。

一種不同是體現在目錄與存儲介質(磁盤,內存,DVD 等)的關系上,以往的 Windows 一直是以存儲介質為主的,主要以盤符(C 盤,D 盤...)及分區的來實現文件管理,然后之下才是目錄,目錄就顯得不是那么重要,除系統文件之外的用戶文件放在任何地方任何目錄也是沒有多大關系。所以通常 Windows 在使用一段時間后,磁盤上面的文件目錄會顯得雜亂無章(少數善於整理的用戶除外吧)。然而 UNIX/Linux 恰好相反,UNIX 是以目錄為主的,Linux 也繼承了這一優良特性。 Linux 是以樹形目錄結構的形式來構建整個系統的,可以理解為一個用戶可操作系統的骨架。雖然本質上無論是目錄結構還是操作系統內核都是存儲在磁盤上的,但從邏輯上來說 Linux 的磁盤是“掛在”(掛載在)目錄上的,每一個目錄不僅能使用本地磁盤分區的文件系統,也可以使用網絡上的文件系統。舉例來說,可以利用網絡文件系統(Network File System,NFS)服務器載入某特定目錄等。

 

2.目錄路徑

路徑

有人可能不明白這路徑是指什么,有什么用。顧名思義,路徑就是你要去哪兒的路線嘛。如果你想進入某個具體的目錄或者想獲得某個目錄的文件(目錄本身也是文件)那就得用路徑來找到了。

使用 cd 命令可以切換目錄,在 Linux 里面使用 . 表示當前目錄,.. 表示上一級目錄(**注意,還記得我們上一節介紹過的,以 . 開頭的文件都是隱藏文件,所以這兩個目錄必然也是隱藏的,你可以使用 ls -a 命令查看隱藏文件), - 表示上一次所在目錄,~ 通常表示當前用戶的"home"目錄。使用 pwd 命令可以獲取當前所在路徑(絕對路徑)。

進入上一級目錄:

$ cd ..

進入你的“home”目錄:

$ cd ~ 

使用 pwd 獲取當前路徑:

$ pwd

絕對路徑

關於絕對路徑,簡單地說就是以根"/"目錄為起點的完整路徑,以你所要到的目錄為終點,表現形式如:/usr/local/bin,表示根目錄下的 usr 目錄中的 local 目錄中的 bin 目錄。

相對路徑

相對路徑,也就是相對於你當前的目錄的路徑,相對路徑是以當前目錄 . 為起點,以你所要到的目錄為終點,表現形式如: usr/local/bin (這里假設你當前目錄為根目錄)。你可能注意到,我們表示相對路徑實際並沒有加上表示當前目錄的那個 . ,而是直接以目錄名開頭,因為這個 usr 目錄為 / 目錄下的子目錄,是可以省略這個 . 的(以后會講到一個類似不能省略的情況);如果是當前目錄的上一級目錄,則需要使用 .. ,比如你當前目錄為“home”目錄,根目錄就應該表示為 ../../ ,表示上一級目錄("home"目錄)的上一級目錄("/"目錄)。

 

3.Linux 文件的基本操作

新建空白文件

在命令行中輸入:touch 用戶名

 

新建目錄

在命令行中輸入:mkdir 目錄名 或者 mkdir -p 多級目錄路徑

復制文件

在命令行中輸入:cp  文件名 目標路徑

復制目錄

在命令行中輸入:cp -r 目錄名

 

刪除文件

在命令行中輸入:rm 文件名 或者強制刪除 rm -f 文件名

 

刪除目錄

在命令行中輸入:rm -f 目錄名

 

移動文件

在命令行中輸入:mv 文件名 目標目錄

 

重命名文件

在命令行中輸入:mv 舊文件名 新文件名

 

批量重命名

使用rename命令

 

查看文件

在命令行中輸入:cat 文件名

 

nl命令

-b : 指定添加行號的方式,主要有兩種:

    -b a:表示無論是否為空行,同樣列出行號("cat -n"就是這種方式)

    -b t:只列出非空行的編號並列出(默認為這種方式)

-n : 設置行號的樣式,主要有三種:

    -n ln:在行號字段最左端顯示

    -n rn:在行號字段最右邊顯示,且不加 0

    -n rz:在行號字段最右邊顯示,且加 0

-w : 行號字段占用的位數(默認為 6 位)

 

使用more和less命令分頁查看文件

如果說上面的 cat 是用來快速查看一個文件內容的,那么這個more和less就是天生用來"閱讀"一個文件的內容的,比如說"man"手冊內部就是使用的 less 來顯示內容。其中more命令比較簡單,只能向一個方向滾動,而"less"為基於"more"和"vi"(一個強大的編輯器,我們有單獨的課程來讓你學習)開發,功能更強大。

在命令行輸入more 或者less 文件名

 

使用head和tail命令查看文件

這兩個命令那些性子比較急的人應該會比較喜歡,因為它們一個是只查看的頭幾行(默認為10行,不足10行則顯示全部)和尾幾行。還是拿 passwd 文件舉例,比如當我們想要查看最近新增加的用戶,那么我們可以查看這個/etc/passwd文件,不過我們前面也看到了,這個文件里面一大堆亂糟糟的東西,看起來實在費神啊。這里想到系統新增加一個用戶,應該會將用戶的信息添加到passwd文件的最后,那么這時候我們就可以使用tail命令了

 

查看文件類型

我們通常使用file命令可以查看文件的類型:$ file 目標文件

 

實驗截圖:

 

實驗五:環境變量與文件查找

重要知識點:

1.變量

要解釋環境變量,得先明白變量是什么,准確的說應該是 Shell 變量,所謂變量就是計算機中用於記錄一個值(不一定是數值,也可以是字符或字符串)的符號,而這些符號將用於不同的運算處理中。通常變量與值是一對一的關系,可以通過表達式讀取它的值賦值給其它變量,也可以直接指定數值賦值給任意變量。為了便於運算和處理,大部分的編程語言會區分變量的類型,用於分別記錄數值、字符或者字符串等等數據類型。Shell 中的變量也基本如此,有不同類型(但不用專門指定類型名),可以參與運算,有作用域限定。

變量的作用域即變量的有效范圍(比如一個函數中、一個源文件中或者全局范圍),在該范圍內只能有一個同名變量。一旦離開則該變量無效,如同不存在這個變量一般。

在 Shell 中如何創建一個變量,如何給變量賦值和如何讀取變量的值呢?這部分內容會在bash 腳本編程這門課中詳細介紹,這里我簡單舉例說明一下:

使用declare命令創建一個變量名為 tmp 的變量:

$ declare tmp

其實也可以不用 declare 預聲明一個變量,直接即用即創建,這里只是告訴你 declare 的作用,這在創建其它指定類型的變量(如數組)時會用到。

使用=號賦值運算符為變量 tmp 賦值為 shiyanlou:

$ tmp=shiyanlou

讀取變量的值,使用echo命令和$符號($符號用於表示引用一個變量的值,初學者經常會忘記輸入):

$ echo $tmp

 

2.環境變量

簡單理解了變量的概念,就很好解釋環境變量了,環境變量就是作用域比自定義變量要大,如Shell 的環境變量作用於自身和它的子進程。在所有的 UNIX 和類 UNIX 系統中,每個進程都有其各自的環境變量設置,且默認情況下,當一個進程被創建時,處理創建過程中明確指定的話,它將繼承其父進程的絕大部分環境設置。Shell 程序也作為一個進程運行在操作系統之上,而我們在 Shell中運行的大部分命令都將以 Shell 的子進程的方式運行。

 

通常我們會涉及到的環境變量有三種:

  • 當前 Shell 進程私有用戶自定義變量,如上面我們創建的 temp 變量,只在當前 Shell 中有效。
  • Shell 本身內建的變量。
  • 從自定義變量導出的環境變量。

也有三個與上述三種環境變量相關的命令,set,env,export。這三個命令很相似,都可以用於打印相關環境變量,區別在於涉及的是不同范圍的環境變量,詳見下表:

命令

說明

set

顯示當前 Shell 所有環境變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量

env

顯示與當前用戶相關的環境變量,還可以讓命令在指定環境中運行

export

顯示從 Shell 中導出成環境變量的變量,也能通過它將自定義變量導出為環境變量

3.命令的查找路徑與順序

你可能很早之前就有疑問,我們在 Shell 中輸入一個命令,Shell 是怎么知道在哪去找到這個命令然后執行的呢?這是通過環境變量PATH來進行搜索的,熟悉 Windows 的用戶可能知道 Windows 中的也是有這么一個 PATH 環境變量。這個PATH里面就保存了Shell中執行的命令的搜索路徑。

查看PATH環境變量的內容:

$ echo $PATH

默認情況下你會看到如下輸出:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

如果你還記得我們在 Linux 目錄結構那一節的內容,你就應該知道上面這些目錄下放的是哪一類文件了。通常這一類目錄下放的都是可執行文件,當我們在 Shell 中執行一個命令時,系統就會按照 PATH 中設定的路徑按照順序依次到目錄中去查找,如果存在同名的命令,則執行先找到的那個。

下面我們將練習創建一個最簡單的可執行 Shell 腳本和一個使用 C 語言創建的"hello world"程序,如果這兩部分內容你之前沒有學習過,那么你可以進行一個入門學習: C 語言入門教程 高級 Bash 腳本編程指南 Linux Shell Scripting Tutorial (LSST) v2.0

創建一個 Shell 腳本文件:

$ vim hello_shell.sh

在腳本中添加如下內容,保存並退出(注意不要省掉第一行,這不是注釋,論壇有用戶反應會有語法錯誤,就是因為沒有了第一行):

#!/bin/zsh

 

for ((i=0; i<10; i++));do

    echo "hello shell"

done

 

exit 0

為文件添加可執行權限:

$ chmod 755 hello_shell.sh

執行腳本

$ ./hello_shell.sh

創建一個 C 語言"hello world"程序:

$ vim hello_world.c

#include <stdio.h>

 

int main(void)

{

    printf("hello world!\n");

    return 0;

}

使用 gcc 生成可執行文件:

$ gcc -o hello_world hello_world.c

gcc 生成二進制文件默認具有可執行權限,不需要修改

在 shiyanlou 家目錄創建一個mybin目錄,並將上述 hello_shell.sh 和 hello_world 文件移動到其中:

$ mkdir mybin

$ mv hello_shell.sh hello_world mybin/

現在你可以在mybin目錄中分別運行你剛剛創建的兩個程序:

$ cd mybin

$ ./hello_shell.sh

$ ./hello_world

4.添加自定義路徑到“PATH”環境變量

在前面我們應該注意到PATH里面的路徑是以:作為分割符,所以我們可以這樣添加自定義路徑:

$ PATH=$PATH:/home/shiyanlou/mybin

注意這里一定要使用絕對路徑

現在你就可以在其他任意目錄執行那兩個命令了。你可能會意識到這樣還並沒有很好的解決問題,因為我給 PATH 環境變量追加了一個路徑,它也只是在當前 Shell 有效,我一旦退出終端,再打開就會發現又失效了。有沒有方法讓添加的環境變量全局有效?或者每次啟動 Shell 時自動執行上面添加自定義路徑到 PATH 的命令?下面我們就來說說后一種方式——讓它自動執行。

在每個用戶的 home 目錄中有一個 Shell 每次啟動時會默認執行一個配置腳本,以初始化環境,包括添加一些用戶自定義環境變量等等。zsh 的配置文件是.zshrc,相應 Bash 的配置文件為.bashrc。它們在etc下還都有一個或多個全局的配置文件,不過我們一般只修改用戶目錄下的配置文件。

我們可以簡單的使用下面命令直接添加內容到.zshrc中:

$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc

上述命令中>>表示將標准輸出以追加的方式重定向到一個文件中,注意前面用到的>是以覆蓋的方式重定向到一個文件中,使用的時候一定要注意分辨。在指定文件不存在的情況下都會創建新的文件。

5.修改和刪除已有變量

變量修改

變量的修改有以下幾種方式:

變量設置方式

說明

${變量名#匹配字串}

從頭向后開始匹配,刪除符合匹配字串的最短數據

${變量名##匹配字串}

從頭向后開始匹配,刪除符合匹配字串的最長數據

${變量名%匹配字串}

從尾向前開始匹配,刪除符合匹配字串的最短數據

${變量名%%匹配字串}

從尾向前開始匹配,刪除符合匹配字串的最長數據

${變量名/舊的字串/新的字串}

將符合舊字串的第一個字串替換為新的字串

${變量名//舊的字串/新的字串}

將符合舊字串的全部字串替換為新的字串

比如要修改我們前面添加到 PATH 的環境變量。為了避免操作失誤導致命令找不到,我們先將 PATH 賦值給一個新的自定義變量 path:

$ path=$PATH

$ echo $path

$ path=${path%/home/shiyanlou/mybin}

# 或使用通配符,*表示任意多個任意字符

$ path=${path%*/mybin}

變量刪除

可以使用unset命令刪除一個環境變量:

$ unset temp

6.如何讓環境變量立即生效

在上面我們在 Shell 中修改了一個配置腳本文件之后(比如 zsh 的配置文件 home 目錄下的.zshrc),每次都要退出終端重新打開甚至重啟主機之后其才能生效,很是麻煩,我們可以使用source命令來讓其立即生效,如:

$ source .zshrc

source命令還有一個別名就是.,注意與表示當前路徑的那個點區分開,雖然形式一樣,但作用和使用方式一樣,上面的命令如果替換成.的方式就該是

$ . ./.zshrc

注意第一個點后面有一個空格,而且后面的文件必須指定完整的絕對或相對路徑名,source 則不需要。

 

二、搜索文件

與搜索相關的命令常用的有如下幾個whereis,which,find,locate。

  • whereis簡單快速

$whereis who

 

你會看到它找到了三個路徑,兩個可執行文件路徑和一個 man 在線幫助文件所在路徑,這個搜索很快,因為它並沒有從硬盤中依次查找,而是直接從數據庫中查詢。whereis只能搜索二進制文件(-b),man幫助文件(-m)和源代碼文件(-s)。如果想要獲得更全面的搜索結果可以使用locate命令。

  • locate快而全

通過"/var/lib/mlocate/mlocate.db"數據庫查找,不過這個數據庫也不是實時更新的,系統會使用定時任務每天自動執行updatedb命令更新一次,所以有時候你剛添加的文件,它可能會找不到,需要手動執行一次updatedb命令(在我們的環境中必須先執行一次該命令)。它可以用來查找指定目錄下的不同文件類型,如查找 /etc 下所有以 sh 開頭的文件:

$ locate /etc/sh

注意,它不只是在 etc 目錄下查找並會自動遞歸子目錄進行查找

查找 /usr/share/ 下所有 jpg 文件:

$ locate /usr/share/\*.jpg

注意要添加*號前面的反斜杠轉義,否則會無法找到

如果想只統計數目可以加上-c參數,-i參數可以忽略大小寫進行查找,whereis 的-b,-m,-s同樣可以是使用。

  • which小而精

which本身是 Shell 內建的一個命令,我們通常使用which來確定是否安裝了某個指定的軟件,因為它只從PATH環境變量指定的路徑中去搜索命令:

$ which man

  • find精而細

find應該是這幾個命令中最強大的了,它不但可以通過文件類型、文件名進行查找而且可以根據文件的屬性(如文件的時間戳,文件的權限等)進行搜索。find命令強大到,要把它將明白至少需要單獨好幾節課程才行,我們這里只介紹一些常用的內容。

在指定目錄下搜索指定文件名的文件:

$ find /etc/ -name interfaces

注意 find 命令的路徑是作為第一個參數的,基本命令格式為 find [path] [option] [action]

與時間相關的命令參數:

參數

說明

-atime

最后訪問時間

-ctime

創建時間

-mtime

最后修改時間

下面以-mtime參數舉例:

  • -mtime n: n 為數字,表示為在n天之前的”一天之內“修改過的文件
  • -mtime +n: 列出在n天之前(不包含n天本身)被修改過的文件
  • -mtime -n: 列出在n天之前(包含n天本身)被修改過的文件
  • newer file: file為一個已存在的文件,列出比file還要新的文件名

 

列出 home 目錄中,當天(24 小時之內)有改動的文件:

$ find ~ -mtime 0

列出用戶家目錄下比Code文件夾新的文件:

$ find ~ -newer /home/shiyanlou/Code

 

實驗截圖:

 

實驗六:文件打包與壓縮

重要知識點:

一、文件打包和解壓縮

在講 Linux 上的解壓縮工具之前,有必要先了解以下常見常用的壓縮包文件格式。在 Windows 上我們最常見的不外乎這三種*.zip,*.rar,*.7z后綴的壓縮文件,而在 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程序壓縮的文件

講了這么多種壓縮文件,這么多個命令,不過我們一般只需要掌握幾個命令即可,包括zip,rar,tar。下面會依次介紹這幾個命令及對應的解壓命令。

1.zip壓縮打包程序

  • 使用zip打包文件夾:

$ zip -r -q -o shiyanlou.zip /home/shiyanlou

$ du -h shiyanlou.zip

$ file shiyanlou.zip

 

上面命令將 shiyanlou 的 home 目錄打包成一個文件,並查看了打包后文件的大小和類型。第一行命令中,-r參數表示遞歸打包包含子目錄的全部內容,-q參數表示為安靜模式,即不向屏幕輸出信息,-o,表示輸出文件,需在其后緊跟打包輸出文件名。后面使用du命令查看打包后文件的大小(后面會具體說明該命令)。

  • 設置壓縮級別為9和1(9最大,1最小),重新打包:

$ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou -x ~/*.zip

$ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou -x ~/*.zip

這里添加了一個參數用於設置壓縮級別-[1-9],1表示最快壓縮但體積大,9表示體積最小但耗時最久。最后那個-x是為了排除我們上一次創建的 zip 文件,否則又會被打包進這一次的壓縮文件中,注意:這里只能使用絕對路徑,否則不起作用

我們再用du命令分別查看默認壓縮級別、最低、最高壓縮級別及未壓縮的文件的大小:

$ du -h -d 0 *.zip ~ | sort

通過man 手冊可知:

  • h, --human-readable(顧名思義,你可以試試不加的情況)
  • d, --max-depth(所查看文件的深度)

這樣一目了然,你可以看到默認壓縮級別應該是最高的,效果很明顯,不過你在環境中操作之后看到的大小可能跟圖上的有些不同,因為在你使用過程中,會隨時還生成一些緩存文件在當前用戶的家目錄中,這對於我們學習命令使用來說,是無關緊要的,可以忽略這些不同。

  • 創建加密zip包

使用-e參數可以創建加密壓縮包:

$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou

注意: 關於zip命令,因為 Windows 系統與 Linux/Unix 在文本文件格式上的一些兼容問題,比如換行符(為不可見字符),在 Windows 為 CR+LF(Carriage-Return+Line-Feed:回車加換行),而在 Linux/Unix 上為 LF(換行),所以如果在不加處理的情況下,在 Linux 上編輯的文本,在 Windows 系統上打開可能看起來是沒有換行的。如果你想讓你在 Linux 創建的 zip 壓縮文件在 Windows 上解壓后沒有任何問題,那么你還需要對命令做一些修改:

$ zip -r -l -o shiyanlou.zip /home/shiyanlou

需要加上-l參數將LF轉換為CR+LF來達到以上目的。

2.使用unzip命令解壓縮zip文件

將shiyanlou.zip解壓到當前目錄:

$ unzip shiyanlou.zip

使用安靜模式,將文件解壓到指定目錄:

$ unzip -q shiyanlou.zip -d ziptest

上述指定目錄不存在,將會自動創建。如果你不想解壓只想查看壓縮包的內容你可以使用-l參數:

$ unzip -l shiyanlou.zip

注意: 使用unzip解壓文件時我們同樣應該注意兼容問題,不過這里我們關心的不再是上面的問題,而是中文編碼的問題,通常 Windows 系統上面創建的壓縮文件,如果有有包含中文的文檔或以中文作為文件名的文件時默認會采用 GBK 或其它編碼,而 Linux 上面默認使用的是 UTF-8 編碼,如果不加任何處理,直接解壓的話可能會出現中文亂碼的問題(有時候它會自動幫你處理),為了解決這個問題,我們可以在解壓時指定編碼類型。

使用-O(英文字母,大寫o)參數指定編碼類型:

unzip -O GBK 中文壓縮文件.zip

3.rar打包壓縮命令

rar也是 Windows 上常用的一種壓縮文件格式,在 Linux 上可以使用rar和unrar工具分別創建和解壓 rar 壓縮包。

  • 安裝rar和unrar工具:

$ sudo apt-get update

$ sudo apt-get install rar unrar

  • 從指定文件或目錄創建壓縮包或添加文件到壓縮包:

$ rm *.zip

$ rar a shiyanlou.rar .

上面的命令使用a參數添加一個目錄~到一個歸檔文件中,如果該文件不存在就會自動創建。

注意:rar 的命令參數沒有-,如果加上會報錯。

  • 從指定壓縮包文件中刪除某個文件:

$ rar d shiyanlou.rar .zshrc

  • 查看不解壓文件:

$ rar l shiyanlou.rar

  • 使用unrar解壓rar文件

全路徑解壓:

$ unrar x shiyanlou.rar

去掉路徑解壓:

$ mkdir tmp

$ unrar e shiyanlou.rar tmp/

rar命令參數非常多,上面只涉及了一些基本操作

4.tar打包工具

在 Linux 上面更常用的是tar工具,tar 原本只是一個打包工具,只是同時還是實現了對 7z,gzip,xz,bzip2 等工具的支持,這些壓縮工具本身只能實現對文件或目錄(單獨壓縮目錄中的文件)的壓縮,沒有實現對文件的打包壓縮,所以我們也無需再單獨去學習其他幾個工具,tar 的解壓和壓縮都是同一個命令,只需參數不同,使用比較方便。

下面先掌握tar命令一些基本的使用方式,即不進行壓縮只是進行打包(創建歸檔文件)和解包的操作。

  • 創建一個 tar 包:

$ tar -cf shiyanlou.tar ~

  • 解包一個文件(-x參數)到指定路徑的已存在目錄(-C參數):

$ mkdir tardir

$ tar -xf shiyanlou.tar -C tardir

  • 只查看不解包文件-t參數:

$ tar -tf shiyanlou.tar

  • 保留文件屬性和跟隨鏈接(符號鏈接或軟鏈接),有時候我們使用tar備份文件當你在其他主機還原時希望保留文件的屬性(-p參數)和備份鏈接指向的源文件而不是鏈接本身(-h參數):

$ tar -cphf etc.tar /etc

對於創建不同的壓縮格式的文件,對於tar來說是相當簡單的,需要的只是換一個參數,這里我們就以使用gzip工具創建*.tar.gz文件為例來說明。

  • 我們只需要在創建 tar 文件的基礎上添加-z參數,使用gzip來壓縮文件:

$ tar -czf shiyanlou.tar.gz ~

  • 解壓*.tar.gz文件:

$ tar -xzf shiyanlou.tar.gz

壓縮文件格式

參數

*.tar.gz

-z

*.tar.xz

-J

*tar.bz2

-j

實驗截圖:

 

 實驗七:文件系統操作與磁盤管理

重要知識點:

一、簡單文件系統操作

1.查看磁盤和目錄的容量

使用 df 命令查看磁盤的容量

$ df

使用 du 命令查看目錄的容量

這個命令前面其實已經用了很多次了:

# 默認同樣以 blocks 的大小展示

$ du

# 加上`-h`參數,以更易讀的方式展示

$ du -h

-d參數指定查看目錄的深度

# 只查看1級目錄的信息

$ du -h -d 0 ~

# 查看2級

$ du -h -d 1 ~

二、簡單的磁盤管理

下面涉及的命令具有一定的危險性,操作不當可能會丟失你的個人數據,初學者建議在虛擬環境中進行操作

通常情況下,這一小節應該直接將如何掛載卸載磁盤,如何格式化磁盤,如何分區,但如你所見,我們的環境中沒東西給你掛,也沒東西給你格和分,所以首先我們會先創建一個虛擬磁盤來進行后續的練習操作

1.創建虛擬磁盤

dd 命令簡介(部分說明來自dd (Unix) wiki))

dd命令用於轉換和復制文件,不過它的復制不同於cp。之前提到過關於 Linux 的很重要的一點,一切即文件,在 Linux 上,硬件的設備驅動(如硬盤)和特殊設備文件(如/dev/zero和/dev/random)都像普通文件一樣,只要在各自的驅動程序中實現了對應的功能,dd 也可以讀取自和/或寫入到這些文件。這樣,dd也可以用在備份硬件的引導扇區、獲取一定數量的隨機數據或者空數據等任務中。dd程序也可以在復制時處理數據,例如轉換字節序、或在 ASCII 與 EBCDIC 編碼間互換。

dd的命令行語句與其他的 Linux 程序不同,因為它的命令行選項格式為選項=值,而不是更標准的--選項 值或-選項=值。dd默認從標准輸入中讀取,並寫入到標准輸出中,但可以用選項if(input file,輸入文件)和of(output file,輸出文件)改變。

我們先來試試用dd命令從標准輸入讀入用戶輸入到標准輸出或者一個文件:

# 輸出到文件

$ dd of=test bs=10 count=1 # 或者 dd if=/dev/stdin of=test bs=10 count=1

# 輸出到標准輸出

$ dd if=/dev/stdin of=/dev/stdout bs=10 count=1

前面說到dd在拷貝的同時還可以實現數據轉換,那下面就舉一個簡單的例子:將輸出的英文字符轉換為大寫再寫入文件:

$ dd if=/dev/stdin of=test bs=10 count=1 conv=ucase

使用 dd 命令創建虛擬鏡像文件

通過上面一小節,你應該掌握了dd的基本使用,下面就來使用dd命令來完成創建虛擬磁盤的第一步。

從/dev/zero設備創建一個容量為 256M 的空文件:

$ dd if=/dev/zero of=virtual.img bs=1M count=256

$ du -h virtual.img

然后我們要將這個文件格式化(寫入文件系統),這里我們要學到一個(准確的說是一組)新的命令來完成這個需求。

使用 mkfs 命令格式化磁盤(我們這里是自己創建的虛擬磁盤鏡像)

你可以在命令行輸入 mkfs 然后按下Tab鍵,你可以看到很多個以 mkfs 為前綴的命令,這些不同的后綴其實就是表示着不同的文件系統,可以用 mkfs 格式化成的文件系統:

我們可以簡單的使用下面的命令來將我們的虛擬磁盤鏡像格式化為ext4文件系統:

$ mkfs.ext4 virtual.img

使用 mount 命令掛載磁盤到目錄樹

用戶在 Linux/UNIX 的機器上打開一個文件以前,包含該文件的文件系統必須先進行掛載的動作,此時用戶要對該文件系統執行 mount 的指令以進行掛載。通常是使用在 USB 或其他可移除存儲設備上,而根目錄則需要始終保持掛載的狀態。又因為 Linux/UNIX 文件系統可以對應一個文件而不一定要是硬件設備,所以可以掛載一個包含文件系統的文件到目錄樹。

Linux/UNIX 命令行的 mount 指令是告訴操作系統,對應的文件系統已經准備好,可以使用了,而該文件系統會對應到一個特定的點(稱為掛載點)。掛載好的文件、目錄、設備以及特殊文件即可提供用戶使用。

我們先來使用mount來查看下主機已經掛載的文件系統:

$ sudo mount

那么我們如何掛載真正的磁盤到目錄樹呢,mount命令的一般格式如下:

mount [options] [source] [directory]

一些常用操作:

mount [-o [操作選項]] [-t 文件系統類型] [-w|--rw|--ro] [文件系統源] [掛載點]

我們現在直接來掛載我們創建的虛擬磁盤鏡像到/mnt目錄:

$ mount -o loop -t ext4 virtual.img /mnt

# 也可以省略掛載類型,很多時候 mount 會自動識別

 

# 以只讀方式掛載

$ mount -o loop --ro virtual.img /mnt

# 或者mount -o loop,ro virtual.img /mnt

使用 umount 命令卸載已掛載磁盤

# 命令格式 sudo umount 已掛載設備名或者掛載點,如:

$ sudo umount /mnt

 

# 查看硬盤分區表信息

$ sudo fdisk -l

 

# 進入磁盤分區模式

$ sudo fdisk virtual.img

實驗截圖:

問題:

已安裝了程序但卻 command not found

 

 實驗八:命令執行順序控制與管道

重要知識點:

一、命令執行順序的控制

1.順序執行多條命令

通常情況下,我們每次只能在終端輸入一條命令,按下回車執行,執行完成后,我們再輸入第二條命令,然后再按回車執行…… 你可能會遇到如下使用場景:我需要使用apt-get安裝一個軟件,然后安裝完成后立即運行安裝的軟件(或命令工具),又恰巧你的主機才更換的軟件源還沒有更新軟件列表(比如之前我們的環境中,每次重新開始實驗就得sudo apt-get update,現在已經沒有這個問題了),那么你可能會有如下一系列操作:

$ sudo apt-get update

# 等待——————————然后輸入下面的命令

$ sudo apt-get install some-tool

# 等待——————————然后輸入下面的命令

$ some-tool

這時你可能就會想要是我可以一次性輸入完,讓它自己去一次執行各命令就好了,這就是我們這一小節要解決的問題。

簡單的順序執行你可以使用;來完成,比如上述操作你可以:

$ sudo apt-get update;sudo apt-get install some-tool;some-tool

# 讓它自己運行

2.有選擇的執行命令

關於上面的操作,不知你有沒有思考過一個問題,如果我們在讓它自動順序執行命令時,前面的命令執行不成功,而后面的命令又依賴與上一條命令的結果,那么就會造成花了時間,最終卻得到一個錯誤的結果,而且有時候直觀的看你還無法判斷結果是否正確。那么我們需要能夠有選擇性的來執行命令,比如上一條命令執行成功才繼續下一條,或者不成功又該做出其它什么處理,比如我們使用which來查找是否安裝某個命令,如果找到就執行該命令,否則什么也不做(雖然這個操作沒有什么實際意義,但可幫你更好的理解一些概念):

$ which cowsay>/dev/null && cowsay -f head-in ohch~

二、管道

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

管道又分為匿名管道和具名管道(這里將不會討論在源程序中使用系統調用創建並使用管道的情況,它與命令行的管道在內核中實際都是采用相同的機制)。我們在使用一些過濾程序時經常會用到的就是匿名管道,在命令行中由|分隔符表示,|在前面的內容中我們已經多次使用到了。具名管道簡單的說就是有名字的管道,通常只會在源程序中用到具名管道。下面我們就將通過一些常用的可以使用管道的"過濾程序"來幫助你熟練管道的使用。

1.試用

先試用一下管道,比如查看/etc目錄下有哪些文件和目錄,使用ls命令來查看:

$ ls -al /etc

有太多內容,屏幕不能完全顯示,這時候可以使用滾動條或快捷鍵滾動窗口來查看。不過這時候可以使用管道:

$ ls -al /etc | less

通過管道將前一個命令(ls)的輸出作為下一個命令(less)的輸入,然后就可以一行一行地看。

2.cut 命令,打印每一行的某一字段

打印/etc/passwd文件中以:為分隔符的第1個字段和第6個字段分別表示用戶名和其家目錄:

$ cut /etc/passwd -d ':' -f 1,6

打印/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

3.grep 命令,在文本中或 stdin 中查找匹配字符串

grep命令是很強大的,也是相當常用的一個命令,它結合正則表達式可以實現很復雜卻很高效的匹配和查找,不過在學習正則表達式之前,這里介紹它簡單的使用,而關於正則表達式后面將會有單獨一小節介紹到時會再繼續學習grep命令和其他一些命令。

grep命令的一般形式為:

grep [命令選項]... 用於匹配的表達式 [文件]...

還是先體驗一下,我們搜索/home/shiyanlou目錄下所有包含"shiyanlou"的所有文本文件,並顯示出現在文本中的行號:

$ grep -rnI "shiyanlou" ~

 

# 查看環境變量中以"yanlou"結尾的字符串

$ export | grep ".*yanlou$"

4. wc 命令,簡單小巧的計數工具

wc 命令用於統計並輸出一個文件中行、單詞和字節的數目,比如輸出/etc/passwd文件的統計信息:

$ wc /etc/passwd

分別只輸出行數、單詞數、字節數、字符數和輸入文本中最長一行的字節數:

# 行數

$ wc -l /etc/passwd

# 單詞數

$ wc -w /etc/passwd

# 字節數

$ wc -c /etc/passwd

# 字符數

$ wc -m /etc/passwd

# 最長行字節數

$ wc -L /etc/passwd

注意:對於西文字符來說,一個字符就是一個字節,但對於中文字符一個漢字是大於2個字節的,具體數目是由字符編碼決定的

 

5.sort 排序命令

這個命令前面我們也是用過多次,功能很簡單就是將輸入按照一定方式排序,然后再輸出,它支持的排序有按字典排序,數字排序,按月份排序,隨機排序,反轉排序,指定特定字段進行排序等等。

默認為字典排序:

$ cat /etc/passswd | sort

反轉排序:

$ cat /etc/passwd | sort -r

按特定字段排序:

$ cat /etc/passwd | sort -t':' -k 3

上面的-t參數用於指定字段的分隔符,這里是以":"作為分隔符;-k 字段號用於指定對哪一個字段進行排序。這里/etc/passwd文件的第三個字段為數字,默認情況下是一字典序排序的,如果要按照數字排序就要加上-n參數:

$ cat /etc/passwd | sort -t':' -k 3 -n

6. uniq 去重命令

uniq命令可以用於過濾或者輸出重復行。

  • 過濾重復行

我們可以使用history命令查看最近執行過的命令(實際為讀取${SHELL}_history文件,如我們環境中的~/.zsh_history文件),不過你可能只想查看使用了那個命令而不需要知道具體干了什么,那么你可能就會要想去掉命令后面的參數然后去掉重復的命令:

$ history | cut -c 8- | cut -d ' ' -f 1 | uniq

然后經過層層過濾,你會發現確是只輸出了執行的命令那一列,不過去重效果好像不明顯,仔細看你會發現它趨勢去重了,只是不那么明顯,之所以不明顯是因為uniq命令只能去連續重復的行,不是全文去重,所以要達到預期效果,我們先排序:

$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq

# 或者$ history | cut -c 8- | cut -d ' ' -f 1 | sort -u

這就是 Linux/UNIX 哲學吸引人的地方,大繁至簡,一個命令只干一件事卻能干到最好。

  • 輸出重復行

# 輸出重復過的行(重復的只輸出一個)及重復次數

$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc

# 輸出所有重復的行

$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D

文本處理命令還有很多,下一節將繼續介紹一些常用的文本處理的命令。

 

實驗截圖:

 

 實驗九:簡單的文本處理

 

文本處理命令

1.tr 命令

tr 命令可以用來刪除一段文本信息中的某些文字。或者將其進行轉換。

使用方式:

tr [option]...SET1 [SET2]

常用的選項有:

選項

說明

-d

刪除和set1匹配的字符,注意不是全詞匹配也不是按字符順序匹配

-s

去除set1指定的在輸入文本中連續並重復的字符

操作舉例:

# 刪除 "hello shiyanlou" 中所有的'o','l','h'

$ echo 'hello shiyanlou' | tr -d 'olh'

# 將"hello" 中的ll,去重為一個l

$ echo 'hello' | tr -s 'l'

# 將輸入文本,全部轉換為大寫或小寫輸出

$ cat /etc/passwd | tr '[:lower:]' '[:upper:]'

# 上面的'[:lower:]' '[:upper:]'你也可以簡單的寫作'[a-z]' '[A-Z]',當然反過來將大寫變小寫也是可以的

2.col 命令

col 命令可以將Tab換成對等數量的空格建,或反轉這個操作。

使用方式:

col [option]

常用的選項有:

選項

說明

-x

將Tab轉換為空格

-h

將空格轉換為Tab(默認選項)

操作舉例:

# 查看 /etc/protocols 中的不可見字符,可以看到很多 ^I ,這其實就是 Tab 轉義成可見字符的符號

$ cat -A /etc/protocols

# 使用 col -x 將 /etc/protocols 中的 Tab 轉換為空格,然后再使用 cat 查看,你發現 ^I 不見了

$ cat /etc/protocols | col -x | cat -A

3.join命令

學過數據庫的用戶對這個應該不會陌生,這個命令就是用於將兩個文件中包含相同內容的那一行合並在一起。

使用方式:

join [option]... file1 file2

常用的選項有:

選項

說明

-t

指定分隔符,默認為空格

-i

忽略大小寫的差異

-1

指明第一個文件要用哪個字段來對比,,默認對比第一個字段

-2

指明第二個文件要用哪個字段來對比,,默認對比第一個字段

操作舉例:

# 創建兩個文件

$ echo '1 hello' > file1

$ echo '1 shiyanlou' > file2

$ join file1 file2

# 將/etc/passwd與/etc/shadow兩個文件合並,指定以':'作為分隔符

$ sudo join -t':' /etc/passwd /etc/shadow

# 將/etc/passwd與/etc/group兩個文件合並,指定以':'作為分隔符, 分別比對第4和第3個字段

$ sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group

4.paste命令

paste這個命令與join 命令類似,它是在不對比數據的情況下,簡單地將多個文件合並一起,以Tab隔開。

使用方式:

paste [option] file...

常用的選項有:

選項

說明

-d

指定合並的分隔符,默認為Tab

-s

不合並到一行,每個文件為一行

操作舉例:

$ echo hello > file1

$ echo shiyanlou > file2

$ echo www.shiyanlou.com > file3

$ paste -d ':' file1 file2 file3

$ paste -s file1 file2 file3

實驗截圖:

 

 

問題:

 

 實驗十:數據流重定向

重要知識點

一、數據流重定向

下面我們簡單的回顧一下我們前面經常用到的兩個重定向操作:

$ echo 'hello shiyanlou' > redirect

$ echo 'www.shiyanlou.com' >> redirect

$ cat redirect

當然前面沒有用到的<和<<操作也是沒有問題的,如你理解的一樣,它們的區別在於重定向的方向不一致而已,>表示是從左到右,<右到左。

1.簡單的重定向

在更多了解 Linux 的重定向之前,我們需要先知道一些基本的東西,前面我們已經提到過 Linux 默認提供了三個特殊設備,用於終端的顯示和輸出,分別為stdin(標准輸入,對應於你在終端的輸入),stdout(標准輸出,對應於終端的輸出),stderr(標准錯誤輸出,對應於終端的輸出)。

文件描述符

設備文件

說明

0

/dev/stdin

標准輸入

1

/dev/stdout

標准輸出

2

/dev/stderr

標准錯誤

文件描述符:文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。在程序設計中,一些涉及底層的程序編寫往往會圍繞着文件描述符展開。但是文件描述符這一概念往往只適用於 UNIX、Linux 這樣的操作系統。

另外還有一個符號-,它可以同時作為前一個命令的。

我們可以這樣使用這些文件描述符:

默認使用終端的標准輸入作為命令的輸入和標准輸出作為命令的輸出

$ cat        

(按Ctrl+C退出)

將cat的連續輸出(heredoc方式)重定向到一個文件

$ mkdir Documents

$ cat > Documents/test.c\~ <<EOF

#include <stdio.h>

 

int main()

{

    printf("hello world\n");

    return 0;

}

 

EOF

將一個文件作為命令的輸入,標准輸出作為命令的輸出

$ cat Documents/test.c\~

將echo命令通過管道傳過來的數據作為cat命令的輸入,將標准輸出作為命令的輸出

$ echo 'hi' | cat

將echo命令的輸出從默認的標准輸出重定向到一個普通文件

$ echo 'hello shiyanlou' > redirect

$ cat redirect

2.標准錯誤重定向

重定向標准輸出到文件,這是一個很實用的操作,另一個很實用的操作是將標准錯誤重定向,標准輸出和標准錯誤都被指向偽終端的屏幕顯示,所以我們經常看到的一個命令的輸出通常是同時包含了標准輸出和標准錯誤的結果的。比如下面的操作:

# 使用cat 命令同時讀取兩個文件,其中一個存在,另一個不存在

$ cat Documents/test.c\~ hello.c

# 你可以看到除了正確輸出了前一個文件的內容,還在末尾出現了一條錯誤信息

# 下面我們將輸出重定向到一個文件,根據我們前面的經驗,這里將在看不到任何輸出了

$ cat Documents/test.c\~ hello.c > somefile

3.使用tee命令同時重定向到多個文件

經常你可能還有這樣的需求,除了將需要將輸出重定向到文件之外也需要將信息打印在終端,那么你可以使用tee命令來實現:

$ echo 'hello shiyanlou' | tee hello

4.永久重定向

你應該可以看出我們前面的重定向操作都只是臨時性的,即只對當前命令有效,那如何做到“永久”有效呢,比如在一個腳本中,你需要某一部分的命令的輸出全部進行重定向,難道要讓你在每個命令上面加上臨時重定向的操作嘛,當然不需要,我們可以使用exec命令實現“永久”重定向。exec命令的作用是使用指定的命令替換當前的 Shell,及使用一個進程替換當前進程,或者指定新的重定向:

# 先開啟一個子 Shell

$ zsh

# 使用exec替換當前進程的重定向,將標准輸出重定向到一個文件

$ exec 1>somefile

# 后面你執行的命令的輸出都將被重定向到文件中,直到你退出當前子shell,或取消exec的重定向(后面將告訴你怎么做)

$ ls

$ exit

$ cat somefile

 

5.創建輸出文件描述符

默認在 Shell 中可以有9個打開的文件描述符,上面我們使用了也是它默認提供的0,1,2號文件描述符,另外我們還可以使用3-8的文件描述符,只是它們默認沒有打開而已,你可以使用下面命令查看當前 Shell 進程中打開的文件描述符:

$ cd /dev/fd/;ls -Al

同樣使用exec命令可以創建新的文件描述符:

$ zsh

$ exec 3>somefile

# 先進入目錄,再查看,否則你可能不能得到正確的結果,然后再回到上一次的目錄

$ cd /dev/fd/;ls -Al;cd -

# 注意下面的命令>與&之間不應該有空格,如果有空格則會出錯

$ echo "this is test" >&3

$ cat somefile

$ exit

6.關閉文件描述符

如上面我們打開的3號文件描述符,可以使用如下操作將它關閉:

$ exec 3>&-

$ cd /dev/fd;ls -Al;cd -

7.完全屏蔽命令的輸出

在 Linux 中有一個被成為“黑洞”的設備文件,所以導入它的數據都將被“吞噬”。

在類 UNIX 系統中,/dev/null,或稱空設備,是一個特殊的設備文件,它通常被用於丟棄不需要的輸出流,或作為用於輸入流的空文件,這些操作通常由重定向完成。讀取它則會立即得到一個EOF。

我們可以利用設個/dev/null屏蔽命令的輸出:

$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1

向上面這樣的操作將使你得不到任何輸出結果。

8.使用 xargs 分割參數列表

xargs 是一條 UNIX 和類 UNIX 操作系統的常用命令。它的作用是將參數列表轉換成小塊分段傳遞給其他命令,以避免參數列表過長的問題。

這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 find,locate 和 grep 的結果,詳細用法請參看 man 文檔。

$ cut -d: -f1 < /etc/passwd | sort | xargs echo

上面這個命令用於將/etc/passwd文件按:分割取第一個字段排序后,使用echo命令生成一個列表。

 

實驗截圖:

 

實驗十一:正則表達式基礎

重要知識點:

一、正則表達式

什么是正則表達式呢?

正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為 regex、regexp 或 RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。

許多程序設計語言都支持利用正則表達式進行字符串操作。例如,在 Perl 中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由 UNIX 中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數有 regexp、regex,復數有 regexps、regexes、regexen。

簡單的說形式和功能上正則表達式和我們前面講的通配符很像,不過它們之間又有很大差別,特別在於一些特殊的匹配字符的含義上,希望初學者注意不要將兩者弄混淆。

 

1. 舉例

 

假設我們有這樣一個文本文件,包含"shiyanlou",和"shilouyan"這兩個字符串,同樣一個表達式:

shi*

如果這作為一個正則表達式,它將只能匹配 shi,而如果不是作為正則表達式*作為一個通配符,則將同時匹配這兩個字符串。這是為什么呢?因為在正則表達式中*表示匹配前面的子表達式(這里就是它前面一個字符)零次或多次,比如它可以匹配"sh","shii","shish","shiishi"等等,而作為通配符表示匹配通配符后面任意多個任意字符,所以它可以匹配"shiyanlou",和"shilouyan"兩個字符。

體驗完了,下面就來開始正式學習正則表達式吧。

2.基本語法:

一個正則表達式通常被稱為一個模式(pattern),為用來描述或者匹配一系列符合某個句法規則的字符串。

選擇

|豎直分隔符表示選擇,例如"boy|girl"可以匹配"boy"或者"girl"

數量限定

數量限定除了我們舉例用的*,還有+加號,?問號,.點號,如果在一個模式中不加數量限定符則表示出現一次且僅出現一次:

  • +表示前面的字符必須出現至少一次(1次或多次),例如,"goo+gle",可以匹配"gooogle","goooogle"等;
  • ?表示前面的字符最多出現一次(0次或1次),例如,"colou?r",可以匹配"color"或者"colour";
  • *星號代表前面的字符可以不出現,也可以出現一次或者多次(0次、或1次、或多次),例如,“0*42”可以匹配42、042、0042、00042等。

范圍和優先級

()圓括號可以用來定義模式字符串的范圍和優先級,這可以簡單的理解為是否將括號內的模式串作為一個整體。例如,"gr(a|e)y"等價於"gray|grey",(這里體現了優先級,豎直分隔符用於選擇a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(這里體驗了范圍,?將圓括號內容作為一個整體匹配)。

語法(部分)

正則表達式有多種不同的風格,下面列舉一些常用的作為 PCRE 子集的適用於perl和python編程語言及grep或egrep的正則表達式匹配規則:(由於markdown表格解析的問題,下面的豎直分隔符用全角字符代替,實際使用時請換回半角字符)

PCRE(Perl Compatible Regular Expressions中文含義:perl語言兼容正則表達式)是一個用 C 語言編寫的正則表達式函數庫,由菲利普.海澤(Philip Hazel)編寫。PCRE是一個輕量級的函數庫,比Boost 之類的正則表達式庫小得多。PCRE 十分易用,同時功能也很強大,性能超過了 POSIX 正則表達式庫和一些經典的正則表達式庫。

字符

描述

\

將下一個字符標記為一個特殊字符、或一個原義字符。例如,“n”匹配字符“n”。“\n”匹配一個換行符。序列“\\”匹配“\”而“\(”則匹配“(”。

^

匹配輸入字符串的開始位置。

$

匹配輸入字符串的結束位置。

{n}

n是一個非負整數。匹配確定的n。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。

{n,}

n是一個非負整數。至少匹配n。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。

{n,m}

m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價於“o?”。請注意在逗號和兩個數之間不能有空格。

*

匹配前面的子表達式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等價於{0,}。

+

匹配前面的子表達式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價於{1,}。

?

匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價於{0,1}。

?

當該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對於字符串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。

.

匹配除“\n”之外的任何單個字符。要匹配包括“\n”在內的任何字符,請使用像“(.|\n)”的模式。

(pattern)

匹配pattern並獲取這一匹配的子字符串。該子字符串用於向后引用。要匹配圓括號字符,請使用“\(”或“\)”。

x|y

匹配xy。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”則匹配“zood”或“food”。

[xyz]

字符集合(character class)。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”。其中特殊字符僅有反斜線\保持特殊含義,用於轉義字符。其它特殊字符如星號、加號、各種括號等均作為普通字符。脫字符^如果出現在首位則表示負值字符集合;如果出現在字符串中間就僅作為普通字符。連字符 - 如果出現在字符串中間表示字符范圍描述;如果如果出現在首位則僅作為普通字符。

[^xyz]

排除型(negate)字符集合。匹配未列出的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。

[a-z]

字符范圍。匹配指定范圍內的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內的任意小寫字母字符。

[^a-z]

排除型的字符范圍。匹配任何不在指定范圍內的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范圍內的任意字符。

優先級

優先級為從上到下從左到右,依次降低:

運算符

說明

\

轉義符

(), (?:), (?=), []

括號和中括號

*、+、?、{n}、{n,}、{n,m}

限定符

^、$、\任何元字符

定位點和序列

 選擇

更多正則表達式的內容可以參考以下鏈接:

  • 正則表達式wiki
  • 幾種正則表達式引擎的語法差異
  • 各語言各平台對正則表達式的支持

二、grep模式匹配命令

上面空談了那么多正則表達式的內容也並沒有提及具體該如何使用它,實在枯燥,如果說正則表達式是一門武功話,那它也只能算得上一些口訣招式罷了,要把它真正練起來還得需要一些兵器在手才行,這里我們要介紹的grep命令以及后面要講的sed,awk這些就該算作是這樣的兵器了。

1.基本操作

grep命令用於打印輸出文本中匹配的模式串,它使用正則表達式作為模式匹配的條件。grep支持三種正則表達式引擎,分別用三個參數指定:

參數

說明

-E

POSIX擴展正則表達式,ERE

-G

POSIX基本正則表達式,BRE

-P

Perl正則表達式,PCRE

不過在你沒學過perl語言的大多數情況下你將只會使用到ERE和BRE,所以我們接下來的內容都不會討論到PCRE中特有的一些正則表達式語法(它們之間大部分內容是存在交集的,所以你不用擔心會遺漏多少重要內容)

在通過grep命令使用正則表達式之前,先介紹一下它的常用參數:

參數

說明

-b

將二進制文件作為文本來進行匹配

-c

統計以模式匹配的數目

-i

忽略大小寫

-n

顯示匹配文本所在行的行號

-v

反選,輸出不匹配行的內容

-r

遞歸匹配查找

-A n

n為正整數,表示after的意思,除了列出匹配行之外,還列出后面的n行

-B n

n為正整數,表示before的意思,除了列出匹配行之外,還列出前面的n行

--color=auto

將輸出中的匹配項設置為自動顏色顯示

注:在大多數發行版中是默認設置了grep的顏色的,你可以通過參數指定或修改GREP_COLOR環境變量。

 

2.使用正則表達式

使用基本正則表達式,BRE

  • 位置

查找/etc/group文件中以"shiyanlou"為開頭的行

$ grep 'shiyanlou' /etc/group

$ grep '^shiyanlou' /etc/group

  • 數量

# 將匹配以'z'開頭以'o'結尾的所有字符串

$ echo 'zero\nzo\nzoo' | grep 'z.*o'

# 將匹配以'z'開頭以'o'結尾,中間包含一個任意字符的字符串

$ echo 'zero\nzo\nzoo' | grep 'z.o'

# 將匹配以'z'開頭,以任意多個'o'結尾的字符串

$ echo 'zero\nzo\nzoo' | grep 'zo*'

注意:其中\n為換行符

 

  • 選擇

# grep默認是區分大小寫的,這里將匹配所有的小寫字母

$ echo '1234\nabcd' | grep '[a-z]'

# 將匹配所有的數字

$ echo '1234\nabcd' | grep '[0-9]'

# 將匹配所有的數字

$ echo '1234\nabcd' | grep '[[:digit:]]'

# 將匹配所有的小寫字母

$ echo '1234\nabcd' | grep '[[:lower:]]'

# 將匹配所有的大寫字母

$ echo '1234\nabcd' | grep '[[:upper:]]'

# 將匹配所有的字母和數字,包括0-9,a-z,A-Z

$ echo '1234\nabcd' | grep '[[:alnum:]]'

# 將匹配所有的字母

$ echo '1234\nabcd' | grep '[[:alpha:]]'

 

下面包含完整的特殊符號及說明:

特殊符號

說明

[:alnum:]

代表英文大小寫字節及數字,亦即 0-9, A-Z, a-z

[:alpha:]

代表任何英文大小寫字節,亦即 A-Z, a-z

[:blank:]

代表空白鍵與 [Tab] 按鍵兩者

[:cntrl:]

代表鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等

[:digit:]

代表數字而已,亦即 0-9

[:graph:]

除了空白字節 (空白鍵與 [Tab] 按鍵) 外的其他所有按鍵

[:lower:]

代表小寫字節,亦即 a-z

[:print:]

代表任何可以被列印出來的字節

[:punct:]

代表標點符號 (punctuation symbol),亦即:" ' ? ! ; : # $...

[:upper:]

代表大寫字節,亦即 A-Z

[:space:]

任何會產生空白的字節,包括空白鍵, [Tab], CR 等等

[:xdigit:]

代表 16 進位的數字類型,因此包括: 0-9, A-F, a-f 的數字與字節

注意:之所以要使用特殊符號,是因為上面的[a-z]不是在所有情況下都管用,這還與主機當前的語系有關,即設置在LANG環境變量的值,zh_CN.UTF-8的話[a-z],即為所有小寫字母,其它語系可能是大小寫交替的如,"a A b B...z Z",[a-z]中就可能包含大寫字母。所以在使用[a-z]時請確保當前語系的影響,使用[:lower:]則不會有這個問題。

# 排除字符

$ echo 'geek|good' | grep '[^o]'

注意:當^放到中括號內為排除字符,否則表示行首。

使用擴展正則表達式,ERE

要通過grep使用擴展正則表達式需要加上-E參數,或使用egrep。

  • 數量

# 只匹配"zo"

$ echo 'zero\nzo\nzoo' | grep -E 'zo{1}'

# 匹配以"zo"開頭的所有單詞

$ echo 'zero\nzo\nzoo' | grep -E 'zo{1,}'

注意:推薦掌握{n,m}即可,+,?,*,這幾個不太直觀,且容易弄混淆。

  • 選擇

# 匹配"www.shiyanlou.com"和"www.google.com"

$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -E 'www\.(shiyanlou|google)\.com'

# 或者匹配不包含"baidu"的內容

$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -Ev 'www\.baidu\.com'

注意:因為.號有特殊含義,所以需要轉義。

關於正則表達式和grep命令的內容就介紹這么多,下面會介紹兩個更強大的工具sed和awk,但同樣也正是因為這兩個工具的強大,我們的內容無法包含它們的全部,這里將只對基本內容作介紹。

三、sed 流編輯器

sed工具在 man 手冊里面的全名為"sed - stream editor for filtering and transforming text ",意即,用於過濾和轉換文本的流編輯器。

在 Linux/UNIX 的世界里敢稱為編輯器的工具,大都非等閑之輩,比如前面的"vi/vim(編輯器之神)","emacs(神的編輯器)","gedit"這些個編輯器。sed與上述的最大不同之處大於它是一個非交互式的編輯器,下面我們就開始介紹sed這個編輯器。

sed常用參數介紹

sed 命令基本格式:

sed [參數]... [執行命令] [輸入文件]...

# 形如:

$ sed -i '1s/sad/happy/' test # 表示將test文件中第一行的"sad"替換為"happy"

參數

說明

-n

安靜模式,只打印受影響的行,默認打印輸入數據的全部內容

-e

用於在腳本中添加多個執行命令一次執行,在命令行中執行多個命令通常不需要加該參數

-f filename

指定執行filename文件中的命令

-r

使用擴展正則表達式,默認為標准正則表達式

-i

將直接修改輸入文件內容,而不是打印到標准輸出設備

sed編輯器的執行命令(這里”執行“解釋為名詞)

sed執行命令格式:

[n1][,n2]command

[n1][~step]command

# 其中一些命令可以在后面加上作用范圍,形如:

$ sed -i 's/sad/happy/g' test # g表示全局范圍

$ sed -i 's/sad/happy/4' test # 4表示指定行中的第四個匹配字符串

其中n1,n2表示輸入內容的行號,它們之間為,逗號則表示從n1到n2行,如果為~波浪號則表示從n1開始以step為步進的所有行;command為執行動作,下面為一些常用動作指令:

命令

說明

s

行內替換

c

整行替換

a

插入到指定行的后面

i

插入到指定行的前面

p

打印指定行,通常與-n參數配合使用

d

刪除指定行

sed操作舉例

我們先找一個用於練習的文本文件:

$ cp /etc/passwd ~

打印指定行

# 打印2-5行

$ nl passwd | sed -n '2,5p'

# 打印奇數行

$ nl passwd | sed -n '1~2p'

行內替換

# 將輸入文本中"shiyanlou" 全局替換為"hehe",並只打印替換的那一行,注意這里不能省略最后的"p"命令

$ sed -n 's/shiyanlou/hehe/gp' passwd

注意: 行內替換可以結合正則表達式使用。

行間替換

$ nl passwd | grep "shiyanlou"

# 刪除第21行

$ sed -n '21c\www.shiyanlou.com' passwd

 

四、awk文本處理語言

看到上面的標題,你可能會感到驚異,難道我們這里要學習的是一門“語言”么,確切的說,我們是要在這里學習awk文本處理語言,只是我們並不會在這里學習到比較完整的關於awk的內容,還是因為前面的原因,它太強大了,它的應用無處不在,我們無法在這里以簡短的文字描述面面俱到,如果你有目標成為一個linux系統管理員,確實想學好awk,你一不用擔心,實驗樓會在之后陸續上線linux系統管理員的學習路徑,里面會有單獨的關於正則表達式,awk,sed等相關課程,敬請期待吧。下面的內容,我們就作為一個關於awk的入門體驗章節吧,其中會介紹一些awk的常用操作。

1.awk介紹

AWK是一種優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一.其名稱得自於它的創始人Alfred Aho(阿爾佛雷德·艾侯)、Peter Jay Weinberger(彼得·溫伯格)和Brian Wilson Kernighan(布萊恩·柯林漢)姓氏的首個字母.AWK程序設計語言,三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。最簡單地說,AWK是一種用於處理文本的編程語言工具。

在大多數linux發行版上面,實際我們使用的是gawk(GNU awk,awk的GNU版本),在我們的環境中ubuntu上,默認提供的是mawk,不過我們通常可以直接使用awk命令(awk語言的解釋器),因為系統已經為我們創建好了awk指向mawk的符號鏈接。

$ ll /usr/bin/awk

nawk: 在 20 世紀 80 年代中期,對 awk語言進行了更新,並不同程度地使用一種稱為 nawk(new awk) 的增強版本對其進行了替換。許多系統中仍然存在着舊的awk 解釋器,但通常將其安裝為 oawk (old awk) 命令,而 nawk 解釋器則安裝為主要的 awk 命令,也可以使用 nawk 命令。Dr. Kernighan 仍然在對 nawk 進行維護,與 gawk 一樣,它也是開放源代碼的,並且可以免費獲得; gawk: 是 GNU Project 的awk解釋器的開放源代碼實現。盡管早期的 GAWK 發行版是舊的 AWK 的替代程序,但不斷地對其進行了更新,以包含 NAWK 的特性; mawk 也是awk編程語言的一種解釋器,mawk遵循 POSIX 1003.2 (草案 11.3)定義的 AWK 語言,包含了一些沒有在AWK 手冊中提到的特色,同時 mawk 提供一小部分擴展,另外據說mawk是實現最快的awk

2.awk的一些基礎概念

awk所有的操作都是基於pattern(模式)—action(動作)對來完成的,如下面的形式:

$ pattern {action}

你可以看到就如同很多編程語言一樣,它將所有的動作操作用一對{}花括號包圍起來。其中pattern通常是是表示用於匹配輸入的文本的“關系式”或“正則表達式”,action則是表示匹配后將執行的動作。在一個完整awk操作中,這兩者可以只有其中一個,如果沒有pattern則默認匹配輸入的全部文本,如果沒有action則默認為打印匹配內容到屏幕。

awk處理文本的方式,是將文本分割成一些“字段”,然后再對這些字段進行處理,默認情況下,awk以空格作為一個字段的分割符,不過這不是固定了,你可以任意指定分隔符,下面將告訴你如何做到這一點。

3.awk命令基本格式

awk [-F fs] [-v var=value] [-f prog-file | 'program text'] [file...]

其中-F參數用於預先指定前面提到的字段分隔符(還有其他指定字段的方式) ,-v用於預先為awk程序指定變量,-f參數用於指定awk命令要執行的程序文件,或者在不加-f參數的情況下直接將程序語句放在這里,最后為awk需要處理的文本輸入,且可以同時輸入多個文本文件。現在我們還是直接來具體體驗一下吧。

4.awk操作體驗

先用vim新建一個文本文檔

$ vim test

包含如下內容:

I like linux

www.shiyanlou.com

  • 使用awk將文本內容打印到終端

# "quote>" 不用輸入

$ awk '{

> print

> }' test

# 或者寫到一行

$ awk '{print}' test

  • 將test的第一行的每個字段單獨顯示為一行

$ awk '{

> if(NR==1){

> print $1 "\n" $2 "\n" $3

> } else {

> print}

> }' test

 

# 或者

$ awk '{

> if(NR==1){

> OFS="\n"

> print $1, $2, $3

> } else {

> print}

> }' test

6.awk常用的內置變量

變量名

說明

FILENAME

當前輸入文件名,若有多個文件,則只表示第一個。如果輸入是來自標准輸入,則為空字符串

$0

當前記錄的內容

$N

N表示字段號,最大值為NF變量的值

FS

字段分隔符,由正則表達式表示,默認為" "空格

RS

輸入記錄分隔符,默認為"\n",即一行為一個記錄

NF

當前記錄字段數

NR

已經讀入的記錄數

FNR

當前輸入文件的記錄數,請注意它與NR的區別

OFS

輸出字段分隔符,默認為" "空格

ORS

輸出記錄分隔符,默認為"\n"

實驗截圖:

 

 

 實驗十二:Linux 下軟件安裝

一、Linux 上的軟件安裝

通常 Linux 上的軟件安裝主要有三種方式:

  • 在線安裝
  • 從磁盤安裝deb軟件包
  • 從二進制軟件包安裝
  • 從源代碼編譯安裝

這幾種安裝方式各有優劣,而大多數軟件包會采用多種方式發布軟件,所以我們常常需要全部掌握這幾種軟件安裝方式,以便適應各種環境。下面將介紹前三種安裝方式,從源碼編譯安裝你將在 Linux 程序設計中學習到。

二、在線安裝

試想一下,平時我們在使用 Windows 的時候,想要安裝一個軟件,我們需要在網上去下載對應軟件的安裝包,接着安裝的時候就是不斷的去點擊下一步,這些流程想必大家已經經歷的無數回了,但是在 Linux 下,一個命令加回車,等待一下,軟件就安裝好了,這就是方便的在線安裝軟件的方式。在學習這種安裝方式之前有一點需要說明的是,在不同的linux發行版上面在線安裝方式會有一些差異包括使用的命令及它們的包管理工具,因為我們的開發環境是基於ubuntu的,所以這里我們涉及的在線安裝方式將只適用於ubuntu發行版,或其它基於ubuntu的發行版如國內的ubuntukylin(優麒麟)ubuntu又是基於debian的發行版,它使用的是debian的包管理工具dpkg,所以一些操作也適用與debian。而在其它一些采用其它包管理工具的發行版如redhatcentos,fedora等將不適用(redhatcentos使用rpm)

2. apt 包管理工具介紹

APT是Advance Packaging Tool(高級包裝工具)的縮寫,是Debian及其派生發行版的軟件包管理器,APT可以自動下載,配置,安裝二進制或者源代碼格式的軟件包,因此簡化了Unix系統上管理軟件的過程。APT最早被設計成dpkg的前端,用來處理deb格式的軟件包。現在經過APT-RPM組織修改,APT已經可以安裝在支持RPM的系統管理RPM包。這個包管理器包含以 apt- 開頭的的多個工具,如 apt-get apt-cache apt-cdrom 等,在Debian系列的發行版中使用。

當你在執行安裝操作時,首先apt-get 工具會在本地的一個數據庫中搜索關於 w3m 軟件的相關信息,並根據這些信息在相關的服務器上下載軟件安裝,這里大家可能會一個疑問:既然是在線安裝軟件,為啥會在本地的數據庫中搜索?要解釋這個問題就得提到幾個名詞了:

  • 軟件源鏡像服務器
  • 軟件源

我們需要定期從服務器上下載一個軟件包列表,使用 sudo apt-get update 命令來保持本地的軟件包列表是最新的(有時你也需要手動執行這個操作,比如更換了軟件源),而這個表里會有軟件依賴信息的記錄,對於軟件依賴,我舉個例子:我們安裝 w3m 軟件的時候,而這個軟件需要libgc1c2 這個軟件包才能正常工作,這個時候 apt-get 在安裝軟件的時候會一並替我們安裝了,以保證 w3m 能正常的工作。

3.apt-get

apt-get使用各用於處理apt包的公用程序集,我們可以用它來在線安裝、卸載和升級軟件包等,下面列出一些apt-get包含的常用的一些工具:

工具

說明

install

其后加上軟件包名,用於安裝一個軟件包

update

從軟件源鏡像服務器上下載/更新用於更新本地軟件源的軟件包列表

upgrade

升級本地可更新的全部軟件包,但存在依賴問題時將不會升級,通常會在更新之前執行一次update

dist-upgrade

解決依賴關系並升級(存在一定危險性)

remove

移除已安裝的軟件包,包括與被移除軟件包有依賴關系的軟件包,但不包含軟件包的配置文件

autoremove

移除之前被其他軟件包依賴,但現在不再被使用的軟件包

purge

與remove相同,但會完全移除軟件包,包含其配置文件

clean

移除下載到本地的已經安裝的軟件包,默認保存在/var/cache/apt/archives/

autoclean

移除已安裝的軟件的舊版本軟件包

下面是一些apt-get常用的參數:

參數

說明

-y

自動回應是否安裝軟件包的選項,在一些自動化安裝腳本中使用這個參數將十分有用

-s

模擬安裝

-q

靜默安裝方式,指定多個q或者-q=#,#表示數字,用於設定靜默級別,這在你不想要在安裝軟件包時屏幕輸出過多時很有用

-f

修復損壞的依賴關系

-d

只下載不安裝

--reinstall

重新安裝已經安裝但可能存在問題的軟件包

--install-suggests

同時安裝APT給出的建議安裝的軟件包

4.安裝軟件包

關於安裝,如前面演示的一樣你只需要執行apt-get install <軟件包名>即可,除了這一點,你還應該掌握的是如何重新安裝軟件包。 很多時候我們需要重新安裝一個軟件包,比如你的系統被破壞,或者一些錯誤的配置導致軟件無法正常工作。

你可以使用如下方式重新安裝:

$ sudo apt-get --reinstall install w3m

另一個你需要掌握的是,如何在不知道軟件包完整名的時候進行安裝。通常我們是使用Tab鍵補全軟件包名,后面會介紹更好的方法來搜索軟件包。有時候你需要同時安裝多個軟件包,你還可以使用正則表達式匹配軟件包名進行批量安裝。

5.軟件升級

# 更新軟件源

$ sudo apt-get update

# 升級沒有依賴問題的軟件包

$ sudo apt-get upgrade

# 升級並解決依賴關系

$ sudo apt-get dist-upgrade

6.卸載軟件

如果你現在覺得 w3m 這個軟件不合自己的胃口,或者是找到了更好的,你需要卸載它,那么簡單!同樣是一個命令加回車 sudo apt-get remove w3m ,系統會有一個確認的操作,之后這個軟件便“滾蛋了”。

或者,你可以執行

# 不保留配置文件的移除

$ sudo apt-get purge w3m

# 或者 sudo apt-get --purge remove

# 移除不再需要的被依賴的軟件包

$ sudo apt-get autoremove

7.軟件搜索

當自己剛知道了一個軟件,想下載使用,需要確認軟件倉庫里面有沒有,就需要用到搜索功能了,命令如下:

sudo apt-cache search softname1 softname2 softname3……

三、使用 dpkg 從本地磁盤安裝 deb 軟件包

1.dpkg 介紹

dpkg 是 Debian 軟件包管理器的基礎,它被伊恩·默多克創建於 1993 年。dpkg 與 RPM 十分相似,同樣被用於安裝、卸載和供給和 .deb 軟件包相關的信息。

dpkg 本身是一個底層的工具。上層的工具,像是 APT,被用於從遠程獲取軟件包以及處理復雜的軟件包關系。"dpkg"是"Debian Package"的簡寫。

我們經常可以在網絡上簡單以deb形式打包的軟件包,就需要使用dpkg命令來安裝。

dpkg常用參數介紹:

參數

說明

-i

安裝指定deb包

-R

后面加上目錄名,用於安裝該目錄下的所有deb安裝包

-r

remove,移除某個已安裝的軟件包

-I

顯示deb包文件的信息

-s

顯示已安裝軟件的信息

-S

搜索已安裝的軟件包

-L

顯示已安裝軟件包的目錄信息

2.使用dpkg安裝deb軟件包

我們先使用apt-get加上-d參數只下載不安裝,下載emacs編輯器的deb包,下載完成后,我們可以查看/var/cache/apt/archives/目錄下的內容,如下圖:

 

然后我們將第一個deb拷貝到home目錄下,並使用dpkg安裝

$ cp /var/cache/apt/archives/emacs24_24.3+1-4ubuntu1_amd64.deb ~

# 安裝之前參看deb包的信息

$ sudo dpkg -I emacs24_24.3+1-4ubuntu1_amd64.deb

如你所見,這個包還額外依賴了一些軟件包,這意味着,如果主機目前沒有這些被依賴的軟件包,直接使用dpkg安裝可能會存在一些問題,因為dpkg並不能為你解決依賴關系。

# 使用dpkg安裝

$ sudo dpkg -i emacs24_24.3+1-4ubuntu1_amd64.deb

跟前面預料的一樣,這里你可能出現了一些錯誤:

 

我們將如何解決這個錯誤了,這就要用到apt-get了,使用它的-f參數了,修復依賴關系的安裝

$ sudo apt-get -f install

沒有任何錯誤,這樣我們就安裝成功了,然后你可以運行emacs程序

3.查看已安裝軟件包的安裝目錄

如果你依然在糾結到底linux將軟件安裝到了什么地方,那么很幸運你將可以通過dpkg找到答案

使用dpkg -L查看deb包目錄信息

$ sudo dpkg -L emacs

 

dpkg還有一些其他的參數,這里將作為練習題由你自己來學習

四、從二進制包安裝

二進制包的安裝比較簡單,我們需要做的只是將從網絡上下載的二進制包解壓后放到合適的目錄,然后將包含可執行的主程序文件的目錄添加進PATH環境變量即可,如果你不知道該放到什么位置,請重新復習第四節關於 Linux 目錄結構的內容。

 

實驗總結

因為之前為准備計算機等級考試,因此做實驗的時間比較倉促,因此僅僅只是大致了解了linux的基本操作和把實驗代碼都運行了一遍,之間出現了一些問題已經做了記錄,之后將會抽空將問題解決。

 

本次實驗重點學習命令

 

 find

功能說明:查找文件或目錄。

語  法:find [目錄...][-amin <分鍾>][-anewer <參考文件或目錄>][-atime <24小時數>][-cmin <分鍾>][-cnewer <參考文件或目錄>][-ctime <24小時數>][-daystart][-depyh][-empty][-exec <執行指令>][-false][-fls <列表文件>][-follow][-fprint <列表文件>][-fprint0 <列表文件>][-fprintf <列表文件><輸出格式>][-fstype <文件系統類型>][-gid <群組識別碼>][-group <群組名稱>][-help][-ilname <范本樣式>][-iname <范本樣式>][-inum <inode編號>][-ipath <范本樣式>][-iregex <范本樣式>][-links <連接數目>][-lname <范本樣式>][-ls][-maxdepth <目錄層級>][-mindepth <目錄層級>][-mmin <分鍾>][-mount]
[-mtime <24小時數>][-name <范本樣式>][-newer <參考文件或目錄>][-nogroup][noleaf] [-nouser][-ok <執行指令>][-path <范本樣式>][-perm <權限數值>][-print][-print0][-printf <輸出格式>][-prune][-regex <范本樣式>][-size <文件大小>][-true][-type <文件類型>][-uid <用戶識別碼>][-used <日數>][-user <擁有者名稱>][-version][-xdev][-xtype <文件類型>]

補充說明:find指令用於查找符合條件的文件。任何位於參數之前的字符串都將被視為欲查找的目錄。

參  數:
 -amin<分鍾>  查找在指定時間曾被存取過的文件或目錄,單位以分鍾計算。
 -anewer<參考文件或目錄>  查找其存取時間較指定文件或目錄的存取時間更接近現在的文件或目錄。
 -atime<24小時數>  查找在指定時間曾被存取過的文件或目錄,單位以24小時計算。
 -cmin<分鍾>  查找在指定時間之時被更改的文件或目錄。
 -cnewer<參考文件或目錄>  查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄。
 -ctime<24小時數>  查找在指定時間之時被更改的文件或目錄,單位以24小時計算。
 -daystart  從本日開始計算時間。
 -depth  從指定目錄下最深層的子目錄開始查找。
 -expty  尋找文件大小為0 Byte的文件,或目錄下沒有任何子目錄或文件的空目錄。
 -exec<執行指令>  假設find指令的回傳值為True,就執行該指令。
 -false  將find指令的回傳值皆設為False。
 -fls<列表文件>  此參數的效果和指定"-ls"參數類似,但會把結果保存為指定的列表文件。
 -follow  排除符號連接。
 -fprint<列表文件>  此參數的效果和指定"-print"參數類似,但會把結果保存成指定的列表文件。
 -fprint0<列表文件>  此參數的效果和指定"-print0"參數類似,但會把結果保存成指定的列表文件。
 -fprintf<列表文件><輸出格式>  此參數的效果和指定"-printf"參數類似,但會把結果保存成指定的列表文件。
 -fstype<文件系統類型>  只尋找該文件系統類型下的文件或目錄。
 -gid<群組識別碼>  查找符合指定之群組識別碼的文件或目錄。
 -group<群組名稱>  查找符合指定之群組名稱的文件或目錄。
 -help或--help  在線幫助。
 -ilname<范本樣式>  此參數的效果和指定"-lname"參數類似,但忽略字符大小寫的差別。
 -iname<范本樣式>  此參數的效果和指定"-name"參數類似,但忽略字符大小寫的差別。
 -inum<inode編號>  查找符合指定的inode編號的文件或目錄。
 -ipath<范本樣式>  此參數的效果和指定"-ipath"參數類似,但忽略字符大小寫的差別。
 -iregex<范本樣式>  此參數的效果和指定"-regexe"參數類似,但忽略字符大小寫的差別。
 -links<連接數目>  查找符合指定的硬連接數目的文件或目錄。
 -iname<范本樣式>  指定字符串作為尋找符號連接的范本樣式。
 -ls  假設find指令的回傳值為True,就將文件或目錄名稱列出到標准輸出。
 -maxdepth<目錄層級>  設置最大目錄層級。
 -mindepth<目錄層級>  設置最小目錄層級。
 -mmin<分鍾>  查找在指定時間曾被更改過的文件或目錄,單位以分鍾計算。
 -mount  此參數的效果和指定"-xdev"相同。
 -mtime<24小時數>  查找在指定時間曾被更改過的文件或目錄,單位以24小時計算。
 -name<范本樣式>  指定字符串作為尋找文件或目錄的范本樣式。
 -newer<參考文件或目錄>  查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄。
 -nogroup  找出不屬於本地主機群組識別碼的文件或目錄。
 -noleaf  不去考慮目錄至少需擁有兩個硬連接存在。
 -nouser  找出不屬於本地主機用戶識別碼的文件或目錄。
 -ok<執行指令>  此參數的效果和指定"-exec"參數類似,但在執行指令之前會先詢問用戶,若回答"y"或"Y",則放棄執行指令。
 -path<范本樣式>  指定字符串作為尋找目錄的范本樣式。
 -perm<權限數值>  查找符合指定的權限數值的文件或目錄。
 -print  假設find指令的回傳值為True,就將文件或目錄名稱列出到標准輸出。格式為每列一個名稱,每個名稱之前皆有"./"字符串。
 -print0  假設find指令的回傳值為True,就將文件或目錄名稱列出到標准輸出。格式為全部的名稱皆在同一行。
 -printf<輸出格式>  假設find指令的回傳值為True,就將文件或目錄名稱列出到標准輸出。格式可以自行指定。
 -prune  不尋找字符串作為尋找文件或目錄的范本樣式。
 -regex<范本樣式>  指定字符串作為尋找文件或目錄的范本樣式。
 -size<文件大小>  查找符合指定的文件大小的文件。
 -true  將find指令的回傳值皆設為True。
 -typ<文件類型>  只尋找符合指定的文件類型的文件。
 -uid<用戶識別碼>  查找符合指定的用戶識別碼的文件或目錄。
 -used<日數>  查找文件或目錄被更改之后在指定時間曾被存取過的文件或目錄,單位以日計算。
 -user<擁有者名稱>  查找符合指定的擁有者名稱的文件或目錄。
 -version或--version  顯示版本信息。
 -xdev  將范圍局限在先行的文件系統中。
 -xtype<文件類型>  此參數的效果和指定"-type"參數類似,差別在於它針對符號連接檢查。

 

locate

功能說明:查找文件。

語  法:locate [-d <數據庫文件>][--help][--version][范本樣式...]

補充說明:locate指令用於查找符合條件的文件,它會去保存文件與目錄名稱的數據庫內,查找合乎范本樣式條件的文件或目錄。

參  數:
 -d<數據庫文件>或--database=<數據庫文件> 設置locate指令使用的數據庫。locate指令預設的數據庫位於/var/lib/slocate目錄里,文件名為slocate.db,您可使用這個參數另行指定。
 --help  在線幫助。
 --version  顯示版本信息。

 

 grep

 

功能說明:查找文件里符合條件的字符串。

語  法:grep [-abcEFGhHilLnqrsvVwxy][-A<顯示列數>][-B<顯示列數>][-C<顯示列數>][-d<進行動作>][-e<范本樣式>][-f<范本文件>][--help][范本樣式][文件或目錄...]

補充說明:grep指令用於查找內容包含指定的范本樣式的文件,如果發現某文件的內容符合所指定的范本樣式,預設grep指令會把含有范本樣式的那一列顯示出來。若不指定任何文件名稱,或是所給予的文件名為“-”,則grep指令會從標准輸入設備讀取數據。

參  數:
  -a或--text   不要忽略二進制的數據。
  -A<顯示列數>或--after-context=<顯示列數>   除了顯示符合范本樣式的那一列之外,並顯示該列之后的內容。
  -b或--byte-offset   在顯示符合范本樣式的那一列之前,標示出該列第一個字符的位編號。
  -B<顯示列數>或--before-context=<顯示列數>   除了顯示符合范本樣式的那一列之外,並顯示該列之前的內容。
  -c或--count   計算符合范本樣式的列數。
  -C<顯示列數>或--context=<顯示列數>或-<顯示列數>   除了顯示符合范本樣式的那一列之外,並顯示該列之前后的內容。
  -d<進行動作>或--directories=<進行動作>   當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep指令將回報信息並停止動作。
  -e<范本樣式>或--regexp=<范本樣式>   指定字符串做為查找文件內容的范本樣式。
  -E或--extended-regexp   將范本樣式為延伸的普通表示法來使用。
  -f<范本文件>或--file=<范本文件>   指定范本文件,其內容含有一個或多個范本樣式,讓grep查找符合范本條件的文件內容,格式為每列一個范本樣式。
  -F或--fixed-regexp   將范本樣式視為固定字符串的列表。
  -G或--basic-regexp   將范本樣式視為普通的表示法來使用。
  -h或--no-filename   在顯示符合范本樣式的那一列之前,不標示該列所屬的文件名稱。
  -H或--with-filename   在顯示符合范本樣式的那一列之前,表示該列所屬的文件名稱。
  -i或--ignore-case   忽略字符大小寫的差別。
  -l或--file-with-matches   列出文件內容符合指定的范本樣式的文件名稱。
  -L或--files-without-match   列出文件內容不符合指定的范本樣式的文件名稱。
  -n或--line-number   在顯示符合范本樣式的那一列之前,標示出該列的列數編號。
  -q或--quiet或--silent   不顯示任何信息。
  -r或--recursive   此參數的效果和指定“-d recurse”參數相同。
  -s或--no-messages   不顯示錯誤信息。
  -v或--revert-match   反轉查找。
  -V或--version   顯示版本信息。
  -w或--word-regexp   只顯示全字符合的列。
  -x或--line-regexp   只顯示全列符合的列。
  -y   此參數的效果和指定“-i”參數相同。
  --help   在線幫助。
man

在 Linux 環境中,如果你遇到困難,可以使用man 命令,它是Manual page的縮寫。

whereis

功能說明:查找文件。

語  法:whereis [-bfmsu][-B <目錄>...][-M <目錄>...][-S <目錄>...][文件...]

補充說明:whereis指令會在特定目錄中查找符合條件的文件。這些文件的烈性應屬於原始代碼,二進制文件,或是幫助文件。

參  數:
 -b  只查找二進制文件。
 -B<目錄>  只在設置的目錄下查找二進制文件。
 -f  不顯示文件名前的路徑名稱。
 -m  只查找說明文件。
 -M<目錄>  只在設置的目錄下查找說明文件。
 -s  只查找原始代碼文件。
 -S<目錄>  只在設置的目錄下查找原始代碼文件。
 -u  查找不包含指定類型的文件。

which

功能說明:查找文件。

語  法:which [文件...]

補充說明:which指令會在環境變量$PATH設置的目錄里查找符合條件的文件。

參  數:
 -n<文件名長度>  指定文件名長度,指定的長度必須大於或等於所有文件中最長的文件名。
 -p<文件名長度>  與-n參數相同,但此處的<文件名長度>包括了文件的路徑。
 -w  指定輸出時欄位的寬度。
 -V  顯示版本信息。

 

apt-get

在線獲取軟件,並安裝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM