北京電子科技學院(BESTI)javascript
實 驗 報 告css
課程:信息安全系統設計基礎 班級:1352 姓名:呂鬆鴻 學號:20135229前端
成績: 指導教師:婁嘉鵬 實驗日期:2015.9.20java
實驗密級: 預習程度: 實驗時間:10:00--22:00python
儀器組次:29 必修/選修: 選修 實驗序號:1~12linux
(一)Linux 簡介web
實驗介紹正則表達式
本節主要介紹 Linux 的歷史,Linux 與 Windows 的區別等入門知識。若是你已經有過充分的瞭解,能夠跳過本節,直接進入下一個實驗。sql
1、Linux 爲什麼物shell
Linux 就是一個操做系統,就像你多少已經瞭解的 Windows(xp,7,8)和 Max OS ,至於操做系統是什麼,就不用過多解釋了,若是你學習過前面的入門課程,應該會有個基本概念了,這裏簡單介紹下操做系統在整個計算機系統中的角色。
咱們的 Linux 也就是系統調用和內核那兩層,固然直觀的來看,咱們使用的操做系統還包含一些在其上運行的應用程序,好比文本編輯器,瀏覽器,電子郵件。
2、Linux 歷史簡介
3、Linux 重要人物
1.Ken Thompson:C 語言之父和 UNIX 之父
2.Dennis Ritchie:C 語言之父和 UNIX 之父
3.Stallman:著名黑客,GNU 創始人,開發了 Emacs、gcc、bash shell
4.Bill Joy:BSD 開發者
5.Tanenbaum:Minix 開發者
6.Linus Torvalds:Linux 之父,芬蘭赫爾辛基大學
4、Linux 與 Windows 到底有哪些不一樣
1.免費與收費
2.軟件與支持
3.安全性
4.使用習慣
5.可定製性
6.應用範疇
或許你以前不知道 Linux ,要知道,你以前在 Windows 使用百度,谷歌,上淘寶,聊 QQ 時,支撐這些軟件和服務的,是後臺成千上萬的 Linux 服務器主機,它們時時刻刻都在進行着忙碌的數據處理和運算,能夠說世界上大部分軟件和服務都是運行在 Linux 之上的。
7.Windows 沒有的
8.Linux 沒有的
5、如何學習 Linux
1.學習心態
2.注重基礎,從頭開始
(二)基本概念及操做
相對於如今的 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 上你能夠本身選擇安裝不一樣的桌面環境,甚至能夠定製本身的專屬桌面。
若是你對當前實驗桌面環境(xfce)的使用有任何困難,建議你先學習實驗樓入門基礎課程,對於其它桌面環境的使用,不在本課程的範圍之類,有興趣的用戶能夠在本身計算機中安裝完整的 Linux 發行版或其 Live CD 體驗。
關於登陸帳戶密碼的說明, 實驗樓環境中全部的默認系統用戶名均爲 shiyanlou,密碼爲 shiyanlou
3、Linux終端
一般在咱們使用 Linux 時,咱們並非直接與系統打交道,而是經過一個叫作 Shell 的中間程序來完成的,在圖形界面下爲了實現讓咱們在一個窗口中完成接受用戶輸入和顯示輸出,Linux 系統還提供了一個叫作終端模擬器的程序(Terminal),下面幾個比較常見的終端模擬器,例如 gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm,目前咱們的實驗中的終端程序是 xfce 桌面環境自帶的 xfce-terminal。不過要注意的是這裏所說的終端(Terminal)和控制檯(Console)是有區別的。
終端本質上是對應着 Linux 上的 /dev/tty 設備,Linux 的多用戶登錄就是經過不一樣的 /dev/tty 設備完成的,Linux 默認提供了 6 個純命令行界面的 「terminal」(準確的說這裏應該是 6 個 virtual consoles)來讓用戶登陸,在物理機系統上你能夠經過使用[Ctrl]+[Alt]+[F1]~[F6]進行切換,不過在咱們的在線實驗環境中可能沒法切換,由於特殊功能按鍵會被你主機系統劫持。當你切換到其中一個終端後想要切換回圖形界面,你能夠按下[Ctrl]+[Alt]+[F7]來完成。
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
鍵來強行終止當前程序(你能夠放心它並不會使終端退出)。
而後你會發現你接下來的輸入都沒有任何反應了,只是將你輸入的東西顯示出來,如今你可使用Ctrl+c
,來中斷這個你目前可能還不知道是什麼的程序了。
按鍵 |
做用 |
|
鍵盤輸入結束或退出終端 |
|
暫定當前程序,暫停後按下任意鍵恢復運行 |
|
將當前程序放到後臺運行,恢復到前臺爲命令 |
|
將光標移至輸入行頭,至關於 |
|
將光標移至輸入行末,至關於 |
|
刪除從光標所在位置到行末 |
|
向前刪除一個單詞 |
|
將終端顯示向上滾動 |
|
將終端顯示向下滾動 |
很簡單,你可使用鍵盤上的方向上
鍵,恢復你以前輸入過的命令,你一試便知。
通配符是一種特殊語句,主要有星號(*)和問號(?),用來對對字符串進行模糊匹配(好比文件名,參數名)。當查找文件夾時,可使用它來代替一個或多個真正字符;當不知道真正字符或者懶得輸入完整名字時,經常使用通配符代替一個或多個真正的字符。
終端裏面輸入的通配符是由 Shell 處理的,不是由所涉及到命令語句處理的,它只會出如今命令的「參數值」裏(它不用在 命令名稱裏, 命令不記得,那就用Tab
補全)。當 Shell 在「參數值」中遇到了通配符時,Shell 會將其看成路徑或文件名去在磁盤上搜尋可能的匹配:若符合要求的匹配存在,則進行代換(路徑擴展);不然就將該通配符做爲一個普通字符傳遞給「命令」,而後再由命令進行處理。總之,通配符 實際上就是一種 Shell 實現的路徑擴展功能。在 通配符被處理後, Shell 會先完成該命令的重組,而後再繼續處理重組後的命令,直至執行該命令。
先使用 touch 命令建立 2 個文件,後綴都爲 txt:
方在建立文件的時候,若是須要一次性建立多個文件,好比:「love_1_linux.txt,love_2_linux.txt,... love_10_linux.txt」。在 Linux 中十分便:
Shell 經常使用通配符:
字符 |
含義 |
|
匹配 0 或多個字符 |
|
匹配任意一個字符 |
|
匹配 list 中的任意單一字符 |
|
匹配 除list 中的任意單一字符之外的字符 |
|
匹配 c1-c2 中的任意單一字符 如:[0-9] [a-z] |
|
匹配 sring1 或 string2 (或更多)其一字符串 |
|
匹配 c1-c2 中所有字符 如{1..10} |
在 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
(回車鍵)向下滾動一行,或者使用j
,k
(vim編輯器的移動鍵)進行向前向後滾動一行。按下h
鍵爲顯示使用幫助(由於man使用less做爲閱讀器,實爲less
工具的幫助),按下q
退出。
想要得到更詳細的幫助,你還可使用info
命令,不過一般使用man
就足夠了。若是你知道某個命令的做用,只是想快速查看一些它的某個具體參數的做用,那麼你可使用--help
參數,大部分命令都會帶有這個參數,如:
$ ls --help
做業
'-w'參數指定打印寬度,由於咱們的環境在屏幕中顯示比較小,必需要加上寬度限制。
還有兩個相似的命令toilet
,figlet
,做爲做業安裝試用。
(三)用戶及文件權限管理
經過第一節課程的學習,你應該已經知道,Linux 是一個能夠實現多用戶登錄的操做系統,好比「李雷」和「韓梅梅」均可以同時登錄同一臺主機,他們共享一些主機的資源,但他們也分別有本身的用戶空間,用於存放各自的文件。但實際上他們的文件都是放在同一個物理磁盤上的甚至同一個邏輯分區或者目錄裏,可是因爲 Linux 的 用戶管理 和 權限機制 ,不一樣用戶不能夠輕易地查看、修改彼此的文件。
參數 |
說明 |
-a |
打印能打印的所有 |
-d |
打印死掉的進程 |
-m |
同am i,mom likes |
-q |
打印當前登陸用戶數及用戶名 |
-u |
打印當前登陸用戶登陸信息 |
-r |
打印運行等級 |
2.建立用戶
咱們通常登陸系統時都是以普通帳戶的身份登陸的,要建立用戶須要 root 權限,這裏就要用到 sudo
這個命令了。不過使用這個命令有兩個大前提,一是你要知道當前登陸用戶的密碼,二是當前用戶必須在 sudo
用戶組。shiyanlou 用戶的密碼就是 「shiyanlou」 ,它同時也屬於 sudo 用戶組(稍後會介紹如何查看和添加用戶組)。如今咱們新建一個叫 lilei 的用戶:
3.用戶組
方法一:使用groups命令
方法二:查看/etc/group
文件
etc/group
文件格式說明/etc/group 的內容包括用戶組(Group)、用戶組口令、GID 及該用戶組所包含的用戶(User),每一個用戶組一條記錄。格式以下:
group_name:password:GID:user_list
你看到上面的 password 字段爲一個 'x' 並非說密碼就是它,只是表示密碼不可見而已
4.刪除用戶
2、Linux 文件權限
1.查看文件權限
咱們以前已經不少次用到 ls
命令了,如你所見,咱們用它來列出並顯示當前目錄下的文件,固然這是在不帶任何參數的狀況下,它能作的固然不止這麼多,如今咱們就要用它來查看文件權限。
使用較長格式列出文件:
關於 ls
命令的一些其它經常使用的用法:
固然,你能夠同時使用 '-A' 和 '-l' 參數:
查看某一個目錄的完整屬性,而不是顯示目錄裏面的文件屬性:
顯示全部文件大小,並以普通人類能看懂的方式呈現:
其中小 s 爲顯示文件大小,大 S 爲按文件大小排序,若須要知道如何按其它方式排序,請使用「man」命令查詢。
2.變動文件全部者
假設目前是 lilei 用戶登陸,新建一個文件,命名爲 「iphone6」:
3.修改文件權限
若是你有一個本身的文件不想被其餘用戶讀、寫、執行,那麼就須要對文件的權限作修改,這裏有兩種方式:
方式二:加減賦值操做
做業
添加一個用戶loutest
,使用sudo
建立文件/opt/forloutest
,設置成用戶loutest
能夠讀寫。
(四)Linux 目錄結構及文件基本操做
1、Linux 目錄結構
1.FHS 標準
FHS(英文:Filesystem Hierarchy Standard 中文:文件系統層次結構標準),多數 Linux 版本採用這種文件組織形式,FHS 定義了系統中每一個區域的用途、所須要的最小構成的文件和目錄同時還給出了例外處理與矛盾處理。
FHS 定義了兩層規範,第一層是, / 下面的各個目錄應該要放什麼文件數據,例如 /etc 應該要放置設置文件,/bin 與 /sbin 則應該要放置可執行文件等等。
第二層則是針對 /usr 及 /var 這兩個目錄的子目錄來定義。例如 /var/log 放置系統登陸文件、/usr/share 放置共享數據等等。
2.目錄路徑
路徑
絕對路徑
關於絕對路徑,簡單地說就是以根"/"目錄爲起點的完整路徑,以你所要到的目錄爲終點,表現形式如: /usr/local/bin
,表示根目錄下的 usr 目錄中的 local 目錄中的 bin 目錄。
相對路徑,也就是相對於你當前的目錄的路徑,相對路徑是以當前目錄 .
爲起點,以你所要到的目錄爲終點,表現形式如: usr/local/bin
(這裏假設你當前目錄爲根目錄)。你可能注意到,咱們表示相對路徑實際並無加上表示當前目錄的那個 .
,而是直接以目錄名開頭,由於這個 usr
目錄爲 /
目錄下的子目錄,是能夠省略這個 .
的(之後會講到一個相似不能省略的狀況);若是是當前目錄的上一級目錄,則須要使用 ..
,好比你當前目錄爲「home」目錄,根目錄就應該表示爲 ../../
,表示上一級目錄("home"目錄)的上一級目錄("/"目錄)。
2、Linux 文件的基本操做
1.新建
新建空白文件
使用 touch
命令建立空白文件,關於 touch
命令,其主要是來更改已有文件的時間戳的(好比,最近訪問時間,最近修改時間),但其在不加任何參數的狀況下,只指定一個文件名,則能夠建立一個爲指定文件名的空白文件(不會覆蓋已有同名文件),固然你也能夠同時指定該文件的時間戳,更多關於 touch
命令的用法,會在下一講文件搜索中涉及。
建立名爲 test 的空白文件,由於在其餘目錄沒有權限,因此須要先 cd ~
切換回用戶的 /home/shiyanlou
目錄:
$ cd ~
$ touch test
新建目錄
使用 mkdir
(make directories)命令能夠建立一個空目錄,也可同時指定建立目錄的權限屬性
建立名爲"mydir"的空目錄:
2.複製
複製文件
使用cp
(copy)命令複製一個文件或目錄到指定目錄。
複製目錄
若是直接使用cp
命令,複製一個目錄的話,會出現以下錯誤:
-r
或者-R
參數,表示遞歸複製3.刪除
刪除文件
使用rm
(remove files or directories)命令,刪除一個文件或目錄:
你若是想忽略這提示,直接刪除文件,可使用-f
參數強制刪除:
$ rm -f test
刪除目錄
跟複製目錄同樣,要刪除一個目錄,也須要加上-r
或-R
參數:
$ rm -r family
4.移動文件與文件重命名
移動文件
使用mv
(move or rename files)命令,移動文件(剪切)。將文件"file1"移動到"Documents"目錄mv
源目錄文件
目的目錄
:
重命名文件
將文件"file1"重命名爲"myfile" mv
舊的文件名
新的文件名
:
$ mv file1 myfile
批量重命名
rename
是先使用第二個參數的通配符匹配全部後綴爲.txt
的文件,而後使用第一個參數提供的正則表達式將匹配的這些文件的.txt
後綴替換爲.c
,這一點在咱們後面學習了sed
命令後,相信你會更好的理解。
5.查看文件
cat
,tac
和nl
命令查看文件這兩個命令都是用來打印文件內容到標準輸出(終端),其中cat
爲正序顯示,tac
倒序顯示。
標準輸入輸出:當咱們執行一個 shell 命令行時一般會自動打開三個標準文件,即標準輸入文件(stdin),默認對應終端的鍵盤;標準輸出文件(stdout)和標準錯誤輸出文件(stderr),這兩個文件都對應被重定向到終端的屏幕,以便咱們能直接看到輸出內容。進程將從標準輸入文件中獲得輸入數據,將正常輸出數據輸出到標準輸出文件,而將錯誤信息送到標準錯誤文件中。
好比咱們要查看以前從"/etc"目錄下拷貝來的passwd
文件,能夠加上-n
參數顯示行號:
nl
命令,添加行號並打印,這是個比cat -n
更專業的行號打印命令。
這裏簡單列舉它的經常使用的幾個參數:
-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"(一個強大的編輯器,咱們有單獨的課程來讓你學習)開發,功能更強大。less 的使用基本和 more 一致,具體使用請查看 man 手冊,這裏只介紹 more 命令的使用。
使用more
工具打開passwd
文件:
打開後默認只顯示一屏內容,終端底部顯示當前閱讀的進度(百分比)。可使用Enter
鍵向下滾動一行,使用Space
鍵向下滾動一屏,按下h
顯示幫助,q
退出。
使用head
和tail
命令查看文件
6.查看文件類型
前面我提到過,在 Linux 下面文件的類型不是根據文件後綴來判斷的,咱們一般使用file
命令能夠查看文件的類型:
7.編輯文件
在 Linux 下面編輯文件一般咱們會直接使用專門的命令行編輯器好比(emacs,vim,nano),因爲涉及 Linux 上的編輯器的內容比較多,且很是重要,故咱們有一門單獨的基礎課專門介紹這其中一個編輯器(vim)。
做業
(五)環境變量與文件查找
1、環境變量
在 Shell 中如何建立一個變量,如何給變量賦值和如何讀取變量的值呢?這部份內容會在bash 腳本編程這門課中詳細介紹,這裏我簡單舉例說明一下:
使用declare
命令建立一個變量名爲 tmp 的變量:
$ declare tmp
其實也能夠不用 declare 預聲明一個變量,直接即用即建立,這裏只是告訴你 declare 的做用,這在建立其它指定類型的變量(如數組)時會用到。
使用=
號賦值運算符爲變量 tmp 賦值爲 shiyanlou:
$ tmp=shiyanlou
讀取變量的值,使用echo
命令和$
符號($符號用於表示引用一個變量的值,初學者常常會忘記輸入):
$ echo $tmp
2.環境變量
一般咱們會涉及到的環境變量有三種:
也有三個與上述三種環境變量相關的命令,set,env,export。這三個命令很類似,均可以用於打印相關環境變量,區別在於涉及的是不一樣範圍的環境變量,詳見下表:
命令 |
說明 |
set |
顯示當前 Shell 全部環境變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量 |
env |
顯示與當前用戶相關的環境變量,還可讓命令在指定環境中運行 |
export |
顯示從 Shell 中導出成環境變量的變量,也能經過它將自定義變量導出爲環境變量 |
關於環境變量,能夠簡單的理解成在當前進程的子進程是否有效,有效則爲環境變量,不然不是(有些人也將全部變量統稱爲環境變量,只是以全局環境變量和局部環境變量進行區分,咱們只要理解它們的實質區別便可)。咱們這裏用export
命令來體會一下,先在 Shell 中設置一個變量temp=shiyanlou
,而後再新建立一個子 Shell 查看temp
變量的值:
3.命令的查找路徑與順序
查看PATH環境變量的內容:
$ echo $PATH
默認狀況下你會看到以下輸出:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
下面咱們將練習建立一個最簡單的可執行 Shell 腳本和一個使用 C 語言建立的"hello world"程序
4.添加自定義路徑到「PATH」環境變量
在前面咱們應該注意到PATH裏面的路徑是以:做爲分割符,因此咱們能夠這樣添加自定義路徑:
$ PATH=$PATH:/home/shiyanlou/mybin
注意這裏必定要使用絕對路徑
咱們能夠簡單的使用下面命令直接添加內容到.zshrc中:
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中>>表示將標準輸出以追加的方式重定向到一個文件中,注意前面用到的>是以覆蓋的方式重定向到一個文件中,使用的時候必定要注意分辨。在指定文件不存在的狀況下都會建立新的文件。
變量的修改有如下幾種方式:
變量設置方式 |
說明 |
|
從頭向後開始匹配,刪除符合匹配字串的最短數據 |
|
從頭向後開始匹配,刪除符合匹配字串的最長數據 |
|
從尾向前開始匹配,刪除符合匹配字串的最短數據 |
|
從尾向前開始匹配,刪除符合匹配字串的最長數據 |
|
將符合舊字串的第一個字串替換爲新的字串 |
|
將符合舊字串的所有字串替換爲新的字串 |
在上面咱們在 Shell 中修改了一個配置腳本文件以後(好比 zsh 的配置文件 home 目錄下的.zshrc
),每次都要退出終端從新打開甚至重啓主機以後其才能生效,非常麻煩,咱們可使用source
命令來讓其當即生效,如:
$ source .zshrc
source
命令還有一個別名就是.
,注意與表示當前路徑的那個點區分開,雖然形式同樣,但做用和使用方式同樣,上面的命令若是替換成.
的方式就該是
$ . ./.zshrc
注意第一個點後面有一個空格,並且後面的文件必須指定完整的絕對或相對路徑名,source 則不須要。
2、搜索文件
與搜索相關的命令經常使用的有以下幾個whereis,which,find,locate。
做業
(六)文件打包與壓縮
1、文件打包和解壓縮
在講 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。下面會依次介紹這幾個命令及對應的解壓命令。
上面命令將 shiyanlou 的 home 目錄打包成一個文件,並查看了打包後文件的大小和類型。第一行命令中,-r參數表示遞歸打包包含子目錄的所有內容,-q參數表示爲安靜模式,即不向屏幕輸出信息,-o,表示輸出文件,需在其後緊跟打包輸出文件名。後面使用du命令查看打包後文件的大小(後面會具體說明該命令)。
$ 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
使用-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來達到以上目的。
使用-O(英文字母,大寫o)參數指定編碼類型:
unzip -O GBK 中文壓縮文件.zip
3.rar打包壓縮命令
rar也是 Windows 上經常使用的一種壓縮文件格式,在 Linux 上可使用rar和unrar工具分別建立和解壓 rar 壓縮包。
$ 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 x shiyanlou.rar
去掉路徑解壓:
$ mkdir tmp
$ unrar e shiyanlou.rar tmp/
rar命令參數很是多,上面只涉及了一些基本操做
4.tar打包工具
$ tar -cf shiyanlou.tar ~
$ mkdir tardir
$ tar -xf shiyanlou.tar -C tardir
$ tar -tf shiyanlou.tar
$ tar -cphf etc.tar /etc
對於建立不一樣的壓縮格式的文件,對於tar來講是至關簡單的,須要的只是換一個參數,這裏咱們就以使用gzip工具建立*.tar.gz文件爲例來講明。
$ tar -czf shiyanlou.tar.gz ~
$ tar -xzf shiyanlou.tar.gz
壓縮文件格式 |
參數 |
*.tar.gz |
-z |
*.tar.xz |
-J |
*tar.bz2 |
-j |
做業
(七)文件系統操做與磁盤管理
1、簡單文件系統操做
1.查看磁盤和目錄的容量
使用 df 命令查看磁盤的容量
這個命令前面其實已經用了不少次了:
# 默認一樣以 blocks 的大小展現
$ du
# 加上`-h`參數,以更易讀的方式展現
$ du -h
-d
參數指定查看目錄的深度
# 只查看1級目錄的信息
$ du -h -d 0 ~
# 查看2級
$ du -h -d 1 ~
2、簡單的磁盤管理
1.建立虛擬磁盤
咱們先來試試用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
命令來完成建立虛擬磁盤的第一步。
從/dev/zero
設備建立一個容量爲 256M 的空文件:
$ dd if=/dev/zero of=virtual.img bs=1M count=256
$ du -h virtual.img
你能夠在命令行輸入 mkfs 而後按下Tab
鍵,你能夠看到不少個以 mkfs 爲前綴的命令,這些不一樣的後綴其實就是表示着不一樣的文件系統,能夠用 mkfs 格式化成的文件系統:
咱們能夠簡單的使用下面的命令來將咱們的虛擬磁盤鏡像格式化爲ext4文件系統:
$ mkfs.ext4 virtual.img
使用 mount 命令掛載磁盤到目錄樹
咱們先來使用mount來查看下主機已經掛載的文件系統:
$ sudo mount
# 命令格式 sudo umount 已掛載設備名或者掛載點,如:
$ sudo umount /mnt
使用 fdisk 爲磁盤分區(關於分區的一些概念不清楚的用戶請參看主引導記錄)
$ sudo losetup /dev/loop0 virtual.img
# 若是提示設備忙你也可使用其它的迴環設備,"ls /dev/loop*"參看全部迴環設備
# 解除設備關聯
$ sudo losetup -d /dev/loop0
而後再使用mkfs格式化各分區(前面咱們是格式化整個虛擬磁盤鏡像文件或磁盤),不過格式化以前,咱們還要爲各分區創建虛擬設備的映射,用到kpartx工具,須要先安裝:
$ sudo apt-get install kpartx
$ sudo kpart kpartx -av /dev/loop0
# 取消映射
$ sudo kpart kpartx -dv /dev/loop0
接着再是格式化,咱們將其所有格式化爲 ext4:
$ sudo mkfs.ext4 -q /dev/mapper/loop0p1
$ sudo mkfs.ext4 -q /dev/mapper/loop0p5
$ sudo mkfs.ext4 -q /dev/mapper/loop0p6
格式化完成後在/media目錄下新建四個空目錄用於掛載虛擬磁盤:
$ mkdir -p /media/virtualdisk_{1..3}
# 掛載磁盤分區
$ sudo mount /dev/mapper/loop0p1 /media/virtualdisk_1
$ sudo mount /dev/mapper/loop0p5 /media/virtualdisk_2
$ sudo mount /dev/mapper/loop0p6 /media/virtualdisk_3
# 卸載磁盤分區
$ sudo umount /dev/mapper/loop0p1
$ sudo umount /dev/mapper/loop0p5
$ sudo umount /dev/mapper/loop0p6
而後:
$ df -h
做業
一般狀況下,咱們每次只能在終端輸入一條命令,按下回車執行,執行完成後,咱們再輸入第二條命令,而後再按回車執行…… 你可能會遇到以下使用場景:我須要使用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 # 讓它本身運行
關於上面的操做,不知你有沒有思考過一個問題,若是咱們在讓它自動順序執行命令時,前面的命令執行不成功,然後面的命令又依賴與上一條命令的結果,那麼就會形成花了時間,最終卻獲得一個錯誤的結果,並且有時候直觀的看你還沒法判斷結果是否正確。那麼咱們須要可以有選擇性的來執行命令,好比上一條命令執行成功才繼續下一條,或者不成功又該作出其它什麼處理,好比咱們使用which
來查找是否安裝某個命令,若是找到就執行該命令,不然什麼也不作(雖然這個操做沒有什麼實際意義,但可幫你更好的理解一些概念):
$ which cowsay>/dev/null && cowsay -f head-in ohch~
你若是沒有安裝cowsay
,你能夠先執行一次上述命令,你會發現什麼也沒發生,你再安裝好以後你再執行一次上述命令,你也會發現一些驚喜。
上面的&&
就是用來實現選擇性執行的,它表示若是前面的命令執行結果(不是表示終端輸出的內容,而是表示命令執行狀態的結果)返回0則執行後面的,不然不執行,你能夠從$?
環境變量獲取上一次命令的返回結果:
一般狀況下,咱們每次只能在終端輸入一條命令,按下回車執行,執行完成後,咱們再輸入第二條命令,而後再按回車執行…… 你可能會遇到以下使用場景:我須要使用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 # 讓它本身運行
關於上面的操做,不知你有沒有思考過一個問題,若是咱們在讓它自動順序執行命令時,前面的命令執行不成功,然後面的命令又依賴與上一條命令的結果,那麼就會形成花了時間,最終卻獲得一個錯誤的結果,並且有時候直觀的看你還沒法判斷結果是否正確。那麼咱們須要可以有選擇性的來執行命令,好比上一條命令執行成功才繼續下一條,或者不成功又該作出其它什麼處理,好比咱們使用which
來查找是否安裝某個命令,若是找到就執行該命令,不然什麼也不作(雖然這個操做沒有什麼實際意義,但可幫你更好的理解一些概念):
$ which cowsay>/dev/null && cowsay -f head-in ohch~
你若是沒有安裝cowsay
,你能夠先執行一次上述命令,你會發現什麼也沒發生,你再安裝好以後你再執行一次上述命令,你也會發現一些驚喜。
上面的&&
就是用來實現選擇性執行的,它表示若是前面的命令執行結果(不是表示終端輸出的內容,而是表示命令執行狀態的結果)返回0則執行後面的,不然不執行,你能夠從$?
環境變量獲取上一次命令的返回結果:
一般狀況下,咱們每次只能在終端輸入一條命令,按下回車執行,執行完成後,咱們再輸入第二條命令,而後再按回車執行…… 你可能會遇到以下使用場景:我須要使用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 # 讓它本身運行
關於上面的操做,不知你有沒有思考過一個問題,若是咱們在讓它自動順序執行命令時,前面的命令執行不成功,然後面的命令又依賴與上一條命令的結果,那麼就會形成花了時間,最終卻獲得一個錯誤的結果,並且有時候直觀的看你還沒法判斷結果是否正確。那麼咱們須要可以有選擇性的來執行命令,好比上一條命令執行成功才繼續下一條,或者不成功又該作出其它什麼處理,好比咱們使用which
來查找是否安裝某個命令,若是找到就執行該命令,不然什麼也不作(雖然這個操做沒有什麼實際意義,但可幫你更好的理解一些概念):
$ which cowsay>/dev/null && cowsay -f head-in ohch~
你若是沒有安裝cowsay
,你能夠先執行一次上述命令,你會發現什麼也沒發生,你再安裝好以後你再執行一次上述命令,你也會發現一些驚喜。
上面的&&
就是用來實現選擇性執行的,它表示若是前面的命令執行結果(不是表示終端輸出的內容,而是表示命令執行狀態的結果)返回0則執行後面的,不然不執行,你能夠從$?
環境變量獲取上一次命令的返回結果:
打印/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
grep
命令是很強大的,也是至關經常使用的一個命令,它結合正則表達式能夠實現很複雜卻很高效的匹配和查找,不過在學習正則表達式以前,這裏介紹它簡單的使用,而關於正則表達式後面將會有單獨一小節介紹到時會再繼續學習grep
命令和其餘一些命令。
grep
命令的通常形式爲:
grep [命令選項]... 用於匹配的表達式 [文件]...
仍是先體驗一下,咱們搜索/home/shiyanlou
目錄下全部包含"shiyanlou"的全部文本文件,並顯示出如今文本中的行號:
$ grep -rnI "shiyanlou" ~
-r
參數表示遞歸搜索子目錄中的文件,-n
表示打印匹配項行號,-I
表示忽略二進制文件。這個操做實際沒有多大意義,但能夠感覺到grep
命令的強大與實用。
固然也能夠在匹配字段中使用正則表達式,下面簡單的演示:
# 查看環境變量中以"yanlou"結尾的字符串 $ export | grep ".*yanlou$"
其中$
就表示一行的末尾。
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個字節的,具體數目是由字符編碼決定的
再來結合管道來操做一下,下面統計 /etc 下面全部目錄數:
$ ls -dl /etc/*/ | wc -l

這個命令前面咱們也是用過屢次,功能很簡單就是將輸入按照必定方式排序,而後再輸出,它支持的排序有按字典排序,數字排序,按月份排序,隨機排序,反轉排序,指定特定字段進行排序等等。
默認爲字典排序:
$ 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

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
文本處理命令還有不少,下一節將繼續介紹一些經常使用的文本處理的命令。
使用之前介紹過的方法,安裝aview
和imagemagick
,而後用asciiview
命令顯示圖片,使用方法能夠用 man 命令查看。

(九)簡單的文本處理
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]',固然反過來將大寫變小寫也是能夠的
更多 tr 的使用,你可使用--help
或者man tr
得到。
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

學過數據庫的用戶對這個應該不會陌生,這個命令就是用於將兩個文件中包含相同內容的那一行合併在一塊兒。
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

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

上面這些命令不是全部你都會常常用到,不過它們確是很實用的,熟練掌握以後,能夠減輕不少工做量,好比不停的用鼠標操做在 gedit 裏面複製粘貼賦值粘貼,將兩個文件的內容合併爲一個文件,這本來只須要一個命令就能完成。
一、在《文件打包與解壓縮》一節實驗中提到 Windows/dos 與 Linux/UNIX 文本文件一些特殊字符不一致,如斷行符 Windows 爲 CR+LF(\r\n
),Linux/UNIX 爲 LF(\n
)。使用cat -A 文本
能夠看到文本中包含的不可見特殊字符。Linux 的\n
表現出來就是一個$
,而 Windows/dos 的表現爲^M$
,能夠直接使用dos2unix
和unix2dos
工具在兩種格式之間進行轉換,使用file
命令能夠查看文件的具體類型。不過如今但願你在不使用上述兩個轉換工具的狀況下,使用前面學過的命令手動完成 dos 文本格式到 UNIX 文本格式的轉換。
二、還記得小時候在小霸王上面玩的小蜜蜂遊戲麼?它的正統名字應該是Space Invaders:太空侵略者。
使用下面這個命令能夠安裝,之因此叫 ninvaders 是由於這款遊戲是基於 ncurses 命令行圖形庫作的:
sudo apt-get install ninvaders


(十)數據流重定向
1、數據流重定向
1.簡單的重定向
在更多瞭解 Linux 的重定向以前,咱們須要先知道一些基本的東西,前面咱們已經提到過 Linux 默認提供了三個特殊設備,用於終端的顯示和輸出,分別爲stdin(標準輸入,對應於你在終端的輸入),stdout(標準輸出,對應於終端的輸出),stderr(標準錯誤輸出,對應於終端的輸出)。
文件描述符 |
設備文件 |
說明 |
0 |
/dev/stdin |
標準輸入 |
1 |
/dev/stdout |
標準輸出 |
2 |
/dev/stderr |
標準錯誤 |
文件描述符:文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核爲每個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者建立一個新文件時,內核向進程返回一個文件描述符。在程序設計中,一些涉及底層的程序編寫每每會圍繞着文件描述符展開。可是文件描述符這一律念每每只適用於 UNIX、Linux 這樣的操做系統。
2.標準錯誤重定向
3.使用tee命令同時重定向到多個文件
4.永久重定向
5.建立輸出文件描述符
6.關閉文件描述符
7.徹底屏蔽命令的輸出
8.使用 xargs 分割參數列表
xargs 是一條 UNIX 和類 UNIX 操做系統的經常使用命令。它的做用是將參數列表轉換成小塊分段傳遞給其餘命令,以免參數列表過長的問題。
這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 find,locate 和 grep 的結果,詳細用法請參看 man 文檔。
$ cut -d: -f1 < /etc/passwd | sort | xargs echo
上面這個命令用於將/etc/passwd
文件按:
分割取第一個字段排序後,使用echo
命令生成一個列表。
做業:
(十一)正則表達式基礎
1、正則表達式
正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫爲 regex、regexp 或 RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。
許多程序設計語言都支持利用正則表達式進行字符串操做。例如,在 Perl 中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由 UNIX 中的工具軟件(例如sed和grep)普及開的。正則表達式一般縮寫成「regex」,單數有 regexp、regex,複數有 regexps、regexes、regexen。
1. 舉例
2.基本語法:
一個正則表達式一般被稱爲一個模式(pattern),爲用來描述或者匹配一系列符合某個句法規則的字符串。
選擇
|豎直分隔符表示選擇,例如"boy|girl"能夠匹配"boy"或者"girl"
數量限定
數量限定除了咱們舉例用的*,還有+加號,?問號,.點號,若是在一個模式中不加數量限定符則表示出現一次且僅出現一次:
範圍和優先級
()圓括號能夠用來定義模式字符串的範圍和優先級,這能夠簡單的理解爲是否將括號內的模式串做爲一個總體。例如,"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 正則表達式庫和一些經典的正則表達式庫。
2、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 |
將輸出中的匹配項設置爲自動顏色顯示 |
2.使用正則表達式
3、sed 流編輯器
4、awk文本處理語言
做業:
(十二)Linux 下軟件安裝
1、Linux 上的軟件安裝
一般 Linux 上的軟件安裝主要有三種方式:
這幾種安裝方式各有優劣,而大多數軟件包會採用多種方式發佈軟件,因此咱們經常須要所有掌握這幾種軟件安裝方式,以便適應各類環境。下面將介紹前三種安裝方式,從源碼編譯安裝你將在 Linux 程序設計中學習到。
2、在線安裝
試想一下,平時咱們在使用 Windows 的時候,想要安裝一個軟件,咱們須要在網上去下載對應軟件的安裝包,接着安裝的時候就是不斷的去點擊下一步,這些流程想必你們已經經歷的無數回了,可是在 Linux 下,一個命令加回車,等待一下,軟件就安裝好了,這就是方便的在線安裝軟件的方式。
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.安裝軟件包
5.軟件升級
6.卸載軟件
若是你如今以爲 w3m 這個軟件不合本身的胃口一樣是一個命令加回車 sudo apt-get remove w3m ,系統會有一個確認的操做
7.軟件搜索
做業: