20135202閆佳歆——信息安全系統設計基礎第二週學習總結

第二週(9.14-9.20):前端

 

學習計時:共25小時node

讀書:10python

代碼:7linux

做業:2git

博客:6正則表達式

1、學習目標shell

瞭解如下知識:數據庫

1)        Linux 系統簡介編程

2)          基本概念及操做ubuntu

3)          用戶及文件權限管理

4)          Linux 目錄結構及文件基本操做

5)          環境變量與文件查找

6)          文件打包與解壓縮

7)          文件系統操做與磁盤管理

8)          命令執行順序控制與管道

9)          簡單的文本處理

10)    數據流重定向

11)    正則表達式基礎

12)    Linux下軟件安裝

2、學習資源

1. 課程資料:https://www.shiyanlou.com/courses/413   實驗一

2. Linux 基礎入門:https://www.shiyanlou.com/courses/1(重點,第一次課考覈內容所有從這裏面出)

3.  Linux命令:en   cn

3、學習方法

1.  進度很重要:必須跟上每週的進度,閱讀,練習,問答,項目。我會認真對待每一位同窗,請你不要由於困難半途而廢。

2. 問答很重要:遇到知識難點請多多提問,這是你的權利更是您對本身負責的義務。問答到博客園討論小組:http://group.cnblogs.com/103791/

3. 實踐很重要:解決書中習題,實踐書中實例,完成每週項目,纔算真的消化了這本好書。經過實驗樓環境或本身安裝的虛擬機在實踐中進行學習

4. 實驗報告很重要:詳細記錄你完成項目任務的思路,得到老師點評和幫助本身複習。學習完成後在博客園中(http://www.cnblogs.com/)把學習過程經過博客發表,博客標題「信息安全系統設計基礎第一週學習總結」

4、學習任務

(提示:請將要求學生完成的任務、測驗或思考題列在此處)

1. 重點學習 cheat/find/locate/grep/man/whereis/which/apt-get

   查找幫助文檔、各類示例多多練習,這幾個命令會貫穿咱們整個學習的學習,掌握這幾個命令就能夠很好學習其餘命令了。

2. 這學期須要掌握的命令有ac,apt-get,bzip2,cat,chgrp,chmod,chown,clear,compress,cp,dd,df,diff,du,dump,evn,find,finger,free,grep,gzip,head,kill,less,ln,locate,l,gout,ls,man,mkdir,more,mount,mt,mv,netstat,nslookup,od,passwd,patch,ps,pstop,pwd,rm,shell,sort,ssh,stty,tail,tar,telnet,touch,tree,uname,unzip,vi,vim,whereis,which,who,write等

3. 測試示例:

      
  • 請在虛擬機中安裝DDD軟件(其餘軟件)
  •   
  • 請演示怎麼判斷DDD軟件能不能安裝
  •   
  • 請查找系統中50M以上的文件
  •   
  • 請查找系統中兩天前修改過的且小於5M的文件
  •   
  • 請問如何查找操做系統的信息
  •   
  • 請查找當前目錄下全部*.c文件中哪一個文件中包含main函數
  •   
  • 請創建一個目錄,裏面創建兩個子文目錄,如何一條命令刪除三個目錄?
  •   
  • 如何把一個目錄及子目錄拷貝到本身的主目錄中
  •   
  • ...

 

、後續學習預告(可選):

Linux下C語言編程基礎:

VIM進行編輯

GCC進行編譯

GDB進行調試

Make進行自動化

、學習過程

第一節 Linux系統簡介

在這一節中我瞭解了Linux系統的起源和發展,大事記,Unix進化史,和Linux的重要人物,好比Ken Thompson——是C 語言之父和 UNIX 之父;Dennis Ritchie——C 語言之父和 UNIX 之父;Stallman——著名黑客,GNU 創始人,開發了 Emacs、gcc、bash shell;Bill Joy——BSD 開發者;Tanenbaum——Minix 開發者Linus Torvalds——Linux 之父。

我還了解到了Linux和Windows系統的不一樣之處,在費用、軟件支持、安全等方面有了更多的瞭解。而且知道了學習Linux的正確方式方法和態度。

 

第二節 基本概念及操做

本節實驗主要有:

一、實驗樓環境介紹 二、經常使用 Shell 命令及快捷鍵 三、Linux 使用小技巧

1、Linux 桌面環境介紹

相對於如今的 Windows 系統,UNIX/Linux 自己是沒有圖形界面的,咱們一般在 Unix/Linux 發行版上看到的圖形界面實際都只是運行在 Linux 系統之上的一套軟件。

X.org至關於一個服務器,實現了客戶端功能的桌面環境KDE,GNOME,XFCE,LXDE,實驗樓用的是XFCE。

l  終端

常見終端模擬器:gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm,目前咱們的實驗中的終端程序是 xfce 桌面環境自帶的 xfce-terminal。

終端本質上是對應着 Linux 上的   /dev/tty 設備,Linux 的多用戶登錄就是經過不一樣的 /dev/tty 設備完成的,Linux 默認提供了 6 個純命令行界面的 「terminal」(準確的說這裏應該是 6 個   virtual consoles)來讓用戶登陸,在物理機系統上你能夠經過使用[Ctrl]+[Alt]+[F1][F6]進行切換,不過在咱們的在線實驗環境中可能沒法切換,由於特殊功能按鍵會被你主機系統劫持。當你切換到其中一個終端後想要切換回圖形界面,你能夠按下[Ctrl]+[Alt]+[F7]來完成。【引用自實驗樓課程內容】

l  Shell

一般在圖形界面中對實際體驗帶來差別的不是上述的不一樣發行版的各類終端模擬器,而大都是這個 Shell(殼),有殼就有核,這裏的核就是指的 UNIX/Linux 內核,Shell 是指「提供給使用者使用界面」的軟件(命令解析器),相似於   DOS 下的   command(命令行)和後來的 cmd.exe。普通意義上的 Shell 就是能夠接受用戶輸入命令的程序。它之因此被稱做 Shell 是由於它隱藏了操做系統底層的細節。一樣的 Unix/Linux 下的圖形用戶界面 GNOME 和 KDE,有時也被叫作「虛擬 shell」或「圖形 shell」。

在 UNIX/Linux 中比較流行的常見的   Shell 有   bash,zsh,ksh,csh 等等,Ubuntu 終端默認使用的是   bash,默認的桌面環境是 GNOME 或者 Unity(基於 GNOME),但咱們的環境中使用的分別是zsh 和 xfce。【引用自教程】

l  命令行操做體驗

1)          重要快捷鍵:

[tab]補全命令,補全目錄,補全命令參數等等

[Ctrl+c]強行終止當前程序,不退出終端

[Ctrl+d]  鍵盤輸入結束或退出終端

[Ctrl+s]  暫定當前程序,暫停後按下任意鍵恢復運行

[Ctrl+z]  將當前程序放到後臺運行,恢復到前臺爲命令fg

[Ctrl+a]  將光標移至輸入行頭,至關於Home鍵

[Ctrl+e]  將光標移至輸入行末,至關於End鍵

[Ctrl+k]  刪除從光標所在位置到行末

[Alt+Backspace]  向前刪除一個單詞

[Shift+PgUp] 將終端顯示向上滾動

[Shift+PgDn] 將終端顯示向下滾動

2)          歷史輸入命令

↑能夠恢復你輸入過的指令

3)          通配符

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

                                                                     

這張圖就是用星號模糊了文件名的搜索方法。

    

在linux中建立多個相似文件的方法:touch stony_{1..10}_linux.txt

 

Shell 經常使用通配符:

                                                                                
   

字符

   
   

含義

   
   

*

   
   

匹配 0 或多個字符

   
   

?

   
   

匹配任意一個字符

   
   

[list]

   
   

匹配 list 中的任意單一字符

   
   

[!list]

   
   

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

   
   

[c1-c2]

   
   

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

   
   

{string1,string2,...}

   
   

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

   
   

{c2..c2}

   
   

匹配 c1-c2 中所有字符 如{1..10}

   

 

4)          在命令行中獲取幫助

須要使用man指令。

輸入man ls後:

    

Man中分了八個區段,要查看相應區段的內容,就在 man 後面加上相應區段的數字便可,如 man 3 ls 。

 

一般 man 手冊中的內容不少,你可能不太容易找到你想要的結果,不過幸運的是你能夠在 man 中使用搜索,/<你要搜索的關鍵字>,查找到後你可使用n鍵切換到下一個關鍵字所在處,shift+n爲上一個關鍵字所在處。使用Space(空格鍵)翻頁,Enter(回車鍵)向下滾動一行,或者使用j,k(vim編輯器的移動鍵)進行向前向後滾動一行。按下h鍵爲顯示使用幫助(由於man使用less做爲閱讀器,實爲less工具的幫助),按下q退出。

想要得到更詳細的幫助,你還可使用info命令,不過一般使用man就足夠了。若是你知道某個命令的做用,只是想快速查看一些它的某個具體參數的做用,那麼你可使用--help參數,大部分命令都會帶有這個參數【引用實驗樓教程】,如:

    

 

第三節 用戶及文件權限管理

實驗介紹

一、Linux 中建立、刪除用戶,及用戶組等操做。

二、Linux 中的文件權限設置。

 

1、Linux 用戶管理

1.查看用戶

    

輸入的第一列表示打開當前僞終端的用戶的用戶名(要查看當前登陸用戶的用戶名,去掉空格直接使用 whoami 便可)      ,第二列的 pts/0 中 pts 表示僞終端,所謂僞是相對於 /dev/tty 設備而言的,還記得上一節講終端時的那七個使用 [Ctrl]+[Alt]+[F1]~[F7] 進行切換的 /dev/tty 設備麼,這是「真終端」,僞終端就是當你在圖形用戶界面使用 /dev/tty7 時每打開一個終端就會產生一個僞終端, pts/0 後面那個數字就表示打開的僞終端序號,你能夠嘗試再打開一個終端,而後在裏面輸入 who am i ,看第二列是否是就變成 pts/1 了,第三列則表示當前僞終端的啓動時間。

who 命令其它經常使用參數

                                                                      
   

參數

   
   

說明

   
   

-a

   
   

打印能打印的所有

   
   

-d

   
   

打印死掉的進程

   
   

-m

   
   

同am i,mom likes

   
   

-q

   
   

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

   
   

-u

   
   

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

   
   

-r

   
   

打印運行等級

   

2.建立用戶

在 Linux 系統裏, root 帳戶擁有整個系統至高無上的權利,好比 新建/添加 用戶。

建立用戶須要 root 權限,須要用到 sudo 這個命令。

使用sudo命令的兩個前提

  1.   知道當前登陸用戶的密碼
  2.   當前用戶必須在 sudo 用戶組

    

切換登陸用戶:

    

 

3.用戶組

如何在Linux裏面查看本身屬於哪一個用戶組?

(1)      使用groups命令

    

每次新建用戶若是不指定用戶組的話,默認會自動建立一個與用戶名相同的用戶組;默認狀況下在sudo用戶組裏的可使用sudo命令得到root權限。

(2)      查看/etc/group文件

    

這裏 cat 命令用於讀取指定文件的內容並打印到終端輸出

 | sort 表示將讀取的文本進行一個字典排序再輸出

使用命令過濾:

    

etc/group 文件格式說明

/etc/group 的內容包括用戶組(Group)、用戶組口令、GID 及該用戶組所包含的用戶(User),每一個用戶組一條記錄。格式以下:

group_name:password:GID:user_list

你看到上面的 password 字段爲一個 'x' 並非說密碼就是它,只是表示密碼不可見而已。

將其它用戶加入 sudo 用戶組

默認狀況下新建立的用戶是不具備 root 權限的,也不在 sudo 用戶組,可讓其加入sudo用戶組從而獲取 root 權限。

    

代表用戶steve不在sudo用戶組中。使用 usermod 命令能夠爲用戶添加用戶組,一樣使用該命令你必需有 root 權限,你能夠①直接使用 root 用戶爲其它用戶添加用戶組,或者②用其它已經在 sudo 用戶組的用戶使用 sudo 命令獲取權限來執行該命令。

    

 

4.刪除用戶

    

 

2、Linux 文件權限

 

1.查看文件權限

ls 命令(不帶參數):列出並顯示當前目錄下的文件

帶參數?查看文件權限——

ls –l:使用較長格式列出文件

    

其中各項含義:【圖片來自實驗樓】     

    

 

文件類型

Linux 裏面一切皆文件,正由於這一點纔有了設備文件( /dev 目錄下有各類設備文件,大都跟具體的硬件設備相關)這一說,還有 socket(網絡套接字),和 pipe (管道)。

連接文件是分爲兩種的,軟鏈接和硬鏈接,硬連接不經常使用,而軟連接等同於 Windows 上的快捷方式。

文件權限

讀權限,表示你可使用 cat <file name> 之類的命令來讀取某個文件的內容;寫權限,表示你能夠編輯和修改某個文件; 執行權限,一般指能夠運行的二進制程序文件或者腳本文件,如同 Windows 上的 'exe' 後綴的文件,不過 Linux 上不是經過文件後綴名來區分文件的類型。你須要注意的一點是,一個目錄要同時具備讀權限和執行權限才能夠打開,而一個目錄要有寫權限才容許在其中建立其它文件,這是由於目錄文件實際保存着該目錄裏面的文件的列表等信息;全部者權限,是指你所在的用戶組中的全部其它用戶對於該文件的權限。

連接數

連接到該文件所在的 inode 結點的文件名數目

文件大小

以 inode 結點大小爲單位來表示的文件大小,你能夠給 ls 加上 -lh 參數來更直觀的查看文件的大小。

 

關於 ls 命令的一些其它經常使用的用法:

l    ls -A

顯示除了 '.'(當前目錄),'..' 上一級目錄以外的全部包含隱藏文件(Linux 下以 '.' 開頭的文件爲隱藏文件)

    

l    ls –Al

同時使用 '-A' 和 '-l' 參數:

    

l    ls -dl <目錄名>

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

    

l    ls -AsSh

顯示全部文件大小,並以普通人類能看懂的方式呈現:

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

    


 
2.變動文件全部者

先在用戶steve下創建一個文件tony

    

而後切換到shiyanlou用戶:

    

執行指令,將tony文件全部者變動爲shiyanlou。而後用ll指令查看。

 

 3.修改文件權限

(1)二進制數字表示

    

每一個文件的三組權限,分別爲:擁有者,所屬用戶組,其餘用戶,這就對應這一個 "rwx",也就是一個 '7' ,因此若是我要將文件「iphone6」的權限改成只有我本身能夠用那麼就這樣:

      

??dquote是什麼?

我用Ctrl + C   退出了它

 

(2)加減賦值操做

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

 
  

 

第四節Linux 目錄結構及文件基本操做

一、Linux 的文件組織目錄結構。

二、相對路徑和絕對路徑。

三、對文件的移動、複製、重命名、編輯等操做。

 

1、Linux 目錄結構

Linux 是以樹形目錄結構的形式來構建整個系統的,能夠理解爲一個用戶可操做系統的骨架。從邏輯上來講 Linux 的磁盤是「掛在」(掛載在)目錄上的,每個目錄不只能使用本地磁盤分區的文件系統,也可使用網絡上的文件系統。

1.FHS 標準

FHS(英文:Filesystem Hierarchy Standard 中文:文件系統層次結構標準),定義了系統中每一個區域的用途、所須要的最小構成的文件和目錄同時還給出了例外處理與矛盾處理。

FHS 定義了兩層規範:

第一層, / 下面的各個目錄應該要放什麼文件數據,例如 /etc 應該要放置設置文件,/bin 與 /sbin 則應該要放置可執行文件等等。

第二層,針對 /usr 及 /var 這兩個目錄的子目錄來定義。例如 /var/log 放置系統登陸文件、/usr/share 放置共享數據等等。

輸入tree / 後,運行出一大堆……

    

截一部分圖示意。

FHS 依據文件系統使用的頻繁與否以及是否容許用戶隨意改動,將目錄定義爲四種交互做用的形態,以下表所示:

    

2.目錄路徑

(1)路徑

使用 cd 命令能夠切換目錄,在 Linux 裏面使用 . 表示當前目錄,.. 表示上一級目錄(以. 開頭的文件都是隱藏文件,因此這兩個目錄必然也是隱藏的,你可使用 ls -a 命令查看隱藏文件), - 表示上一次所在目錄,~一般表示當前用戶的"home"目錄。使用 pwd 命令能夠獲取當前所在路徑(絕對路徑)。

$ cd ..

——進入上一級目錄:

$ cd ~  或者 cd /home/<你的用戶名>

——進入你的「home」目錄:

$ pwd

——使用 pwd 獲取當前路徑:

    

 

l    絕對路徑

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

l    相對路徑

相對路徑,也就是相對於你當前的目錄的路徑,相對路徑是以當前目錄 . 爲起點,以你所要到的目錄爲終點,表現形式如:usr/local/bin (這裏假設你當前目錄爲根目錄)。

表示相對路徑實際沒有加上表示當前目錄的那個 . ,而是直接以目錄名開頭,由於這個 usr 目錄爲 / 目錄下的子目錄,是能夠省略這個 . ;若是是當前目錄的上一級目錄,則須要使用 ..

好比你當前目錄爲「home」目錄,根目錄就應該表示爲 ../../ ,表示上一級目錄("home"目錄)的上一級目錄("/"目錄)。

下面咱們以你的"home"目錄爲起點,分別以絕對路徑和相對路徑的方式進入 /usr/local/bin 目錄:

# 絕對路徑

$ cd /usr/local/bin

    

# 相對路徑

$ cd ../../usr/local/bin

    

 

提示:在進行目錄切換的過程當中請多使用 Tab 鍵自動補全,可避免輸入錯誤,連續按兩次Tab能夠顯示所有候選結果

 

2、Linux 文件的基本操做

1.新建

新建空白文件

使用 touch 命令建立空白文件。

A. touch命令主要用來更改已有文件的時間戳,好比最近訪問時間,最近修改時間

B. 但touch命令其在不加任何參數的狀況下,只指定一個文件名,則能夠建立一個爲指定文件名的空白文件,而且不會覆蓋已有同名文件,也能夠同時指定該文件的時間戳。

 

l  建立名爲 test 的空白文件:

    

l  新建目錄

(1).使用 mkdir(make directories)命令能夠建立一個空目錄,也可同時指定建立目錄的權限屬性

建立名爲"mydir"的空目錄:

    

 

(2).使用 -p 參數,同時建立父目錄(若是不存在該父目錄):

    

後面的目錄路徑,以絕對路徑的方式表示也是能夠的。

 

2.複製

l  複製文件

使用cp(copy)命令複製一個文件或目錄到指定目錄。將以前建立的"test"文件複製到"/home/shiyanlou/father/son/grandson"目錄中:

    

l  複製目錄

若是直接使用cp命令,複製一個目錄的話,會出現以下錯誤:

    

要成功複製目錄須要加上-r或者-R參數,表示遞歸複製,就是說有點「株連九族」的意思:

    

 

3.刪除

l  刪除文件

使用rm(remove files or directories)命令,刪除一個文件或目錄:

$ rm test

     有時候你會遇到想要刪除一些爲只讀權限的文件,直接使用rm刪除會顯示一個提示,你若是想忽略這提示,直接刪除文件,可使用-f參數強制刪除:

$ rm -f test

    

 

l  刪除目錄

跟複製目錄同樣,要刪除一個目錄,也須要加上-r或-R參數:

$ rm -r family

    

 

4.移動文件與文件重命名

l  移動文件

使用mv(move or   rename files)命令,移動文件(剪切)。將文件"file1"移動到"Documents"目錄mv 源目錄文件 目的目錄:

$ mv file1 Documents

    

l  重命名文件

將文件"file1"重命名爲"myfile" mv 舊的文件名 新的文件名:

$ mv file1 myfile

    

l  批量重命名

# 使用通配符批量建立 5 個文件

$ touch file{1..5}.txt

# 批量將這 5 個後綴爲 .txt 的文本文件重命名爲以 .c 爲後綴的文件

$ rename 's/\.txt/\.c/' *.txt

    

# 批量將這 5 個文件,文件名改成大寫

$ rename 'y/a-z/A-Z/' *.c

    

rename是先使用第二個參數的通配符匹配全部後綴爲.txt的文件,而後使用第一個參數提供的正則表達式將匹配的這些文件的.txt後綴替換爲.c

 

5.查看文件

使用cat,tac和nl命令查看文件

這兩個命令都是用來打印文件內容到標準輸出(終端),其中cat爲正序顯示,tac倒序顯示

標準輸入輸出:當咱們執行一個 shell 命令行時一般會自動打開三個標準文件,即標準輸入文件(stdin),默認對應終端的鍵盤;標準輸出文件(stdout)和標準錯誤輸出文件(stderr),這兩個文件都對應被重定向到終端的屏幕,以便咱們能直接看到輸出內容。進程將從標準輸入文件中獲得輸入數據,將正常輸出數據輸出到標準輸出文件,而將錯誤信息送到標準錯誤文件中。

好比咱們要查看以前從"/etc"目錄下拷貝來的passwd文件:

$ cat passwd

    

能夠加上-n參數顯示行號:

$ cat -n passwd

    

 

nl命令——添加行號並打印,這是個比cat -n更專業的行號打印命令。

這裏簡單列舉它的經常使用的幾個參數:

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

    -b a:表示不管是否爲空行,一樣列出行號("cat -n"就是這種方式)

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

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

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

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

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

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

 

使用moreless命令分頁查看文件

more命令比較簡單,只能向一個方向滾動

less爲基於"more"和"vi"開發,功能更強大。

less 的使用基本和 more 一致,具體使用請查看 man 手冊。

使用more工具打開passwd文件:

$ more passwd

      

    

打開後默認只顯示一屏內容,終端底部顯示當前閱讀的進度(百分比)。可使用Enter鍵向下滾動一行,使用Space鍵向下滾動一屏,按下h顯示幫助,q退出。

使用head和tail命令查看文件

這兩個命令那些性子比較急的人應該會比較喜歡,由於它們一個是隻查看的頭幾行(默認爲10行,不足10行則顯示所有)和尾幾行。仍是拿 passwd 文件舉例,好比當咱們想要查看最近新增長的用戶,那麼咱們能夠查看這個/etc/passwd文件,不過咱們前面也看到了,這個文件裏面一大堆亂糟糟的東西,看起來實在費神啊。這裏想到系統新增長一個用戶,應該會將用戶的信息添加到passwd文件的最後,那麼這時候咱們就可使用tail命令了:

$ tail /etc/passwd

    

甚至更直接的只看一行, 加上-n參數,後面緊跟行數:

$ tail -n 1 /etc/passwd

      

 

tail -f,能夠實現不停地讀取某個文件的內容並顯示,這可以讓咱們動態查看日誌起到實時監視的做用。

 

6.查看文件類型

前面我提到過,在 Linux 下面文件的類型不是根據文件後綴來判斷的,咱們一般使用file命令能夠查看文件的類型:

$ file /bin/ls

    

這表示這是一個可執行文件,運行在 64 位平臺,並使用了動態連接文件(共享庫)。

 

7.編輯文件

$ vimtutor

    

 

 

第五節 環境變量與文件查找

A.環境變量的做用與用法

B.幾種搜索文件的方法

 

1、環境變量

1.變量

Shell 變量是計算機中用於記錄一個值,字符或字符串的符號

一般變量與值是一對一的關係,能夠經過表達式讀取它的值賦值給其它變量,也能夠直接指定數值賦值給任意變量。

變量的做用域即變量的有效範圍

 

l  在 Shell 中建立一個變量:

——使用declare命令建立一個變量名爲 tmp 的變量:

$ declare tmp

其實也能夠不用 declare 預聲明一個變量,直接即用即建立

declare在建立其它指定類型的變量(如數組)時會用到。

l  給變量賦值:

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

$ tmp=shiyanlou

l  讀取變量的值,

——使用echo命令和$符號($符號用於表示引用一個變量的值):

$ echo $tmp

      

※變量名只能是英文字母,數字或者下劃線,且不能以數字做爲開頭。

 

2.環境變量

環境變量就是做用域比自定義變量要大,(Shell 的環境變量做用於自身和它的子進程)

一般咱們會涉及到的環境變量有三種

•     當前 Shell 進程私有用戶自定義變量,如上面咱們建立的 temp 變量,只在當前 Shell 中有效。                                                     

•     Shell 自己內建的變量。                                            

•     從自定義變量導出的環境變量。                                      

也有三個與上述三種環境變量相關的命令,setenvexport

  1.   set    顯示當前 Shell 全部環境變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量
  2.   env   顯示與當前用戶相關的環境變量,還可讓命令在指定環境中運行
  3.   export   顯示從 Shell 中導出成環境變量的變量,也能經過它將自定義變量導出爲環境變量

 

使用vimdiff工具比較一下它們之間的差異:

$ temp=shiyanlou

$ export temp_env=shiyanlou

$ env|sort>env.txt

$ export|sort>export.txt

$ set|sort>set.txt

    

上述操做將命令輸出經過管道|使用sort命令排序,再重定向到對象文本文件中

$ vimdiff env.txt export.txt set.txt

使用vimdiff工具比較導出的幾個文件的內容。

    

環境變量,能夠簡單的理解成在當前進程的子進程是否有效,有效則爲環境變量,不然不是。

咱們這裏用export命令來體會一下,先在 Shell 中設置一個變量temp=shiyanlou,而後再新建立一個子 Shell 查看temp變量的值:

    

      

 

※爲了與普通變量區分,一般咱們習慣將環境變量名設爲大寫

 

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

Shell經過環境變量PATH來進行搜索查找命令,PATH裏面保存了Shell中執行的命令的搜索路徑。

查看PATH環境變量的內容:

$ echo $PATH

    

一般這一類目錄下放的都是可執行文件,當咱們在 Shell 中執行一個命令時,系統就會按照 PATH 中設定的路徑按照順序依次到目錄中去查找,若是存在同名的命令,則執行先找到的那個

 

l  建立一個最簡單的可執行 Shell 腳本和一個使用 C 語言建立的"hello world"程序

1)          建立一個 Shell 腳本文件:

$ vim hello_shell.sh

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

#!/bin/zsh

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

    echo "hello shell"

done

exit 0

???怎麼退出bash啊!!!

3)          爲文件添加可執行權限:

$ chmod 755 hello_shell.sh

4)          執行腳本

$ ./hello_shell.sh

5)          建立一個 C 語言"hello world"程序:

$ vim hello_world.c

#include <stdio.h>

int main(void)

{

    printf("hello   world!\n");

    return 0;

}

6)          使用 gcc 生成可執行文件:

$ gcc -o hello_world hello_world.c

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

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

$ mkdir mybin

$ mv hello_shell.sh hello_world mybin/

8)          如今在mybin目錄中分別運行你剛剛建立的兩個程序:

$ cd mybin

$ ./hello_shell.sh

$ ./hello_world

 

回到上一級目錄,也就是shiyanlou家目錄,當再想運行那兩個程序時,會發現提示命令找不到,除非加上命令的完整路徑,但那樣很不方便,如何作到想使用系統命令同樣執行本身建立的腳本文件或者程序呢?那就要將命令所在路徑添加到PATH環境變量了。

 

4.添加自定義路徑到「PATH」環境變量

在前面咱們應該注意到PATH裏面的路徑是以:做爲分割符,因此咱們能夠這樣添加自定義路徑:

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

注意這裏必定要使用絕對路徑

 

有沒有方法讓添加的環境變量全局有效?或者每次啓動 Shell 時自動執行上面添加自定義路徑到 PATH 的命令?——讓它自動執行

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

咱們能夠簡單的使用下面命令直接添加內容到.zshrc中:

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

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

 

5.修改和刪除已有變量

l  變量修改

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

${變量名#匹配字串}    從頭向後開始匹配,刪除符合匹配字串的最短數據

${變量名##匹配字串}  從頭向後開始匹配,刪除符合匹配字串的最長數據

${變量名%匹配字串}   從尾向前開始匹配,刪除符合匹配字串的最短數據

${變量名%%匹配字串}  從尾向前開始匹配,刪除符合匹配字串的最長數據

${變量名/舊的字串/新的字串} 將符合舊字串的第一個字串替換爲新的字串

${變量名//舊的字串/新的字串}    將符合舊字串的所有字串替換爲新的字串

 

好比要修改咱們前面添加到 PATH 的環境變量。爲了不操做失誤致使命令找不到,咱們先將 PATH 賦值給一個新的自定義變量 path:

$ path=$PATH

$ echo $path

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

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

$ path=${path%*/mybin}

    

 

l  變量刪除

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

$ unset temp

 

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

使用source命令來讓其當即生效:

$ source .zshrc

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

$ . ./.zshrc

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

 

2、搜索文件

與搜索相關的命令經常使用的有以下幾個whereis which find locate

whereis簡單快速

$whereis who

    

它找到了三個路徑,兩個可執行文件路徑和一個 man 在線幫助文件所在路徑。這個搜索很快,由於它並無從硬盤中依次查找,而是直接從數據庫中查詢

whereis只能搜索二進制文件(-b)man幫助文件(-m)和源代碼文件(-s)。若是想要得到更全面的搜索結果可使用locate命令。

 

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應該是這幾個命令中最強大的了,它不但能夠經過文件類型、文件名進行查找並且能夠根據文件的屬性(如文件的時間戳,文件的權限等)進行搜索。

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

$ find /etc/ -name interfaces

    

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

2)          與時間相關的命令參數:

-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 上經常使用的 壓縮/解壓 工具,介紹了 zip,rar,tar 的使用。

 

1、文件打包和解壓縮

 

Linux壓縮文件格式簡介:

*.zip  zip程序打包壓縮的文件

*.rar  rar程序壓縮的文件

*.7z   7zip程序壓縮的文件

*.tar  tar程序打包,未壓縮的文件

*.gz   gzip程序(GNU   zip)壓縮的文件

*.xz   xz程序壓縮的文件

*.bz2  bzip2程序壓縮的文件

*.tar.gz   tar打包,gzip程序壓縮的文件

*.tar.xz   tar打包,xz程序壓縮的文件

*tar.bz2   tar打包,bzip2程序壓縮的文件

*.tar.7z   tar打包,7z程序壓縮的文件

 

1.zip壓縮打包程序

 

使用zip打包文件夾:

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

$ du   -h shiyanlou.zip

$   file shiyanlou.zip

    

上面命令將 shiyanlou 的 home 目錄打包成一個文件,並查看了打包後文件的大小和類型。

-r,表示遞歸打包包含子目錄的所有內容

-q,表示爲安靜模式,即不向屏幕輸出信息

-o,表示輸出文件,需在其後緊跟打包輸出文件名

du,查看打包後文件的大小

 

l  設置壓縮級別爲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(所查看文件的深度)

 

l  建立加密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文件

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

$   unzip shiyanlou.zip

 

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

$   unzip -q shiyanlou.zip -d ziptest

    

上述指定目錄不存在,將會自動建立。

l  不解壓只想查看壓縮包的內容:-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 壓縮包。

 

l  安裝rar和unrar工具:

$   sudo apt-get update

$   sudo apt-get install rar unrar

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

$ rm   *.zip

$   rar a shiyanlou.rar .

    

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

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

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

$   rar d shiyanlou.rar .zshrc

    

l  查看不解壓文件:

$   rar l shiyanlou.rar

    

l  使用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命令一些基本的使用方式,即不進行壓縮只是進行打包(建立歸檔文件)和解包的操做。

 

l  建立一個 tar 包:

$   tar -cf shiyanlou.tar ~

    

    

上面命令中:

-c表示建立一個 tar 包文件

-f用於指定建立的文件名,注意文件名必須緊跟在-f參數以後,好比不能寫成tar -fc   shiyanlou.tar,能夠寫成tar -f shiyanlou.tar -c   ~。

-v參數以可視的的方式輸出打包的文件

上面會自動去掉表示絕對路徑的/,你也可使用-P保留絕對路徑符。

 

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

$   mkdir tardir

$   tar -xf shiyanlou.tar -C tardir

    

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

$   tar -tf shiyanlou.tar

 

l  保留文件屬性和跟隨連接(符號連接或軟連接),有時候咱們使用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、簡單文件系統操做

 

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

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

$ df

    

通常使用狀況下,咱們更多隻是關心第一行的內容也就是環境中的rootfs或者物理主機上的/dev/sda2

 

"rootfs" : (Root File   System)它是 Ramfs(Ramfs 是一個很是簡單的 Linux 文件系統用於實現磁盤緩存機制做爲動態可調整大小的基於 ram 的文件系統)或者 tmpfs 的一個特殊實例,它做爲系統啓動時內核載入內存以後,在掛載真正的的磁盤以前的一個臨時文件系統。一般的主機會在系統啓動後用磁盤上的文件系統替換,只是在一些嵌入式系統中會只存在一個 rootfs ,或者像咱們目前遇到的狀況運行在虛擬環境中共享主機資源的系統也可能會採用這種方式。

物理主機上的 /dev/sda2 是對應着主機硬盤的分區,後面的數字表示分區號,數字前面的字母 a 表示第幾塊硬盤(也多是可移動磁盤),你若是主機上有多塊硬盤則可能還會出現 /dev/sdb,/dev/sdc 這些磁盤設備都會在 /dev 目錄下以文件的存在形式。

 

$ df   -h

    

 

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

# 默認一樣以 blocks 的大小展現

$ du

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

$ du   -h

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

# 只查看1級目錄的信息

$ du   -h -d 0 ~

# 查看2級

$ du   -h -d 1 ~

    

 

2、簡單的磁盤管理

 

1.建立虛擬磁盤

 

l  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

 

 

上述命令從標準輸入設備讀入用戶輸入(缺省值,因此可省略)而後輸出到 test 文件,bs(block size)用於指定塊大小(缺省單位爲 Byte,也可爲其指定如'K','M','G'等單位),count用於指定塊數量。如上圖所示,我指定只讀取總共 10 個字節的數據,當我輸入了「hello shiyanlou」以後加上空格回車總共 16 個字節(一個英文字符佔一個字節)內容,顯然超過了設定大小。使用和du和cat命令看到的寫入完成文件實際內容確實只有 10 個字節(那個黑底百分號表示這裏沒有換行符),而其餘的多餘輸入將被截取並保留在標準輸入。

 

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

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

 

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

 

1)          從/dev/zero設備建立一個容量爲 256M 的空文件:

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

$ du   -h virtual.img

    

 

2)          而後咱們要將這個文件格式化(寫入文件系統),這裏咱們要學到一個(準確的說是一組)新的命令來完成這個需求。

 

使用 mkfs 命令格式化磁盤(咱們這裏是本身建立的虛擬磁盤鏡像)

 

在命令行輸入 mkfs 而後按下Tab鍵,能夠看到不少個以 mkfs 爲前綴的命令,這些不一樣的後綴其實就是表示着不一樣的文件系統,能夠用 mkfs 格式化成的文件系統:

    

 

咱們能夠簡單的使用下面的命令來將咱們的虛擬磁盤鏡像格式化爲ext4文件系統:

$   mkfs.ext4 virtual.img

    

能夠看到實際 mkfs.ext4 是使用 mke2fs 來完成格式化工做的。

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

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

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

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

$   sudo mount

    

輸出的結果中每一行表示一個設備或虛擬設備,每一行最前面是設備名,而後是 on 後面是掛載點,type 後面表示文件系統類型,再後面是掛載選項(好比能夠在掛載時設定以只讀方式掛載等等)。

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

 

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

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

$   sudo umount /mnt

不過遺憾的是,因爲咱們環境的問題(環境中使用的 Linux 內核在編譯時沒有添加對 Loop device的支持),因此你將沒法掛載成功:!!!!!!!!!!!傷害我感情!!!!!!

 

l  如何爲磁盤分區。

 

# 查看硬盤分區表信息

$   sudo fdisk -l

 

 

輸出結果中開頭顯示了主機上的磁盤的一些信息,包括容量扇區數,扇區大小,I/O 大小等信息。

 

咱們重點開一下中間的分區信息,/dev/sda1,/dev/sda2 爲主分區分別安裝了 Windows 和 Linux 操做系統,/dev/sda3 爲交換分區(能夠理解爲虛擬內存),/dev/sda4 爲擴展分區其中包含 /dev/sda5,/dev/sda6,/dev/sda7,/dev/sda8 四個邏輯分區,由於主機上有幾個分區之間有空隙,沒有對齊邊界扇區,因此分區之間的不是徹底連續的。

 

# 進入磁盤分區模式

$   sudo fdisk virtual.img

 

 

l  使用 losetup 命令創建鏡像與迴環設備的關聯

$   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

 

 

第八節 命令執行順序控制與管道

順序執行、選擇執行、管道、cut 命令、grep 命令、wc 命令、sort 命令等,高效率使用 Linux 的技巧。

 

1、命令執行順序的控制

1.順序執行多條命令

$   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~

若是沒有安裝cowsay,你能夠先執行一次上述命令,你會發現什麼也沒發生,你再安裝好以後你再執行一次上述命令,你也會發現一些驚喜。

 

&&用來實現選擇性執行

它表示若是前面的命令執行結果(不是表示終端輸出的內容,而是表示命令執行狀態的結果)返回0則執行後面的,不然不執行,你能夠從$?環境變量獲取上一次命令的返回結果:

    

 

shell中的||除了也可用於表示邏輯與和或以外,就是能夠實現這裏的命令執行順序的簡單控制。

||在這裏就是與&&相反的控制效果,當上一條命令執行結果爲≠0($?0)時則執行它後面的命令:

$   which cowsay>/dev/null || echo "cowsay has not been install, please   run 'sudo apt-get install cowsay' to install"

    

 

除了上述基本的使用以外,咱們還能夠結合這&&和||來實現一些操做,好比:

$   which cowsay>/dev/null && echo "exist" || echo "not   exist"

    

 

 

2、管道

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

 

管道又分爲匿名管道具名管道

匿名管道,在命令行中由|分隔符表示。

具名管道簡單的說就是有名字的管道,一般只會在源程序中用到具名管道。

 

1.試用

 

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

$ ls   -al /etc

 

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

$ ls   -al /etc | less

經過管道將前一個命令(ls)的輸出做爲下一個命令(less)的輸入,而後就能夠一行一行地看。

 

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

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

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

    

l  打印/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 [命令選項]... 用於匹配的表達式 [文件]...

l  搜索/home/shiyanlou目錄下全部包含"shiyanlou"的全部文本文件,並顯示出如今文本中的行號:

$   grep -rnI "shiyanlou" ~

    

-r 參數表示遞歸搜索子目錄中的文件

-n表示打印匹配項行號

-I表示忽略二進制文件

 

l  在匹配字段中使用正則表達式:

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

$   export | grep ".*yanlou$"

    

其中$就表示一行的末尾。

 

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

wc 命令用於統計並輸出一個文件中行、單詞和字節的數目

l  輸出/etc/passwd文件的統計信息:

$ wc   /etc/passwd

    

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

# 行數

$ 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

    

 

5.sort 排序命令

將輸入按照必定方式排序,而後再輸出,它支持的排序有按字典排序,數字排序按月份排序隨機排序反轉排序指定特定字段進行排序等等。

l  默認爲字典排序:

$   cat /etc/passswd | sort

    

l  反轉排序:

$   cat /etc/passwd | sort –r

    

l  按特定字段排序:

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

    

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

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

    

 

6. uniq 去重命令

uniq命令能夠用於過濾或者輸出重複行

 

l  過濾重複行

咱們可使用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

    

 

l  輸出重複行

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

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

    

# 輸出全部重複的行

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

    

 

 

第九節 簡單的文本處理

tr(注意不是tarcoljoinpaste

 

1、經常使用的文本處理命令

 

2、文本處理命令

 

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

    

 

第十節  數據流重定向

你可能對重定向這個概念感到些許陌生,但你應該在前面的課程中屢次見過>或>>操做了,並知道他們分別是將標準輸出導向一個文件或追加到一個文件中。這其實就是重定向,將本來輸出到標準輸出的數據重定向到一個文件中,由於標準輸出(/dev/stdout)自己也是一個文件,咱們將命令輸出導向另外一個文件天然也是沒有任何問題的。

 

1、數據流重定向

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

$   echo 'hello shiyanlou' > redirect

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

$   cat redirect

    

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

 

1.簡單的重定向

Linux 默認提供了三個特殊設備,用於終端的顯示和輸出,分別爲stdin(標準輸入,對應於你在終端的輸入),stdout(標準輸出,對應於終端的輸出),stderr(標準錯誤輸出,對應於終端的輸出)。

 

文件描述符 設備文件     說明

0           /dev/stdin       標準輸入

1           /dev/stdout    標準輸出

2           /dev/stderr     標準錯誤

 

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

另外還有一個符號-,它能夠同時做爲前一個命令的。

 

咱們能夠這樣使用這些文件描述符:

1)          默認使用終端的標準輸入做爲命令的輸入和標準輸出做爲命令的輸出

$ cat  

(按Ctrl+C退出)

 

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

$   mkdir Documents

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

#include   <stdio.h>

 

int   main()

{

    printf("hello world\n");

    return 0;

}

 

EOF

 

3)          將一個文件做爲命令的輸入,標準輸出做爲命令的輸出

$   cat Documents/test.c\~

 

4)          將echo命令經過管道傳過來的數據做爲cat命令的輸入,將標準輸出做爲命令的輸出

$   echo 'hi' | cat

 

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

$   echo 'hello shiyanlou' > redirect

$   cat redirect

    

 

初學者這裏要注意不要將管道和重定向混淆,管道默認是鏈接前一個命令的輸出到下一個命令的輸入,而重定向一般是須要一個文件來創建兩個命令的鏈接,你能夠仔細體會一下上述第三個操做和最後兩個操做的異同點。

 

2.標準錯誤重定向

重定向標準輸出到文件,這是一個很實用的操做,另外一個很實用的操做是將標準錯誤重定向,標準輸出和標準錯誤都被指向僞終端的屏幕顯示,因此咱們常常看到的一個命令的輸出一般是同時包含了標準輸出和標準錯誤的結果的。好比下面的操做:

 

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

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

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

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

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

    

 

遺憾的是,這裏依然出現了那條錯誤信息,這正是由於如我上面說的那樣,標準輸出和標準錯誤雖然都指向終端屏幕,實際它們並不同。那有的時候咱們就是要能夠隱藏某些錯誤或者警告,那又該怎麼作呢。這就須要用到咱們前面講的文件描述符了:

 

# 將標準錯誤重定向到標準輸出,再將標準輸出重定向到文件,注意要將重定向到文件寫到前面

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

# 或者只用bash提供的特殊的重定向符號"&"將標準錯誤和標準輸出同時重定向到文件

$   cat Documents/test.c\~ hello.c &>somefilehell

注意你應該在輸出重定向文件描述符前加上&,不然shell會當作重定向到一個文件名爲1的文件中

    

 

 

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的文件描述符。

l  查看當前 Shell 進程中打開的文件描述符:

$ cd   /dev/fd/;ls –Al

    

 

l  一樣使用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 操做系統的經常使用命令。它的做用是將參數列表轉換成小塊分段傳遞給其餘命令,以免參數列表過長的問題

這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 findlocate grep 的結果

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

    

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

 

第11節     正則表達式基礎

grepsedawk

 

1、正則表達式

什麼是正則表達式呢?

正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語: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),爲用來描述或者匹配一系列符合某個句法規則的字符串。

l  選擇

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

 

l  數量限定

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

+表示前面的字符必須出現至少一次(1次或屢次),例如,"goo+gle",能夠匹配"gooogle","goooogle"等;

?表示前面的字符最多出現一次(0次或1次),例如,"colou?r",能夠匹配"color"或者"colour";

*星號表明前面的字符能夠不出現,也能夠出現一次或者屢次(0次、或1次、或屢次),例如,「0*42」能夠匹配4二、04二、004二、00042等。

 

l  範圍和優先級

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

 

l  語法(部分)

正則表達式有多種不一樣的風格,下面列舉一些經常使用的做爲 PCRE 子集的適用於perl和python編程語言及grep或egrep的正則表達式匹配規則:

                                                                                                                                                                                                                                                  
    

字符

    
    

描述

    
   

\

   
   

將下一個字符標記爲一個特殊字符、或一個原義字符。例如,「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」範圍內的任意字符。

   

 

l  優先級

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

                                                                                      
    

運算符

    
    

說明

    
   

\

   
   

轉義符

   
   

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

   
   

括號和中括號

   
   

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

   
   

限定符

   
   

^、$、\任何元字符

   
   

定位點和序列

   
   

   
   

 選擇

   

 

 

2、grep模式匹配命令

1.基本操做

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

 

參數   說明

-E  POSIX擴展正則表達式,ERE

-G  POSIX基本正則表達式,BRE

-P  Perl正則表達式,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

l  位置

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

$   grep 'shiyanlou' /etc/group

$   grep '^shiyanlou' /etc/group

 

l  數量

# 將匹配以'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爲換行符

 

 

l  選擇

#   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

 

n  數量

# 只匹配"zo"

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

# 匹配以"zo"開頭的全部單詞

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

    

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

 

n  選擇

# 匹配"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'

    

注意:由於.號有特殊含義,因此須要轉義。

 

 

3、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操做舉例

1)          咱們先找一個用於練習的文本文件:

$ cp   /etc/passwd ~

 

2)          打印指定行

# 打印2-5行

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

# 打印奇數行

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

      

 

3)          行內替換

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

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

    

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

 

4)          行間替換

$ nl   passwd | grep "shiyanlou"

# 刪除第21行

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

      

 

4、awk文本處理語言

awk的經常使用操做:

 

1.awk介紹

系統已經爲咱們建立好了awk指向mawk的符號連接:

$ ll   /usr/bin/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

 

說明:在這個操做中我是省略了patter,因此awk會默認匹配輸入文本的所有內容,而後在"{}"花括號中執行動做,即print打印全部匹配項,這裏是所有文本內容

•     將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

 

•     將test的第二行的以點爲分段的字段換成以空格爲分隔

$   awk -F'.' '{

>   if(NR==2){

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

>   }}' test

 

# 或者

$   awk '

>   BEGIN{

>   FS="."

>   OFS="\t"  # 若是寫爲一行,兩個動做語句之間應該以";"號分開 

>   }{

>   if(NR==2){

>   print $1, $2, $3

>   }}' test

 

 

6.awk經常使用的內置變量

                                                                                                                                                       
    

變量名

    
    

說明

    
   

FILENAME

   
   

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

   
   

$0

   
   

當前記錄的內容

   
   

$N

   
   

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

   
   

FS

   
   

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

   
   

RS

   
   

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

   
   

NF

   
   

當前記錄字段數

   
   

NR

   
   

已經讀入的記錄數

   
   

FNR

   
   

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

   
   

OFS

   
   

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

   
   

ORS

   
   

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

   

 

第十二節  Linux 下軟件安裝

介紹 Ubuntu 下軟件安裝的幾種方式,及 apt,dpkg 工具的使用。

 

1、Linux 上的軟件安裝

 

一般 Linux 上的軟件安裝主要有四種方式:

1)          在線安裝

2)          從磁盤安裝deb軟件包

3)          從二進制軟件包安裝

4)          從源代碼編譯安裝

 

2、在線安裝

 

1. 先體驗一下

 

好比咱們想安裝一個軟件,名字叫作 w3m(w3m是一個命令行的簡易網頁瀏覽器),那麼輸入以下命令:

$   sudo apt-get install w3m

這樣的操做你應該在前面的章節中看到過不少次了,它就表示將會安裝一個軟件包名爲w3m的軟件

$   w3m www.shiyanlou.com/faq

注意:若是你在安裝一個軟件以後,沒法當即使用Tab鍵補全這可命令,你能夠嘗試先執行source ~/.zshrc,而後你就可使用補全操做。

 

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……

apt-cache 命令則是針對本地數據進行相關操做的工具,search 顧名思義在本地的數據庫中尋找有關 softname1   softname2 …… 相關軟件的信息。如今咱們試試搜索一下以前咱們安裝的軟件 w3m ,如圖:

    

結果顯示了4個 w3m 相關的軟件,而且有相關軟件的簡介。

 

3、使用 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

 

 

4、從二進制包安裝

 

二進制包的安裝比較簡單,咱們須要作的只是將從網絡上下載的二進制包解壓後放到合適的目錄,而後將包含可執行的主程序文件的目錄添加進PATH環境變量便可,若是你不知道該放到什麼位置,請從新複習第四節關於 Linux 目錄結構的內容。

 

 

7、遇到的問題及解決

1)          1.建立一個 Shell 腳本文件:

$ vim hello_shell.sh

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

#!/bin/zsh

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

    echo "hello shell"

done

exit 0

???怎麼退出bash啊!!!】這個問題我依舊沒有解決……

2.在實驗樓裏跟着作能作下來,可是並不能真正遷移到本身的虛擬機中

3.虛擬硬盤那裏不太能理解


 
 


 
 

 

 

8、其餘

Linux學的我雲裏霧裏……雖然這個實驗課跟完了可是並無多大的用處……沒有獲得多少真正的知識,只是填鴨同樣的作完了就完了,這個系統體系須要從頭至尾的知識講解,慢慢體會理解才行啊,羅馬不是一天建成的,只能慢慢來了……

相關文章
相關標籤/搜索