第一節,linux系統簡介
一、實驗内容
了解 Linux 的曆史,Linux 與 Windows 的差別等入門知識。
二、實驗要求
閱讀linux簡介與曆史
三、實驗步驟
(一)、Linux 為何物

Linux 也就是系統調用和核心那兩層,當然直覺的來看,我們使用的作業系統還包含一些在其上運作的應用程式,比如文本編輯器,浏覽器,電子郵件。
(二)、Linux 與 Windows 到底有哪些不同
1.免費與收費
最新正版 Windows8.1 官方售價 ¥888;
Linux 免費或少許費用
2. 軟體與支援
- Windows 平台:數量和品質的優勢,不過大部分為收費軟體;由微軟官方提供重要支援和服務;
- Linux 平台:大都為開源自由軟體,使用者可以修改定制和再釋出,由于基本免費沒有資金支援,部分軟體品質和體驗欠缺;有全球所有的 Linux 開發者和自由軟體社群提供支援。
3.安全性
- Windows 平台:三天兩頭打更新檔安裝系統安全更新,還是會中病毒木馬;
- Linux 平台:要說 Linux 沒有安全問題,那當然是不可能的,這一點仁者見仁智者見智,相對來說肯定比 Windows 平台要更加安全,使用 Linux 你也不用裝某殺毒,某毒霸。
4.使用習慣
- Windows:普通使用者基本都是純圖形界面下操作使用,依靠滑鼠和鍵盤完成一切操作,使用者上手容易入門簡單;
- Linux:兼具圖形界面操作(需要使用帶有桌面環境的發行版)和完全的指令行操作,可以隻用鍵盤完成一切操作,新手入門較困難,需要一些學習和指導(這正是我們要做的事情),一旦熟練之後效率極高。
5.可定制性
- Windows:這些年之前算是全封閉的,系統可定制性很差;
- Linux:你想怎麼做就怎麼做,Windows 能做到得它都能,Windows 做不到的,它也能。
6.應用範疇
或許你之前不知道 Linux ,要知道,你之前在 Windows 使用百度,谷歌,上淘寶,聊 QQ 時,支撐這些軟體和服務的,是背景成千上萬的 Linux 伺服器主機,它們時時刻刻都在進行着忙碌的資料處理和運算,可以說世界上大部分軟體和服務都是運作在 Linux 之上的。
7.Windows 沒有的
- 穩定的系統
- 安全性和漏洞的快速修補
- 多使用者
- 使用者和使用者組的規劃
- 相對較少的系統資源占用
- 可定制裁剪,移植到嵌入式平台(如安卓裝置)
- 可選擇的多種圖形使用者界面(如 GNOME,KDE)
8.Linux 沒有的
- 沒有特定的支援廠商
- 遊戲娛樂支援度不足
- 專業軟體支援度不足
(三)、如何學習 Linux
1.學習心态
- 明确目的:你是要用 Linux 來幹什麼,搭建伺服器,做程式開發,還是日常辦公,還是娛樂遊戲;
- 面對現實:Linux 大都在指令行下操作,能否接受不用或少用圖形界面;
- 是學習 Linux 作業系統本身還是某一個Linux發行版(Ubuntu,CentOS,Fedora,OpenSUSE,Debian,Mint 等等),如果你對發行版的概念或者它們之間的關系不明确的話可以參看Linux 發行版。
2.注重基礎,從頭開始
Linux基礎入門
第二節、基本概念及操作
1、實驗樓環境介紹 2、常用 Shell 指令及快捷鍵 3、Linux 使用小技巧
二、實驗步驟
(一)、Linux 桌面環境介紹
相對于現在的 Windows 系統,UNIX/Linux 本身是沒有圖形界面的,我們通常在 Unix/Linux 發行版上看到的圖形界面實際都隻是運作在 Linux 系統之上的一套軟體,類似 Windows95 之前的Windows 的圖形界面實則也隻是運作在 DOS 環境的一套軟體。而 Linux 上的這套軟體以前是XFree86,現在則是 xorg(X.Org),而這套軟體又是通過 X 視窗系統(X Window System,也常被稱為X11或X)實作的,X 本身隻是工具包及架構協定,而 xorg 便是 X 架構規範的一個實作體,也就是說它是實作了 X 協定規範的一個提供圖形使用者界面服務的伺服器,就像實作了 http 協定提供 web 服務的 Apache。如果隻有伺服器也是不能實作一個完整的桌面環境的,當然還需要一個用戶端,我們稱為 X Client,像如下幾個大家熟知也最流行的實作了用戶端功能的桌面環境KDE,GNOME,XFCE,LXDE,其中就有你看到的,實驗樓目前使用的 XFCE 桌面環境,部分老使用者可能可以回想起,實驗樓之前使用的環境是 LXDE。這也意味着在 Linux 上你可以自己選擇安裝不同的桌面環境,甚至可以定制自己的專屬桌面
(二)、Linux終端
1.Terminal(終端)
通常在我們使用 Linux 時,我們并不是直接與系統打交道,而是通過一個叫做 Shell 的中間程式來完成的,在圖形界面下為了實作讓我們在一個視窗中完成接受使用者輸入和顯示輸出,Linux 系統還提供了一個叫做終端模拟器的程式(Terminal),下面幾個比較常見的終端模拟器,例如 gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm,目前我們的實驗中的終端程式是 xfce 桌面環境自帶的 xfce-terminal。不過要注意的是這裡所說的終端(Terminal)和控制台(Console)是有差別的。
2.Shell
通常在圖形界面中對實際體驗帶來差異的不是上述的不同發行版的各種終端模拟器,而大都是這個 Shell(殼),有殼就有核,這裡的核就是指的 UNIX/Linux 核心,Shell 是指“提供給使用者使用界面”的軟體(指令解析器),類似于 DOS 下的 command(指令行)和後來的 cmd.exe。普通意義上的 Shell 就是可以接受使用者輸入指令的程式。它之是以被稱作 Shell 是因為它隐藏了作業系統底層的細節。同樣的 Unix/Linux 下的圖形使用者界面 GNOME 和 KDE,有時也被叫做“虛拟 shell”或“圖形 shell”。
Unix/Linux 作業系統下的 Shell 既是使用者互動的界面,也是控制系統的腳本語言。當然在這點也有别于 Windows 下的指令行,雖然也提供了很簡單的控制語句。在Windows 作業系統下,可能有些使用者從來都不會直接的使用 Shell,然而在 UNIX 系列作業系統下,Shell 仍然是控制系統啟動、X11 啟動和很多其他實用工具的腳本解釋程式。
在 UNIX/Linux 中比較流行的常見的 Shell 有 bash,zsh,ksh,csh 等等,Ubuntu 終端預設使用的是 bash,預設的桌面環境是 GNOME 或者 Unity(基于 GNOME),但我們的環境中使用的分别是zsh 和 xfce。
3.指令行操作體驗
輕按兩下桌面上的
Xface終端
圖示,打開終端,打開終端後會自動運作 Shell 程式,然後我們就可以輸入指令讓系統來執行了:
1).重要快捷鍵:
真正學習指令行之前,你先要掌握幾個十分有用,必需掌握的小技巧:
[Tab]
使用
Tab
鍵來進行指令補全,
Tab
鍵一般鍵盤是在字母
Q
旁邊,這個技巧給你帶來的最大的好處就是當你忘記某個指令的全稱時你可以隻輸入它的開頭的一部分然後按下
Tab
鍵就可以得到提示或者幫助完成:
[Ctrl+c]
想想你有沒有遇到這種情況,當你在 Linux 指令行中無意輸入了一個不知道的指令,或者錯誤的使用了一個指令,導緻在終端裡出現了你無法預料的情況,比如,隻有光标在閃爍無法繼續輸入指令,或者不停地在輸出一大堆你不想要的結果。你想要立即停止并恢複到你可控的狀态,那該怎麼辦呢。這時候你就可以使用
Ctrl+c
鍵來強行終止目前程式(你可以放心它并不會使終端退出)。
其他一些常用快捷鍵
按鍵 | 作用 |
---|---|
| 鍵盤輸入結束或退出終端 |
| 暫定目前程式,暫停後按下任意鍵恢複運作 |
| 将目前程式放到背景運作,恢複到前台為指令 |
| 将光标移至輸入行頭,相當于 鍵 |
| 将光标移至輸入行末,相當于 |
| 删除從光标所在位置到行末 |
| 向前删除一個單詞 |
| 将終端顯示向上滾動 |
| 将終端顯示向下滾動 |
2).學會利用曆史輸入指令
很簡單,你可以使用鍵盤上的方向
上
鍵,恢複你之前輸入過的指令,你一試便知。
3).學會使用通配符
通配符是一種特殊語句,主要有星号(*)和問号(?),用來對對字元串進行模糊比對(比如檔案名,參數名)。當查找檔案夾時,可以使用它來代替一個或多個真正字元;當不知道真正字元或者懶得輸入完整名字時,常常使用通配符代替一個或多個真正的字元。
終端裡面輸入的通配符是由 Shell 處理的,不是由所涉及到指令語句處理的,它隻會出現在指令的“參數值”裡(它不用在 指令名稱裡, 指令不記得,那就用
Tab
補全)。當 Shell 在“參數值”中遇到了通配符時,Shell 會将其當作路徑或檔案名去在磁盤上搜尋可能的比對:若符合要求的比對存在,則進行代換(路徑擴充);否則就将該通配符作為一個普通字元傳遞給“指令”,然後再由指令進行處理。總之,通配符 實際上就是一種 Shell 實作的路徑擴充功能。在 通配符被處理後, Shell 會先完成該指令的重組,然後再繼續處理重組後的指令,直至執行該指令。
先使用 touch 指令建立 2 個檔案,字尾都為 txt:可以給檔案随意命名,假如過了很長時間,你已經忘了這兩個檔案的檔案名,現在你想在你大堆其他檔案中找到這兩個文本檔案,就可以使用通配符:
Shell 常用通配符:
字元 | 含義 |
---|---|
| 比對 0 或多個字元 |
| 比對任意一個字元 |
| 比對 list 中的任意單一字元 |
| 比對 除list 中的任意單一字元以外的字元 |
| 比對 c1-c2 中的任意單一字元 如:[0-9] [a-z] |
| 比對 sring1 或 string2 (或更多)其一字元串 |
| 比對 c1-c2 中全部字元 如{1..10} |
4).學會在指令行中擷取幫助
在 Linux 環境中,如果你遇到困難,可以使用
man
指令,它是
Manual page
的縮寫。
Manual pages 是在 UNIX 或類 UNIX 作業系統線上軟體文檔的一種普遍的形式。 内容包括計算機程式(包括庫和系統調用),正式的标準和慣例,甚至是抽象的概念。使用者可以通過執行 man 指令調用手冊頁。
你可以使用如下方式來獲得某個指令的說明和使用方式的詳細介紹:
$ man <command_name>
比如你想檢視 man 指令本身的使用方式,你可以輸入:
man man
通常情況下,man 手冊裡面的内容都是英文的,這就要求你有一定的英文基礎。man 手冊的内容很多,涉及了 Linux 使用過程中的方方面面,為了便于查找,是做了分冊(分區段)處理的,在Research UNIX、BSD、OS X 和 Linux 中,手冊通常被分為8個區段,安排如下:
區段 | 說明 |
---|---|
1 | 一般指令 |
2 | 系統調用 |
3 | 庫函數,涵蓋了C标準函數庫 |
4 | 特殊檔案(通常是/dev中的裝置)和驅動程式 |
5 | 檔案格式和約定 |
6 | 遊戲和屏保 |
7 | 雜項 |
8 | 系統管理指令和守護程序 |
要檢視相應區段的内容,就在 man 後面加上相應區段的數字即可,如:
$ man 3 printf
所有的手冊頁遵循一個常見的布局,其為通過簡單的 ASCII 文本展示而優化,而這種情況下可能沒有任何形式的高亮或字型控制。一般包括以下部分内容:
NAME(名稱)
該指令或函數的名稱,接着是一行簡介。
SYNOPSIS(概要)
對于指令,正式的描述它如何運作,以及需要什麼樣的指令行參數。對于函數,介紹函數所需的參數,以及哪個頭檔案包含該函數的定義。
DESCRIPTION(說明)
指令或函數功能的文本描述。
EXAMPLES(示例)
常用的一些示例。
SEE ALSO(參見)
相關指令或函數的清單。
也可能存在其他部分内容,但這些部分沒有得到跨手冊頁的标準化。常見的例子包括:OPTIONS(選項),EXIT STATUS(退出狀态),ENVIRONMENT(環境),BUGS(程式漏洞),FILES(檔案),AUTHOR(作者),REPORTING BUGS(已知漏洞),HISTORY(曆史)和COPYRIGHT(版權)。
通常 man 手冊中的内容很多,你可能不太容易找到你想要的結果,不過幸運的是你可以在 man 中使用搜尋,
/<你要搜尋的關鍵字>
,查找到後你可以使用
n
鍵切換到下一個關鍵字所在處,
shift+n
為上一個關鍵字所在處。使用
Space
(空格鍵)翻頁,
Enter
(Enter鍵)向下滾動一行,或者使用
j
,
k
(vim編輯器的移動鍵)進行向前向後滾動一行。按下
h
鍵為顯示使用幫助(因為man使用less作為閱讀器,實為
less
工具的幫助),按下
q
退出。
想要獲得更詳細的幫助,你還可以使用
info
指令,不過通常使用
man
就足夠了。如果你知道某個指令的作用,隻是想快速檢視一些它的某個具體參數的作用,那麼你可以使用
--help
參數,大部分指令都會帶有這個參數,如:
$ ls --help
(三)作業截圖
Linux基礎入門
Linux基礎入門
第三節、使用者及檔案權限管理
1、Linux 中建立、删除使用者,及使用者組等操作。 2、Linux 中的檔案權限設定
一、Linux 使用者管理
通過第一節課程的學習,你應該已經知道,Linux 是一個可以實作多使用者登陸的作業系統,比如“李雷”和“韓梅梅”都可以同時登陸同一台主機,他們共享一些主機的資源,但他們也分别有自己的使用者空間,用于存放各自的檔案。但實際上他們的檔案都是放在同一個實體磁盤上的甚至同一個邏輯分區或者目錄裡,但是由于 Linux 的 使用者管理 和 權限機制 ,不同使用者不可以輕易地檢視、修改彼此的檔案。
1.檢視使用者
請打開終端,輸入指令:
$ who am i
或者
$ who mom likes
輸入的第一清單示打開目前僞終端的使用者的使用者名(要檢視目前登入使用者的使用者名,去掉空格直接使用
whoami
即可),第二列的
pts/0
中
pts
表示僞終端,所謂僞是相對于
/dev/tty
裝置而言的,還記得上一節講終端時的那七個使用
[Ctrl]
+
[Alt]
[F1]~[F7]
進行切換的
/dev/tty
裝置麼,這是“真終端”,僞終端就是當你在圖形使用者界面使用
/dev/tty7
時每打開一個終端就會産生一個僞終端,
pts/0
後面那個數字就表示打開的僞終端序号,你可以嘗試再打開一個終端,然後在裡面輸入
who am i
,看第二列是不是就變成
pts/1
了,第三列則表示目前僞終端的啟動時間。
who
指令其它常用參數
參數 | |
---|---|
| 列印能列印的全部 |
| 列印死掉的程序 |
| 同 |
| 列印目前登入使用者數及使用者名 |
| 列印目前登入使用者登入資訊 |
| 列印運作等級 |
2.建立使用者
在 Linux 系統裡,
root
賬戶擁有整個系統至高無上的權利,比如 建立/添加 使用者。
root 權限,系統權限的一種,與 SYSTEM 權限可以了解成一個概念,但高于 Administrator 權限,root 是 Linux 和 UNIX 系統中的超級管理者使用者帳戶,該帳戶擁有整個系統至高無上的權力,所有對象他都可以操作,是以很多黑客在入侵系統的時候,都要把權限提升到 root 權限,用 Windows 的方法了解也就是将自己的非法帳戶添加到 Administrators 使用者組。更比如安卓作業系統中(基于 Linux 核心)獲得 root 權限之後就意味着已經獲得了手機的最高權限,這時候你可以對手機中的任何檔案(包括系統檔案)執行所有增、删、改、查的操作。
我們一般登入系統時都是以普通賬戶的身份登入的,要建立使用者需要 root 權限,這裡就要用到
sudo
這個指令了。不過使用這個指令有兩個大前提,一是你要知道目前登入使用者的密碼,二是目前使用者必須在
sudo
使用者組。shiyanlou 使用者的密碼就是 “shiyanlou” ,它同時也屬于 sudo 使用者組(稍後會介紹如何檢視和添加使用者組)。現在我們建立一個叫 lilei 的使用者:
$ sudo adduser lilei
按照提示輸入 shiyanlou 密碼(Linux 下密碼輸入通常都是不可見的),然後是給 lilei 使用者設定密碼,後面的選項的一些内容你可以選擇直接回車使用預設值:
3.使用者組
在 Linux 裡面每個使用者都有一個歸屬(使用者組),使用者組簡單地了解就是一組使用者的集合,它們共享一些資源和權限,同時擁有私有資源,就跟家的形式差不多,你的兄弟姐妹(不同的使用者)屬于同一個家(使用者組),你們可以共同擁有這個家(共享資源),爸媽對待你們都一樣(共享權限),你偶爾寫寫日記,其他人未經允許不能檢視(私有資源和權限)。當然一個使用者是可以屬于多個使用者組的,正如你既屬于家庭,又屬于學校或公司。
在 Linux 裡面如何知道自己屬于哪些使用者組呢?
方法一:使用groups指令
$ groups shiyanlou
其中冒号之前表示使用者,後面表示該使用者所屬的使用者組。這裡可以看到 shiyanlou 使用者同時屬于 shiyanlou 和 sudo 使用者組,每次建立使用者如果不指定使用者組的話,預設會自動建立一個與使用者名相同的使用者組(差不多就相當于家長的意思,或者說是老總)。預設情況下在sudo使用者組裡的可以使用sudo指令獲得root權限。
方法二:檢視 /etc/group
檔案
/etc/group
$ cat /etc/group | sort
這裡
cat
指令用于讀取指定檔案的内容并列印到終端輸出,後面會詳細講它的使用。
| sort
表示将讀取的文本進行一個字典排序再輸出,然後你将看到如下一堆輸出,你可以在最下面看到 shiyanlou 的使用者組資訊:
etc/group
檔案格式說明
etc/group
/etc/group 的内容包括使用者組(Group)、使用者組密碼、GID 及該使用者組所包含的使用者(User),每個使用者組一條記錄。格式如下:
group_name:password:GID:user_list
你看到上面的 password 字段為一個 'x' 并不是說密碼就是它,隻是表示密碼不可見而已。
将其它使用者加入 sudo 使用者組
預設情況下新建立的使用者是不具有 root 權限的,也不在 sudo 使用者組,可以讓其加入sudo使用者組進而擷取 root 權限。
$ su -l lilei
$ sudo ls
會提示 lilei 不在 sudoers 檔案中,意思就是 lilei 不在 sudo 使用者組中,至于 sudoers 檔案(/etc/sudoers)你現在最好不要動它,操作不慎會導緻比較麻煩的後果。
使用
usermod
指令可以為使用者添加使用者組,同樣使用該指令你必需有 root 權限,你可以直接使用 root 使用者為其它使用者添加使用者組,或者用其它已經在 sudo 使用者組的使用者使用 sudo 指令擷取權限來執行該指令
這裡我用 shiyanlou 使用者執行 sudo 指令将 lilei 添加到 sudo 使用者組,讓它也可以使用 sudo 指令獲得 root 權限
$ su shiyanlou
$ groups lilei
$ sudo usermod -G sudo lilei
$ groups lilei
然後你再切換會 lilei 使用者,現在就可以使用 sudo 擷取 root 權限了。
4.删除使用者
删除使用者是很簡單的事:
二、Linux 檔案權限
1.檢視檔案權限
我們之前已經很多次用到
ls
指令了,如你所見,我們用它來列出并顯示目前目錄下的檔案,當然這是在不帶任何參數的情況下,它能做的當然不止這麼多,現在我們就要用它來檢視檔案權限。
使用較長格式列出檔案:
你可能除了知道最後面那一項是檔案名之外,其它項就不太清楚了,那麼到底是什麼意思呢:
可能你還是不太明白,比如第一項檔案類型和權限那一堆東西具體指什麼,連結又是什麼,何為最後修改時間,下面一一道來:
2.變更檔案所有者
- 檔案類型
關于檔案類型,這裡有一點你必需時刻牢記Linux 裡面一切皆檔案,正因為這一點才有了裝置檔案(
/dev
目錄下有各種裝置檔案,大都跟具體的硬體裝置相關)這一說,還有
socket
(網絡套接字,具體是什麼,感興趣的使用者可以自己去了解或期待實驗樓的後續相關課程),和
pipe
(管道,這個東西很重要,我們以後将會讨論到,這裡你先知道有它的存在即可)。軟連結檔案,連結檔案是分為兩種的,另一種當然是“硬連結”(硬連結不常用,具體内容不作為本課程讨論重點,而軟連結等同于 Windows 上的快捷方式,你記住這一點就夠了)
- 檔案權限
讀權限,表示你可以使用
cat <file name>
之類的指令來讀取某個檔案的内容;寫權限,表示你可以編輯和修改某個檔案; 執行權限,通常指可以運作的二進制程式檔案或者腳本檔案,如同 Windows 上的 'exe' 字尾的檔案,不過 Linux 上不是通過檔案字尾名來區分檔案的類型。你需要注意的一點是,一個目錄要同時具有讀權限和執行權限才可以打開,而一個目錄要有寫權限才允許在其中建立其它檔案,這是因為目錄檔案實際儲存着該目錄裡面的檔案的清單等資訊
所有者權限,這一點相信你應該明白了,至于所屬使用者組權限,是指你所在的使用者組中的所有其它使用者對于該檔案的權限,比如,你有一個艾派德,那麼這個使用者組權限就決定了你的兄弟姐妹有沒有權限使用它破壞它和占有它。
- 連結數
連結到該檔案所在的 inode 結點的檔案名數目(關于這個概念涉及到 Linux 檔案系統的相關概念知識,不在本課程的讨論範圍,感興趣的使用者可以自己去了解)。
- 檔案大小
以 inode 結點大小為機關來表示的檔案大小,你可以給 ls 加上 -lh
參數來更直覺的檢視檔案的大小。
明白了檔案權限的一些概念,我們順帶補充一下關于
ls
指令的一些其它常用的用法:
- 顯示除了 '.'(目前目錄),'..' 上一級目錄之外的所有包含隐藏檔案(Linux 下以 '.' 開頭的檔案為隐藏檔案)
3.修改檔案權限
如果你有一個自己的檔案不想被其他使用者讀、寫、執行,那麼就需要對檔案的權限做修改。
第四節、Linux 目錄結構及檔案基本操作
實驗介紹
1、Linux 的檔案組織目錄結構。 2、相對路徑和絕對路徑。 3、對檔案的移動、複制、重命名、編輯等操作。
一、Linux 目錄結構
在講 Linux 目錄結構之前,你首先要清楚一點東西,那就是 Linux 的目錄與 Windows 的目錄的差別,或許對于一般操作上的感受來說沒有多大不同,但從它們的實作機制來說是完全不同的。
1.FHS 标準
第一層是, / 下面的各個目錄應該要放什麼檔案資料,例如 /etc 應該要放置設定檔案,/bin 與 /sbin 則應該要放置可執行檔案等等。
第二層則是針對 /usr 及 /var 這兩個目錄的子目錄來定義。例如 /var/log 放置系統登入檔案、/usr/share 放置共享資料等等。
Linux基礎入門
Linux基礎入門
二、Linux 檔案的基本操作
1.建立
建立空白檔案
touch
指令建立空白檔案,關于
touch
指令,其主要是來更改已有檔案的時間戳的(比如,最近通路時間,最近修改時間),但其在不加任何參數的情況下,隻指定一個檔案名,則可以建立一個為指定檔案名的空白檔案
2.複制
複制檔案
cp
(copy)指令複制一個檔案或目錄到指定目錄。将之前建立的"test"檔案複制到"/home/shiyanlou/father/son/grandson"目錄中
3.删除
删除檔案
rm
(remove files or directories)指令,删除一個檔案或目錄
4.移動檔案與檔案重命名
移動檔案
mv
(move or rename files)指令,移動檔案(剪切)。将檔案"file1"移動到"Documents"目錄
mv 源目錄檔案 目的目錄
:
5.檢視檔案
cat
tac
和 nl
指令檢視檔案
cat
tac
nl
這兩個指令都是用來列印檔案内容到标準輸出(終端),其中
cat
為正序顯示,
tac
倒序顯示。
标準輸入輸出:當我們執行一個 shell 指令行時通常會自動打開三個标準檔案,即标準輸入檔案(stdin),預設對應終端的鍵盤;标準輸出檔案(stdout)和标準錯誤輸出檔案(stderr),這兩個檔案都對應被重定向到終端的螢幕,以便我們能直接看到輸出内容。程序将從标準輸入檔案中得到輸入資料,将正常輸出資料輸出到标準輸出檔案,而将錯誤資訊送到标準錯誤檔案中。6.檢視檔案類型
通常使用指令可以檢視檔案的類型
file
7.編輯檔案
在 Linux 下面編輯檔案通常我們會直接使用專門的指令行編輯器比如(emacs,vim,nano),由于涉及 Linux 上的編輯器的内容比較多,且非常重要,故我們有一門單獨的基礎課專門介紹這其中一個編輯器(vim)。在這裡強烈希望正在學習這門 Linux 基礎課的你先在這裡暫停一下,先去學習vim 編輯器的使用(至少掌握基本的操作)然後再繼續本課程後面的内容,因為後面的内容會假設你已經學會了 vim 編輯器的使用。如果你想更加快速的入門,你可以直接使用 Linux 内部的 vim 學習教程![]()
Linux基礎入門 第五節、環境變量與檔案查找
環境變量的作用與用法,及幾種搜尋檔案的方法。學會這些技巧高效地使用 Linux。1.變量
要解釋環境變量,得先明白變量是什麼,準确的說應該是 Shell 變量,所謂變量就是計算機中用于記錄一個值(不一定是數值,也可以是字元或字元串)的符号,而這些符号将用于不同的運算進行中。通常變量與值是一對一的關系,可以通過表達式讀取它的值指派給其它變量,也可以直接指定數值指派給任意變量。為了便于運算和處理,大部分的程式設計語言會區分變量的類型,用于分别記錄數值、字元或者字元串等等資料類型。Shell 中的變量也基本如此,有不同類型(但不用專門指定類型名),可以參與運算,有作用域限定。
指令建立一個變量名為 tmp 的變量:
declare
2.環境變量
簡單了解了變量的概念,就很好解釋環境變量了,環境變量就是作用域比自定義變量要大,如Shell 的環境變量作用于自身和它的子程序。在所有的 UNIX 和類 UNIX 系統中,每個程序都有其各自的環境變量設定,且預設情況下,當一個程序被建立時,處理建立過程中明确指定的話,它将繼承其父程序的絕大部分環境設定。Shell 程式也作為一個程序運作在作業系統之上,而我們在 Shell中運作的大部分指令都将以 Shell 的子程序的方式運作。直覺了解:![]()
Linux基礎入門 通常我們會涉及到的環境變量有三種:![]()
Linux基礎入門 關于環境變量,可以簡單的了解成在目前程序的子程序是否有效,有效則為環境變量,否則不是(有些人也将所有變量統稱為環境變量,隻是以全局環境變量和局部環境變量進行區分,我們隻要了解它們的實質差別即可)。我們這裡用
- 目前 Shell 程序私有使用者自定義變量,如上面我們建立的 temp 變量,隻在目前 Shell 中有效。
- Shell 本身内建的變量。
- 從自定義變量導出的環境變量。
指令來體會一下,先在 Shell 中設定一個變量
export
,然後再新建立一個子 Shell 檢視
temp=shiyanlou
變量的值:
temp
![]()
Linux基礎入門 3.指令的查找路徑與順序
你可能很早之前就有疑問,我們在 Shell 中輸入一個指令,Shell 是怎麼知道在哪去找到這個指令然後執行的呢?這是通過環境變量來進行搜尋的,熟悉 Windows 的使用者可能知道 Windows 中的也是有這麼一個 PATH 環境變量。這個
PATH
裡面就儲存了Shell中執行的指令的搜尋路徑。
PATH
4.添加自定義路徑到“PATH”環境變量
一定要使用絕對路徑
現在你就可以在其他任意目錄執行那兩個指令了。你可能會意識到這樣還并沒有很好的解決問題,因為我給 PATH 環境變量追加了一個路徑,它也隻是在目前 Shell 有效,我一旦退出終端,再打開就會發現又失效了。有沒有方法讓添加的環境變量全局有效?或者每次啟動 Shell 時自動執行上面添加自定義路徑到 PATH 的指令?下面我們就來說說後一種方式——讓它自動執行。
在每個使用者的 home 目錄中有一個 Shell 每次啟動時會預設執行一個配置腳本,以初始化環境,包括添加一些使用者自定義環境變量等等。zsh 的配置檔案是
,相應 Bash 的配置檔案為
.zshrc
。它們在
.bashrc
下還都有一個或多個全局的配置檔案,不過我們一般隻修改使用者目錄下的配置檔案。
etc
二、搜尋檔案
與搜尋相關的指令常用的有如下幾個
whereis
which
find
。
locate
簡單快速
whereis
![]()
Linux基礎入門 通過"/var/lib/mlocate/mlocate.db"資料庫查找,不過這個資料庫也不是實時更新的,系統會使用定時任務每天自動執行
快而全
locate
指令更新一次,是以有時候你剛添加的檔案,它可能會找不到,需要手動執行一次
updatedb
指令(在我們的環境中必須先執行一次該指令)。它可以用來查找指定目錄下的不同檔案類型,如查找 /etc 下所有以 sh 開頭的檔案:
updatedb
小而精
which
本身是 Shell 内建的一個指令,我們通常使用
which
來确定是否安裝了某個指定的軟體,因為它隻從
which
環境變量指定的路徑中去搜尋指令:
PATH
![]()
Linux基礎入門 注意 find 指令的路徑是作為第一個參數的, 基本指令格式為 find [path] [option] [action]與時間相關的指令參數:下面以
-atime
最後通路時間
-ctime
建立時間
-mtime
最後修改時間 參數舉例:
-mtime
: n 為數字,表示為在n天之前的”一天之内“修改過的檔案
-mtime n
: 列出在n天之前(不包含n天本身)被修改過的檔案
-mtime +n
: 列出在n天之前(包含n天本身)被修改過的檔案
-mtime -n
: file為一個已存在的檔案,列出比file還要新的檔案名
newer file
第六節、檔案打包與壓縮
Linux 上常用的 壓縮/解壓 工具,介紹了 zip,rar,tar 的使用。
一、檔案打包和解壓縮
在講 Linux 上的解壓縮工具之前,有必要先了解以下常見常用的壓縮封包件格式。在 Windows 上我們最常見的不外乎這三種
*.zip
*.rar
字尾的壓縮檔案,而在 Linux 上面常見常用的除了以上這三種外,還有
*.7z
*.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
壓縮打包程式
zip
- 使用zip打封包件夾:
![]()
Linux基礎入門 2.使用
将指令解壓縮zip檔案
unzip
解壓到目前目錄:
shiyanlou.zip
使用安靜模式,将檔案解壓到指定目錄:$ unzip shiyanlou.zip
![]()
Linux基礎入門
打包壓縮指令
rar
也是 Windows 上常用的一種壓縮檔案格式,在 Linux 上可以使用
rar
rar
工具分别建立和解壓 rar 壓縮包。
unrar
在 Linux 上面更常用的是
打包工具
tar
工具,tar 原本隻是一個打包工具,隻是同時還是實作了對 7z,gzip,xz,bzip2 等工具的支援,這些壓縮工具本身隻能實作對檔案或目錄(單獨壓縮目錄中的檔案)的壓縮,沒有實作對檔案的打包壓縮,是以我們也無需再單獨去學習其他幾個工具,tar 的解壓和壓縮都是同一個指令,隻需參數不同,使用比較友善。
tar
作業
![]()
Linux基礎入門 ![]()
Linux基礎入門 第七節、檔案系統操作與磁盤管理
本節實驗的檔案系統操作的内容十分簡單,隻會包含幾個指令的幾個參數的講解,但掌握這些也将對你在學習 Linux 和實驗樓後續其他課程的過程中有極大幫助。
因為本課程的定位為入門基礎,盡快上手,故沒有打算涉及太多理論内容,前面省略了關于 Linux 檔案系統的一些基本知識,也因為我們是線上實驗環境,是以也避開了很少一部分但又十分重要的關于硬體的内容,我們隻能期待使用者能夠抱着提高自學能力的心态自己去補充相關的知識。一、簡單檔案系統操作
1.檢視磁盤和目錄的容量
使用 df 指令檢視磁盤的容量
一般使用情況下,我們更多隻是關心第一行的内容也就是環境中的![]()
Linux基礎入門 或者實體主機上的
rootfs
接着你還會看到"1k-blocks"這個陌生的東西,它表示以磁盤塊大小的方式顯示容量,後面為相應的以塊大小表示的已用和可用容量,在你了解 Linux 的檔案系統之前這個就先不管吧,我們以一種你應該看得懂的方式展示:
/dev/sda2
![]()
Linux基礎入門 使用 du 指令檢視目錄的容量
![]()
Linux基礎入門 二、簡單的磁盤管理
1.建立虛拟磁盤
dd 指令簡介(部分說明來自dd (Unix) wiki))
指令用于轉換和複制檔案,不過它的複制不同于
dd
。之前提到過關于 Linux 的很重要的一點,一切即檔案,在 Linux 上,硬體的裝置驅動(如硬碟)和特殊裝置檔案(如
cp
/dev/zero
)都像普通檔案一樣,隻要在各自的驅動程式中實作了對應的功能,dd 也可以讀取自和/或寫入到這些檔案。這樣,
/dev/random
也可以用在備份硬體的引導扇區、擷取一定數量的随機資料或者空資料等任務中。
dd
程式也可以在複制時處理資料,例如轉換位元組序、或在 ASCII 與 EBCDIC 編碼間互換。
dd
的指令行語句與其他的 Linux 程式不同,因為它的指令行選項格式為
dd
,而不是更标準的
選項=值
或
--選項 值
-選項=值
預設從标準輸入中讀取,并寫入到标準輸出中,但可以用選項
dd
(input file,輸入檔案)和
if
of
(output file,輸出檔案)改變。
我們先來試試用
指令從标準輸入讀入使用者輸入到标準輸出或者一個檔案:
dd
![]()
Linux基礎入門 使用 dd 指令建立虛拟鏡像檔案
通過上面一小節,你應該掌握了的基本使用,下面就來使用
dd
dd
指令來完成建立虛拟磁盤的第一步。
從
裝置建立一個容量為 256M 的空檔案:
/dev/zero
![]()
Linux基礎入門 使用 mkfs 指令格式化磁盤(我們這裡是自己建立的虛拟磁盤鏡像)
你可以在指令行輸入 mkfs 然後按下鍵,你可以看到很多個以 mkfs 為字首的指令,這些不同的字尾其實就是表示着不同的檔案系統,可以用 mkfs 格式化成的檔案系統
Tab
使用 mount 指令挂載磁盤到目錄樹
使用者在 Linux/UNIX 的機器上打開一個檔案以前,包含該檔案的檔案系統必須先進行挂載的動作,此時使用者要對該檔案系統執行 mount 的指令以進行挂載。通常是使用在 USB 或其他可移除儲存設備上,而根目錄則需要始終保持挂載的狀态。又因為 Linux/UNIX 檔案系統可以對應一個檔案而不一定要是硬體裝置,是以可以挂載一個包含檔案系統的檔案到目錄樹。
Linux/UNIX 指令行的 mount 指令是告訴作業系統,對應的檔案系統已經準備好,可以使用了,而該檔案系統會對應到一個特定的點(稱為挂載點)。挂載好的檔案、目錄、裝置以及特殊檔案即可提供使用者使用。
我們先來使用
來檢視下主機已經挂載的檔案系統:
mount
![]()
Linux基礎入門 使用 fdisk 為磁盤分區(關于分區的一些概念不清楚的使用者請參看主引導記錄)
同樣因為環境原因中沒有實體磁盤,也無法建立虛拟磁盤的原因我們就無法實驗練習使用該指令了,下面我将以我的實體主機為例講解如何為磁盤分區。![]()
Linux基礎入門
指令,可以讓你在終端裡以一種動物說話的形式列印出一段話。
cowsay
![]()
Linux基礎入門 ![]()
Linux基礎入門 ![]()
Linux基礎入門 第八節、指令執行順序控制與管道
順序執行、選擇執行、管道、cut 指令、grep 指令、wc 指令、sort 指令等,高效率使用 Linux 的技巧。
一、指令執行順序的控制
1.順序執行多條指令
通常情況下,我們每次隻能在終端輸入一條指令,按下回車執行,執行完成後,我們再輸入第二條指令,然後再按回車執行…… 你可能會遇到如下使用場景:我需要使用安裝一個軟體,然後安裝完成後立即運作安裝的軟體(或指令工具),又恰巧你的主機才更換的軟體源還沒有更新軟體清單(比如之前我們的環境中,每次重新開始實驗就得sudo apt-get update,現在已經沒有這個問題了),那麼你可能會有如下一系列操作:
apt-get
![]()
Linux基礎入門 2.有選擇的執行指令
關于上面的操作,不知你有沒有思考過一個問題,如果我們在讓它自動順序執行指令時,前面的指令執行不成功,而後面的指令又依賴與上一條指令的結果,那麼就會造成花了時間,最終卻得到一個錯誤的結果,而且有時候直覺的看你還無法判斷結果是否正确。那麼我們需要能夠有選擇性的來執行指令,比如上一條指令執行成功才繼續下一條,或者不成功又該做出其它什麼處理,比如我們使用來查找是否安裝某個指令,如果找到就執行該指令,否則什麼也不做(雖然這個操作沒有什麼實際意義,但可幫你更好的了解一些概念):
which
![]()
Linux基礎入門 二、管道
管道是什麼,管道是一種通信機制,通常用于程序間的通信(也可通過socket進行網絡通信),它表現出來的形式就是将前面每一個程序的輸出(stdout)直接作為下一個程序的輸入(stdin)。
管道又分為匿名管道和具名管道(這裡将不會讨論在源程式中使用系統調用建立并使用管道的情況,它與指令行的管道在核心中實際都是采用相同的機制)。我們在使用一些過濾程式時經常會用到的就是匿名管道,在指令行中由
分隔符表示,
|
在前面的内容中我們已經多次使用到了。具名管道簡單的說就是有名字的管道,通常隻會在源程式中用到具名管道。下面我們就将通過一些常用的可以使用管道的"過濾程式"來幫助你熟練管道的使用。
|
1.試用
先試用一下管道2,grep 指令,在文本中或 stdin 中查找比對字元串
指令是很強大的,也是相當常用的一個指令,它結合正規表達式可以實作很複雜卻很高效的比對和查找,不過在學習正規表達式之前,這裡介紹它簡單的使用,而關于正規表達式後面将會有單獨一小節介紹到時會再繼續學習
grep
指令和其他一些指令。
grep
指令的一般形式為:
grep
![]()
Linux基礎入門 4. wc 指令,簡單小巧的計數工具
wc 指令用于統計并輸出一個檔案中行、單詞和位元組的數目,比如輸出檔案的統計資訊:
/etc/passwd
5.sort 排序指令
這個指令前面我們也是用過多次,功能很簡單就是将輸入按照一定方式排序,然後再輸出,它支援的排序有按字典排序,數字排序,按月份排序,随機排序,反轉排序,指定特定字段進行排序等等6. uniq 去重指令
指令可以用于過濾或者輸出重複行。
uniq
簡單的文本處理
這一節我們将介紹這幾個指令
(注意不是tar),
tr
,
col
join
。實際這一節是上一節關于能實作管道操作的指令的延續,是以我們依然将結合管道來熟悉這些指令的使用。
paste
1.tr 指令
tr 指令可以用來删除一段文本資訊中的某些文字。或者将其進行轉換。使用方式:
tr [option]...SET1 [SET2]
常用的選項有:
選項
-d
删除和set1比對的字元,注意不是全詞比對也不是按字元順序比對
-s
去除set1指定的在輸入文本中連續并重複的字元 ![]()
Linux基礎入門 2.col 指令
col 指令可以将換成對等數量的空格建,或反轉這個操作。
Tab
3.join指令
學過資料庫的使用者對這個應該不會陌生,這個指令就是用于将兩個檔案中包含相同内容的那一行合并在一起。![]()
Linux基礎入門 4.paste指令
這個指令與
paste
指令類似,它是在不對比資料的情況下,簡單地将多個檔案合并一起,以
join
隔開
Tab
![]()
Linux基礎入門 三、小結
上面這些指令不是所有你都會經常用到,不過它們确是很實用的,熟練掌握之後,可以減輕很多工作量,比如不停的用滑鼠操作在 gedit 裡面複制粘貼指派粘貼,将兩個檔案的内容合并為一個檔案,這原本隻需要一個指令就能完成。
四、作業
![]()
Linux基礎入門 ![]()
Linux基礎入門 第十節、資料流重定向
你可能對重定向這個概念感到些許陌生,但你應該在前面的課程中多次見過
>
操作了,并知道他們分别是将标準輸出導向一個檔案或追加到一個檔案中。這其實就是重定向,将原本輸出到标準輸出的資料重定向到一個檔案中,因為标準輸出(
>>
)本身也是一個檔案,我們将指令輸出導向另一個檔案自然也是沒有任何問題的。
/dev/stdout
一、資料流重定向
1.簡單的重定向
在更多了解 Linux 的重定向之前,我們需要先知道一些基本的東西,前面我們已經提到過 Linux 預設提供了三個特殊裝置,用于終端的顯示和輸出,分别為(标準輸入,對應于你在終端的輸入),
stdin
(标準輸出,對應于終端的輸出),
stdout
(标準錯誤輸出,對應于終端的輸出)。
stderr
檔案描述符 裝置檔案
/dev/stdin
标準輸入
1
/dev/stdout
标準輸出
2
/dev/stderr
标準錯誤 檔案描述符:檔案描述符在形式上是一個非負整數。實際上,它是一個索引值,指向核心為每一個程序所維護的該程序打開檔案的記錄表。當程式打開一個現有檔案或者建立一個新檔案時,核心向程序傳回一個檔案描述符。在程式設計中,一些涉及底層的程式編寫往往會圍繞着檔案描述符展開。但是檔案描述符這一概念往往隻适用于 UNIX、Linux 這樣的作業系統。2.标準錯誤重定向
重定向标準輸出到檔案,這是一個很實用的操作,另一個很實用的操作是将标準錯誤重定向,标準輸出和标準錯誤都被指向僞終端的螢幕顯示,是以我們經常看到的一個指令的輸出通常是同時包含了标準輸出和标準錯誤的結果的。3.使用
經常你可能還有這樣的需求,除了将需要将輸出重定向到檔案之外也需要将資訊列印在終端,那麼你可以使用指令同時重定向到多個檔案
tee
指令來實作:
tee
4.永久重定向
你應該可以看出我們前面的重定向操作都隻是臨時性的,即隻對目前指令有效,那如何做到“永久”有效呢,比如在一個腳本中,你需要某一部分的指令的輸出全部進行重定向,難道要讓你在每個指令上面加上臨時重定向的操作嘛,當然不需要,我們可以使用指令實作“永久”重定向。
exec
指令的作用是使用指定的指令替換目前的 Shell,及使用一個程序替換目前程序,或者指定新的重定向:
exec
5.建立輸出檔案描述符
預設在 Shell 中可以有9個打開的檔案描述符,上面我們使用了也是它預設提供的
1
号檔案描述符,另外我們還可以使用3-8的檔案描述符,隻是它們預設沒有打開而已,你可以使用下面指令檢視目前 Shell 程序中打開的檔案描述符:
2
6.關閉檔案描述符
如上面我們打開的3号檔案描述符,可以使用如下操作将它關閉:7.完全屏蔽指令的輸出
在 Linux 中有一個被成為“黑洞”的裝置檔案,是以導入它的資料都将被“吞噬”。在類 UNIX 系統中,/dev/null,或稱空裝置,是一個特殊的裝置檔案,它通常被用于丢棄不需要的輸出流,或作為用于輸入流的空檔案,這些操作通常由重定向完成。讀取它則會立即得到一個EOF。8.使用 xargs 分割參數清單
xargs 是一條 UNIX 和類 UNIX 作業系統的常用指令。它的作用是将參數清單轉換成小塊分段傳遞給其他指令,以避免參數清單過長的問題。![]()
Linux基礎入門 ![]()
Linux基礎入門 ![]()
Linux基礎入門 第十一節、正規表達式基礎
雖然我們這一節的标題是正規表達式,但實際這一節實驗隻是介紹
grep
sed
這三個指令,而正規表達式作為這三個指令的一種使用方式(指令輸出中可以包含正規表達式)。正規表達式本身的内容很多,要把它說明清楚需要單獨一門課程來實作,不過我們這一節中涉及到的相關内容通常也能夠滿足很多情況下的需求了。
awk
想要更深入地學習使用正規表達式,在這裡 正規表達式基礎。一、正規表達式
正規表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、正常表示法(英語:Regular Expression,在代碼中常簡寫為 regex、regexp 或 RE),計算機科學的一個概念。正規表達式使用單個字元串來描述、比對一系列符合某個句法規則的字元串。在很多文本編輯器裡,正規表達式通常被用來檢索、替換那些符合某個模式的文本。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
的正規表達式比對規則:(由于markdown表格解析的問題,下面的豎直分隔符用全角字元代替,實際使用時請換回半角字元)
egrep
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 比對x或y。例如,“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} 限定符 ^、$、\任何元字元 定位點和序列 | 選擇 regex的思導圖:
- 正規表達式wiki
- 幾種正規表達式引擎的文法差異
- 各語言各平台對正規表達式的支援
二、grep模式比對指令
上面空談了那麼多正規表達式的内容也并沒有提及具體該如何使用它,實在枯燥,如果說正規表達式是一門武功話,那它也隻能算得上一些口訣招式罷了,要把它真正練起來還得需要一些兵器在手才行,這裡我們要介紹的指令以及後面要講的
grep
sed
這些就該算作是這樣的兵器了。
awk
1.基本操作
指令用于列印輸出文本中比對的模式串,它使用正規表達式作為模式比對的條件。
grep
支援三種正規表達式引擎,分别用三個參數指定:
grep
不過在你沒學過perl語言的大多數情況下你将隻會使用到
-E
POSIX擴充正規表達式,ERE
-G
POSIX基本正規表達式,BRE
-P
Perl正規表達式,PCRE
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
查找
- 位置
檔案中以"shiyanlou"為開頭的行
/etc/group
3、使用擴充正規表達式,ERE
要通過使用擴充正規表達式需要加上
grep
參數,或使用
-E
egrep
三、sed 流編輯器
sed
工具在 man 手冊裡面的全名為"sed - stream editor for filtering and transforming text ",意即,用于過濾和轉換文本的流編輯器。
在 Linux/UNIX 的世界裡敢稱為編輯器的工具,大都非等閑之輩,比如前面的"vi/vim(編輯器之神)","emacs(神的編輯器)","gedit"這些個編輯器。
與上述的最大不同之處大于它是一個非互動式的編輯器,下面我們就開始介紹
sed
這個編輯器。
sed
sed常用參數介紹
四、awk文本處理語言
看到上面的标題,你可能會感到驚異,難道我們這裡要學習的是一門“語言”麼,确切的說,我們是要在這裡學習文本處理語言,隻是我們并不會在這裡學習到比較完整的關于
awk
的内容,還是因為前面的原因,它太強大了,它的應用無處不在,我們無法在這裡以簡短的文字描述面面俱到,如果你有目标成為一個linux系統管理者,确實想學好
awk
,你一不用擔心,實驗樓會在之後陸續上線linux系統管理者的學習路徑,裡面會有單獨的關于
awk
正規表達式
awk
等相關課程,敬請期待吧。下面的内容,我們就作為一個關于
sed
的入門體驗章節吧,其中會介紹一些
awk
的常用操作。
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
6.awk常用的内置變量
變量名
FILENAME
目前輸入檔案名,若有多個檔案,則隻表示第一個。如果輸入是來自标準輸入,則為空字元串
$0
目前記錄的内容
$N
N表示字段号,最大值為 變量的值
NF
FS
字段分隔符,由正規表達式表示,預設為" "空格
RS
輸入記錄分隔符,預設為"\n",即一行為一個記錄
NF
目前記錄字段數
NR
已經讀入的記錄數
FNR
目前輸入檔案的記錄數,請注意它與NR的差別
OFS
輸出字段分隔符,預設為" "空格
ORS
輸出記錄分隔符,預設為"\n" 第十二節、Linux 下軟體安裝
實驗内容
介紹 Ubuntu 下軟體安裝的幾種方式,及 apt,dpkg 工具的使用。一、Linux 上的軟體安裝
通常 Linux 上的軟體安裝主要有三種方式:這幾種安裝方式各有優劣,而大多數軟體包會采用多種方式釋出軟體,是以我們常常需要全部掌握這幾種軟體安裝方式,以便适應各種環境。下面将介紹前三種安裝方式,從源碼編譯安裝你将在 Linux 程式設計中學習到。
- 線上安裝
- 從磁盤安裝deb軟體包
- 從二進制軟體包安裝
- 從源代碼編譯安裝
二、線上安裝
試想一下,平時我們在使用 Windows 的時候,想要安裝一個軟體,我們需要在網上去下載下傳對應軟體的安裝包,接着安裝的時候就是不斷的去點選下一步,這些流程想必大家已經經曆的無數回了,但是在 Linux 下,一個指令加回車,等待一下,軟體就安裝好了,這就是友善的線上安裝軟體的方式。在學習這種安裝方式之前有一點需要說明的是,在不同的linux發行版上面線上安裝方式會有一些差異包括使用的指令及它們的包管理工具,因為我們的開發環境是基于ubuntu的,是以這裡我們涉及的線上安裝方式将隻适用于ubuntu發行版,或其它基于ubuntu的發行版如國内的ubuntukylin(優麒麟),ubuntu又是基于debian的發行版,它使用的是debian的包管理工具dpkg,是以一些操作也适用與debian。而在其它一些采用其它包管理工具的發行版如redhat,centos,fedora等将不适用(redhat和centos使用rpm)。2. apt 包管理工具介紹
APT是Advance Packaging Tool(進階包裝工具)的縮寫,是Debian及其派生發行版的軟體包管理器,APT可以自動下載下傳,配置,安裝二進制或者源代碼格式的軟體包,是以簡化了Unix系統上管理軟體的過程。APT最早被設計成dpkg的前端,用來處理deb格式的軟體包。現在經過APT-RPM組織修改,APT已經可以安裝在支援RPM的系統管理RPM包。這個包管理器包含以當你在執行安裝操作時,首先開頭的的多個工具,如
apt-
apt-get
apt-cache
等,在Debian系列的發行版中使用。
apt-cdrom
工具會在本地的一個資料庫中搜尋關于
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
7.軟體搜尋
當自己剛知道了一個軟體,想下載下傳使用,需要确認軟體倉庫裡面有沒有,就需要用到搜尋功能了,指令如下:sudo apt-cache search softname1 softname2 softname3……
指令則是針對本地資料進行相關操作的工具,
apt-cache
顧名思義在本地的資料庫中尋找有關
search
softname1
…… 相關軟體的資訊。現在我們試試搜尋一下之前我們安裝的軟體
softname2
,
w3m
三、使用 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/目錄下的内容,如下圖:
然後我們将第一個
拷貝到home目錄下,并使用
deb
安裝
dpkg
如你所見,這個包還額外依賴了一些軟體包,這意味着,如果主機目前沒有這些被依賴的軟體包,直接使用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安裝 $ sudo dpkg -i emacs24_24.3+1-4ubuntu1_amd64.deb
跟前面預料的一樣,這裡你可能出現了一些錯誤:
我們将如何解決這個錯誤了,這就要用到
了,使用它的
apt-get
參數了,修複依賴關系的安裝
-f
沒有任何錯誤,這樣我們就安裝成功了,然後你可以運作emacs程式$ sudo apt-get -f install
3.檢視已安裝軟體包的安裝目錄
如果你依然在糾結到底linux将軟體安裝到了什麼地方,那麼很幸運你将可以通過找到答案
dpkg
檢視
dpkg -L
包目錄資訊
deb
四、從二進制包安裝
二進制包的安裝比較簡單,我們需要做的隻是将從網絡上下載下傳的二進制包解壓後放到合适的目錄,然後将包含可執行的主程式檔案的目錄添加進
PATH
環境變量即可,如果你不知道該放到什麼位置,請重新複習第四節關于 Linux 目錄結構的内容。
總結:
實驗中遇到的問題:
![]()
Linux基礎入門 在這個實驗中無法打開軟體包,重新輸入多次也未能解決。
實驗感悟:
本次實驗是本個學期對linux學習的第一個課程,讓我們有效的掌握了linux基礎的知識。在實驗過程中雖然遇到了許多問題,例如實驗樓掉線,代碼敲擊錯誤,無法實作預定的項目,但是在自己的不停鑽研和同學的幫助下順利地完成了本次學習。也體會到了linux的神奇之處,也大緻掌握了linux的學習基礎知識,希望在未來的日子裡,能夠更好地運用linux在我們的日常生活和學習中。也希望在未來的日子裡更好的學習更多知識。