學習計時:共11小時html 讀書:4前端 代碼:3node 做業:2python 博客:2linux |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1、學習目標git |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. 可以獨立安裝Linux操做系統
2. 可以熟練使用Linux系統的基本命令
3. 熟練使用Linux中用戶管理命令/系統相關命令/文件目錄相關命令/打包壓縮相關命令/比較合併相關命令/網絡相關命令等
4. 熟練應用「搜索」進行觸類旁通的學習
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2、學習資源web |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. 課程資料:https://www.shiyanlou.com/courses/413 實驗一,課程邀請碼:W7FQKW4Y正則表達式 2. Linux 基礎入門:https://www.shiyanlou.com/courses/1(重點,第一次課考覈內容所有從這裏面出)shell |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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. 測試示例:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
五、後續學習預告(可選): |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Linux下C語言編程基礎:
VIM進行編輯
GCC進行編譯
GDB進行調試
Make進行自動化
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
六、學習過程 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
實驗一 Linux 簡介
本節主要介紹 Linux 的歷史,Linux 與 Windows 的區別等入門知識。
1、Linux 爲什麼物
Linux 就是一個操做系統,就像你多少已經瞭解的 Windows(xp,7,8)和 Max OS ,至於操做系統是什麼,就不用過多解釋了,若是你學習過前面的入門課程,應該會有個基本概念了,這裏簡單介紹下操做系統在整個計算機系統中的角色。
Linux 也就是系統調用和內核那兩層,固然直觀的來看,咱們使用的操做系統還包含一些在其上運行的應用程序,好比文本編輯器,瀏覽器,電子郵件。
2、Linux 歷史簡介
操做系統始於二十世紀 50 年代,當時的操做系統能運行批處理程序。批處理程序不須要用戶的交互,它從文件或者穿孔卡片讀取數據,而後輸出到另一個文件或者打印機。
二十世紀六十年代初,交互式操做系統開始流行。它不只僅能夠交互,還能使多個用戶從不一樣的終端同時操做主機。這樣的操做系統被稱做分時操做系統,它的出現對批處理操做系統是個極大的挑戰。許多人嘗試開發分時操做系統, 其中包括一些大學的研究項目和商業項目。當時有一個項目叫作" Multics ",它的技術在當時很創新。" Multics "項目的開發並不順利。它花費了遠超過預計的時間來完成,卻沒有在操做系統市場上佔到多少份額。而參加該項目的一個開發團體-貝爾實驗室退出了這個項目。他們在退出後開發了他們本身的一個操做系統—— UNIX。UNIX 最初免費發佈並所以在大學裏受到歡迎。後來,UNIX 實現了 TCP/IP 協議棧,成爲了早期工做站的操做系統的一個流行選擇。
1990年,UNIX 在服務器市場尤爲是大學校園成爲主流操做系統,許多校園都有 UNIX 主機,固然還包括一些研究它的計算機系的學生。這些學生都渴望能在本身的電腦上運行 UNIX 。不幸的是,從那時候開始,UNIX 開始變得商業化,它的價格也變得很是昂貴。而惟一低廉的選擇就是 MINIX ,這是一個功能有限的相似 UNIX 的操做系統,做者 Andrew Tanebaum 開發它的目的是用於教學。
1991 年 10 月,Linus Torvalds(Linux 之父)在赫爾辛基大學接觸 UNIX ,他但願能在本身的電腦上運行一個相似的操做系統。但是 UNIX 的商業版本很是昂貴,因而他從 MINIX 開始入手,計劃開發一個比 MINIX 性能更好的操做系統。很快他就開始了本身的開發工做。他第一次發行的版本很快吸引了一些黑客。儘管最初的 Linux 並無多少用處,但因爲一些黑客的加入使它很快就具備了許多吸引人的特性,甚至一些對操做系統開發不感興趣的人也開始關注它。
Linux 自己只是操做系統的內核。內核是使其餘程序可以運行的基礎。它實現了多任務和硬件管理,用戶或者系統管理員交互運行的全部程序實際上都運行在內核之上。其中有些程序是必需的,好比說,命令行解釋器(shell),它用於用戶交互和編寫 shell 腳本(.bat文件)。 Linus沒有本身去開發這些應用程序,而是使用已有的自由軟件。這減小了搭建開發環境而所需花費的工做量。實際上,他常常改寫內核,使得那些程序能更容易在 Linux 上運行。許多重要的軟件,包括 C 編譯器,都來自於自由軟件基金 GNU 項目。GNU 項目開始於 1984 年,目的是爲了開發一個徹底相似於 UNIX 的免費操做系統。爲了表揚 GNU 對 Linux 的貢獻,許多人把 Linux 稱爲GNU/Linux(GNU 有本身的內核)。
1992-1993 年,Linux 內核具有了挑戰 UNIX 的全部本質特性,包括 TCP/IP 網絡,圖形界面系統(X window),Linux 一樣也吸引了許多行業的關注。一些小的公司開發和發行Linux,有幾十個 Linux 用戶社區成立。1994 年,Linux 雜誌也開始發行。
Linux 內核 1.0 在 1994 年三月發佈,內核的發佈要經歷許多開發週期,直至到達一個穩定的版本。
下面列舉一下 Linux 誕生大事件:
1965 年,Bell 實驗室、MIT、GE(通用電氣公司)準備開發 Multics 系統,爲了同時支持 300 個終端訪問主機,可是 1969 年失敗了;
剛開始並無鼠標、鍵盤,輸入設備只有卡片機,所以若是要測試某個程序,則須要將讀卡紙插入卡片機,若是有錯誤,還須要從新來過; Multics:Multiplexed Information and Computing Service
1969 年,Ken Thompson(C語言之父)利用匯編語言開發了 FIle Server System(Unics,即 UNIX 的原型)
由於彙編語言對於硬件的依賴性,所以只能針對特定硬件; 只是爲了移植一款「太空旅遊」的遊戲;
1973 年,Dennis Ritchie 和 Ken Thompson 發明了 C 語言,然後寫出了 UNIX 的內核
將 B 語言改爲 C 語言,由此產生了 C 語言之父; 90% 的代碼是 C 語言寫的,10% 的代碼用匯編寫的,所以移植時只要修改那 10% 的代碼便可;
1977 年,Berkeley 大學的 Bill Joy 針對他的機器修改 UNIX 源碼,稱爲BSD(Berkeley Software Distribution)
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.免費與收費
最新正版 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 沒有的
沒有特定的支持廠商
遊戲娛樂支持度不足
專業軟件支持度不足
5、如何學習 Linux
1.學習心態
明確目的:你是要用 Linux 來幹什麼,搭建服務器,作程序開發,仍是平常辦公,仍是娛樂遊戲;
面對現實:Linux 大都在命令行下操做,可否接受不用或少用圖形界
是學習 Linux 操做系統自己仍是某一個Linux發行版(Ubuntu,CentOS,Fedora,OpenSUSE,Debian,Mint 等等),若是你對發行版的概念或者它們之間的關係不明確的話能夠參看Linux 發行版。
2.注重基礎,從頭開始
大體的學習路徑以下:
實驗二 基本概念及操做
實驗介紹
本節實驗主要有:
一、實驗樓環境介紹 二、經常使用 Shell 命令及快捷鍵 三、Linux 使用小技巧
1、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 上你能夠本身選擇安裝不一樣的桌面環境,甚至能夠定製本身的專屬桌面。
3、Linux終端
1.Terminal(終端)
一般在咱們使用 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鍵來強行終止當前程序(你能夠放心它並不會使終端退出)。
嘗試輸入如下命令:
$ tail
而後你會發現你接下來的輸入都沒有任何反應了,只是將你輸入的東西顯示出來,如今你能夠使用Ctrl+c,來中斷這個你目前可能還不知道是什麼的程序了。(在後續課程中咱們會具體解釋這個tail命令是什麼)
又或者輸入:
$ find /
也能夠使用Ctrl+c 結束。
雖然這個按着很方便,但不要隨便按,由於有時候當你看到終端沒有任何反應或提示,也不能接受你的輸入,可能只是運行的程序須要你耐心的等一下,你就不要急着Ctrl+c了。
其餘一些經常使用快捷鍵
2).學會利用歷史輸入命令
很簡單,你能夠使用鍵盤上的方向上鍵,恢復你以前輸入過的命令,你一試便知。
3).學會使用通配符
通配符是一種特殊語句,主要有星號(*)和問號(?),用來對對字符串進行模糊匹配(好比文件名,參數名)。當查找文件夾時,能夠使用它來代替一個或多個真正字符;當不知道真正字符或者懶得輸入完整名字時,經常使用通配符代替一個或多個真正的字符。
終端裏面輸入的通配符是由 Shell 處理的,不是由所涉及到命令語句處理的,它只會出如今命令的「參數值」裏(它不用在 命令名稱裏, 命令不記得,那就用Tab補全)。當 Shell 在「參數值」中遇到了通配符時,Shell 會將其看成路徑或文件名去在磁盤上搜尋可能的匹配:若符合要求的匹配存在,則進行代換(路徑擴展);不然就將該通配符做爲一個普通字符傳遞給「命令」,而後再由命令進行處理。總之,通配符 實際上就是一種 Shell 實現的路徑擴展功能。在 通配符被處理後, Shell 會先完成該命令的重組,而後再繼續處理重組後的命令,直至執行該命令。
先使用 touch 命令建立 2 個文件,後綴都爲 txt:
$ touch adsfasd.txt wergjlkas.txt
能夠給文件隨意命名,假如過了很長時間,你已經忘了這兩個文件的文件名,如今你想在你大堆其餘文件中找到這兩個文本文件,就能夠使用通配符:
$ ls *.txt
在建立文件的時候,若是須要一次性建立多個文件,好比:「love_1_linux.txt,love_2_linux.txt,... love_10_linux.txt」。在 Linux 中十分方便:
$ touch love_{1..10}_linux.txt
Shell 經常使用通配符:
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個區段,安排以下:
要查看相應區段的內容,就在 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
做業
能夠使用默認已經安裝的一個命令printerbanner:
實驗三 用戶及文件權限管理
實驗介紹
一、Linux 中建立、刪除用戶,及用戶組等操做。 二、Linux 中的文件權限設置。
1、Linux 用戶管理下面學習 Linux 下的帳戶管理的基礎知識。 1.查看用戶請打開終端,輸入命令: $ who am i
輸入的第一列表示打開當前僞終端的用戶的用戶名(要查看當前登陸用戶的用戶名,去掉空格直接使用
2.建立用戶
在 Linux 系統裏, root 權限,系統權限的一種,與 SYSTEM 權限能夠理解成一個概念,但高於 Administrator 權限,root 是 Linux 和 UNIX 系統中的超級管理員用戶賬戶,該賬戶擁有整個系統至高無上的權力,全部對象他均可以操做,因此不少黑客在入侵系統的時候,都要把權限提高到 root 權限,用 Windows 的方法理解也就是將本身的非法賬戶添加到 Administrators 用戶組。更好比安卓操做系統中(基於 Linux 內核)得到 root 權限以後就意味着已經得到了手機的最高權限,這時候你能夠對手機中的任何文件(包括系統文件)執行全部增、刪、改、查的操做。 咱們通常登陸系統時都是以普通帳戶的身份登陸的,要建立用戶須要 root 權限,這裏就要用到 $ sudo adduser lilei 按照提示輸入 shiyanlou 密碼(Linux 下密碼輸入一般都是不可見的),而後是給 lilei 用戶設置密碼,後面的選項的一些內容你能夠選擇直接回車使用默認值: 這個命令不但能夠添加用戶到系統,同時也會默認爲新用戶建立 home 目錄: $ ls /home 如今你已經建立好一個用戶,而且你能夠使用你建立的用戶登陸了,使用以下命令切換登陸用戶: -l$ sulilei 退出當前用戶跟退出終端同樣能夠使用
3.用戶組
在 Linux 裏面每一個用戶都有一個歸屬(用戶組),用戶組簡單地理解就是一組用戶的集合,它們共享一些資源和權限,同時擁有私有資源,就跟家的形式差很少,你的兄弟姐妹(不一樣的用戶)屬於同一個家(用戶組),大家能夠共同擁有這個家(共享資源),爸媽對待大家都同樣(共享權限),你偶爾寫寫日記,其餘人未經容許不能查看(私有資源和權限)。固然一個用戶是能夠屬於多個用戶組的,正如你既屬於家庭,又屬於學校或公司 在 Linux 裏面如何知道本身屬於哪些用戶組呢? 方法一:使用groups命令$ |
命令 |
說明 |
set |
顯示當前 Shell 全部環境變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量 |
env |
顯示與當前用戶相關的環境變量,還可讓命令在指定環境中運行 |
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 中輸入一個命令,Shell 是怎麼知道在哪去找到這個命令而後執行的呢?這是經過環境變量PATH來進行搜索的,熟悉 Windows 的用戶可能知道 Windows 中的也是有這麼一個 PATH 環境變量。這個PATH裏面就保存了Shell中執行的命令的搜索路徑。
查看PATH環境變量的內容:
$ echo $PATH
默認狀況下你會看到以下輸出:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
若是你還記得咱們在 Linux 目錄結構那一節的內容,你就應該知道上面這些目錄下放的是哪一類文件了。一般這一類目錄下放的都是可執行文件,當咱們在 Shell 中執行一個命令時,系統就會按照 PATH 中設定的路徑按照順序依次到目錄中去查找,若是存在同名的命令,則執行先找到的那個。
$ vim ello_shell.sh
在腳本中添加以下內容,保存並退出(注意不要省掉第一行,這不是註釋,論壇有用戶反應會有語法錯誤,就是由於沒有了第一行):
#!/bin/zsh
for ((i=0; i<10; i++));do
echo "hello shell"
done
exit 0
爲文件添加可執行權限:
$ chmod 755 hello_shell.sh
執行腳本
$ ./hello_shell.sh
建立一個 C 語言"hello world"程序:
$ vim hello_world.c
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
使用 gcc 生成可執行文件:
$ gcc -o hello_world hello_world.c
gcc 生成二進制文件默認具備可執行權限,不須要修改
在 shiyanlou 家目錄建立一個mybin目錄,並將上述 hello_shell.sh 和 hello_world 文件移動到其中:
$ mkdir mybin
$ mv hello_shell.sh hello_world mybin/
如今你能夠在mybin目錄中分別運行你剛剛建立的兩個程序:
$ cd mybin
$ ./hello_shell.sh
$ ./hello_world
回到上一級目錄,也就是shiyanlou家目錄,當再想運行那兩個程序時,會發現提示命令找不到,除非加上命令的完整路徑,但那樣很不方便,如何作到想使用系統命令同樣執行本身建立的腳本文件或者程序呢?那就要將命令所在路徑添加到PATH環境變量了。
4.添加自定義路徑到「PATH」環境變量
在前面咱們應該注意到PATH裏面的路徑是以:做爲分割符,因此咱們能夠這樣添加自定義路徑:
$ PATH=$PATH:/home/shiyanlou/mybin
注意這裏必定要使用絕對路徑
如今你就能夠在其餘任意目錄執行那兩個命令了。你可能會意識到這樣還並無很好的解決問題,由於我給 PATH 環境變量追加了一個路徑,它也只是在當前 Shell 有效,我一旦退出終端,再打開就會發現又失效了。有沒有方法讓添加的環境變量全局有效?或者每次啓動 Shell 時自動執行上面添加自定義路徑到 PATH 的命令?下面咱們就來講說後一種方式——讓它自動執行。
在每一個用戶的 home 目錄中有一個 Shell 每次啓動時會默認執行一個配置腳本,以初始化環境,包括添加一些用戶自定義環境變量等等。zsh 的配置文件是.zshrc,相應 Bash 的配置文件爲.bashrc。它們在etc下還都有一個或多個全局的配置文件,不過咱們通常只修改用戶目錄下的配置文件。
咱們能夠簡單的使用下面命令直接添加內容到.zshrc中:
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中>>表示將標準輸出以追加的方式重定向到一個文件中,注意前面用到的>是以覆蓋的方式重定向到一個文件中,使用的時候必定要注意分辨。在指定文件不存在的狀況下都會建立新的文件。
5.修改和刪除已有變量
變量修改
變量的修改有如下幾種方式:
變量設置方式 |
說明 |
${變量名#匹配字串} |
從頭向後開始匹配,刪除符合匹配字串的最短數據 |
${變量名##匹配字串} |
從頭向後開始匹配,刪除符合匹配字串的最長數據 |
${變量名%匹配字串} |
從尾向前開始匹配,刪除符合匹配字串的最短數據 |
${變量名%%匹配字串} |
從尾向前開始匹配,刪除符合匹配字串的最長數據 |
${變量名/舊的字串/新的字串} |
將符合舊字串的第一個字串替換爲新的字串 |
${變量名//舊的字串/新的字串} |
將符合舊字串的所有字串替換爲新的字串 |
好比要修改咱們前面添加到 PATH 的環境變量。爲了不操做失誤致使命令找不到,咱們先將 PATH 賦值給一個新的自定義變量 path:
$ path=$PATH
$ echo $path
$ path=${path%/home/shiyanlou/mybin}
# 或使用通配符,*表示任意多個任意字符
$ path=${path%*/mybin}
變量刪除
能夠使用unset命令刪除一個環境變量:
$ unset temp
6.如何讓環境變量當即生效
在上面咱們在 Shell 中修改了一個配置腳本文件以後(好比 zsh 的配置文件 home 目錄下的.zshrc),每次都要退出終端從新打開甚至重啓主機以後其才能生效,非常麻煩,咱們能夠使用source命令來讓其當即生效,如:
$ source .zshrc
source命令還有一個別名就是.,注意與表示當前路徑的那個點區分開,雖然形式同樣,但做用和使用方式同樣,上面的命令若是替換成.的方式就該是$ . ./.zshrc
注意第一個點後面有一個空格,並且後面的文件必須指定完整的絕對或相對路徑名,source 則不須要。
2、搜索文件
與搜索相關的命令經常使用的有以下幾個whereis,which,find,locate。
$whereis who
你會看到它找到了三個路徑,兩個可執行文件路徑和一個 man 在線幫助文件所在路徑,這個搜索很快,由於它並無從硬盤中依次查找,而是直接從數據庫中查詢。whereis只能搜索二進制文件(-b),man幫助文件(-m)和源代碼文件(-s)。若是想要得到更全面的搜索結果能夠使用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自己是 Shell 內建的一個命令,咱們一般使用which來肯定是否安裝了某個指定的軟件,由於它只從PATH環境變量指定的路徑中去搜索命令:$ which man
find應該是這幾個命令中最強大的了,它不但能夠經過文件類型、文件名進行查找並且能夠根據文件的屬性(如文件的時間戳,文件的權限等)進行搜索。find命令強大到,要把它將明白至少須要單獨好幾節課程才行,咱們這裏只介紹一些經常使用的內容。
在指定目錄下搜索指定文件名的文件:
$ find /etc/ -name interfaces
注意 find 命令的路徑是做爲第一個參數的,基本命令格式爲 find [path] [option] [action]
與時間相關的命令參數:
參數 |
說明 |
-atime |
最後訪問時間 |
-ctime |
建立時間 |
-mtime |
最後修改時間 |
下面以-mtime參數舉例:
列出 home 目錄中,當天(24 小時以內)有改動的文件:$ find ~ -mtime 0
列出用戶家目錄下比Code文件夾新的文件:
$ find ~ -newer /home/shiyanlou/Code
做業
《黑客帝國》電影裏滿屏幕代碼的「數字雨」,在 Linux 裏面你也能夠輕鬆實現這樣的效果,你只須要一個命令cmatrix。
須要先安裝,由於 Ubuntu 沒有預裝:$ sudo apt-get update;sudo apt-get install cmatrix
裝好以後先不要急着執行,爲了看到更好的效果,咱們須要先修改終端的主題配色,修改成黑底綠字,修改方法見下圖:而後按下F11 能夠全屏顯示。
實驗六 文件打包與壓縮
實驗介紹
Linux 上經常使用的 壓縮/解壓 工具,介紹了 zip,rar,tar 的使用。
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。下面會依次介紹這幾個命令及對應的解壓命令。
1.zip壓縮打包程序
$ zip -r -q -o shiyanlou.zip /home/shiyanlou
$ du -h shiyanlou.zip
$ file shiyanlou.zip
上面命令將 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
經過man 手冊可知:
這樣一目瞭然,你能夠看到默認壓縮級別應該是最高的,效果很明顯,不過你在環境中操做以後看到的大小可能跟圖上的有些不一樣,由於在你使用過程當中,會隨時還生成一些緩存文件在當前用戶的家目錄中,這對於咱們學習命令使用來講,是可有可無的,能夠忽略這些不一樣。
使用-e參數能夠建立加密壓縮包:$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou
注意: 關於zip命令,由於 Windows 系統與 Linux/Unix 在文本文件格式上的一些兼容問題,好比換行符(爲不可見字符),在 Windows 爲 CR+LF(Carriage-Return+Line-Feed:回車加換行),而在 Linux/Unix 上爲 LF(換行),因此若是在不加處理的狀況下,在 Linux 上編輯的文本,在 Windows 系統上打開可能看起來是沒有換行的。若是你想讓你在 Linux 建立的 zip 壓縮文件在 Windows 上解壓後沒有任何問題,那麼你還須要對命令作一些修改:$ zip -r -l -o shiyanlou.zip /home/shiyanlou
須要加上-l參數將LF轉換爲CR+LF來達到以上目的。
2.使用unzip命令解壓縮zip文件
將shiyanlou.zip解壓到當前目錄:$ unzip shiyanlou.zip
使用安靜模式,將文件解壓到指定目錄:$ unzip -q shiyanlou.zip -d ziptest
上述指定目錄不存在,將會自動建立。若是你不想解壓只想查看壓縮包的內容你能夠使用-l參數:$ unzip -l shiyanlou.zip
注意: 使用unzip解壓文件時咱們一樣應該注意兼容問題,不過這裏咱們關心的再也不是上面的問題,而是中文編碼的問題,一般 Windows 系統上面建立的壓縮文件,若是有有包含中文的文檔或以中文做爲文件名的文件時默認會採用 GBK 或其它編碼,而 Linux 上面默認使用的是 UTF-8 編碼,若是不加任何處理,直接解壓的話可能會出現中文亂碼的問題(有時候它會自動幫你處理),爲了解決這個問題,咱們能夠在解壓時指定編碼類型。
使用-O(英文字母,大寫o)參數指定編碼類型:
unzip -O GBK 中文壓縮文件.zip
3.rar打包壓縮命令
rar也是 Windows 上經常使用的一種壓縮文件格式,在 Linux 上能夠使用rar和unrar工具分別建立和解壓 rar 壓縮包。
$ sudo apt-get update
$ sudo apt-get install rar unrar
$ rm *.zip
$ rar a shiyanlou.rar .
上面的命令使用a參數添加一個目錄~到一個歸檔文件中,若是該文件不存在就會自動建立。
注意:rar 的命令參數沒有-,若是加上會報錯。
全路徑解壓:$ unrar x shiyanlou.rar
去掉路徑解壓:$ mkdir tmp
$ unrar e shiyanlou.rar tmp/
4.tar打包工具
在 Linux 上面更經常使用的是tar工具,tar 本來只是一個打包工具,只是同時仍是實現了對 7z,gzip,xz,bzip2 等工具的支持,這些壓縮工具自己只能實現對文件或目錄(單獨壓縮目錄中的文件)的壓縮,沒有實現對文件的打包壓縮,因此咱們也無需再單獨去學習其餘幾個工具,tar 的解壓和壓縮都是同一個命令,只需參數不一樣,使用比較方便。
下面先掌握tar命令一些基本的使用方式,即不進行壓縮只是進行打包(建立歸檔文件)和解包的操做。
上面命令中,-c表示建立一個 tar 包文件,-f用於指定建立的文件名,注意文件名必須緊跟在-f參數以後,好比不能寫成tar -fc shiyanlou.tar,能夠寫成tar -f shiyanlou.tar -c ~。你還能夠加上-v參數以可視的的方式輸出打包的文件。上面會自動去掉表示絕對路徑的/,你也能夠使用-P保留絕對路徑符
$ mkdir tardir
$ tar -xf shiyanlou.tar -C tardir
對於建立不一樣的壓縮格式的文件,對於tar來講是至關簡單的,須要的只是換一個參數,這裏咱們就以使用gzip工具建立*.tar.gz文件爲例來講明。
如今咱們要使用其餘的壓縮工具建立或解壓相應文件只須要更改一個參數便可:
壓縮文件格式 |
參數 |
*.tar.gz |
-z |
*.tar.xz |
-J |
*tar.bz2 |
-j |
tar 命令的參數不少,不過經常使用的就是上述這些,須要瞭解更多你能夠查看 man 手冊獲取更多幫助。
做業
天冷的時候,要是有個火爐就行了。這裏有個有趣的程序:
$ sudo apt-get install libaa-bin
# 提示command not found,請自行解決
$ aafire
本節實驗的文件系統操做的內容十分簡單,只會包含幾個命令的幾個參數的講解,但掌握這些也將對你在學習 Linux 和實驗樓後續其餘課程的過程當中有極大幫助。
由於本課程的定位爲入門基礎,儘快上手,故沒有打算涉及太多理論內容,前面省略了關於 Linux 文件系統的一些基本知識,也由於咱們是在線實驗環境,因此也避開了不多一部分但又十分重要的關於硬件的內容,咱們只能期待用戶可以抱着提升自學能力的心態本身去補充相關的知識。
df
輸出以下內容:
通常使用狀況下,咱們更多隻是關心第一行的內容也就是環境中的rootfs
或者物理主機上的/dev/sda2
"rootfs" : (Root File System)它是 Ramfs(Ramfs 是一個很是簡單的 Linux 文件系統用於實現磁盤緩存機制做爲動態可調整大小的基於 ram 的文件系統)或者 tmpfs 的一個特殊實例,它做爲系統啓動時內核載入內存以後,在掛載真正的的磁盤以前的一個臨時文件系統。一般的主機會在系統啓動後用磁盤上的文件系統替換,只是在一些嵌入式系統中會只存在一個 rootfs ,或者像咱們目前遇到的狀況運行在虛擬環境中共享主機資源的系統也可能會採用這種方式。
物理主機上的 /dev/sda2 是對應着主機硬盤的分區,後面的數字表示分區號,數字前面的字母 a 表示第幾塊硬盤(也多是可移動磁盤),你若是主機上有多塊硬盤則可能還會出現 /dev/sdb,/dev/sdc 這些磁盤設備都會在 /dev 目錄下以文件的存在形式。
接着你還會看到"1k-blocks"這個陌生的東西,它表示以磁盤塊大小的方式顯示容量,後面爲相應的以塊大小表示的已用和可用容量,在你瞭解 Linux 的文件系統以前這個就先無論吧,咱們以一種你應該看得懂的方式展現:
$ df -h
如今你就能夠使用命令查看你主機磁盤的使用狀況了。至於掛載點若是你還記得前面第 4 節介紹 Linux 目錄樹結構的內容,那麼你就應該能很好的理解掛載的概念,這裏就再也不贅述。
這個命令前面其實已經用了不少次了:
# 默認一樣以 blocks 的大小展現
$ du
# 加上`-h`參數,以更易讀的方式展現
$ du -h
-d
參數指定查看目錄的深度
# 只查看1級目錄的信息
-d0$ du -h~
# 查看2級
-d1$ du -h~
du
(estimate file space usage)命令與df
(report file system disk space usage)只用一字只差,首先就但願注意不要弄混淆了,以能夠像我這樣從man手冊中獲取命令的完整描述,記全稱就不會搞混了。
一般狀況下,這一小節應該直接將如何掛載卸載磁盤,如何格式化磁盤,如何分區,但如你所見,咱們的環境中沒東西給你掛,也沒東西給你格和分,因此首先咱們會先建立一個虛擬磁盤來進行後續的練習操做
dd
命令用於轉換和複製文件,不過它的複製不一樣於cp
。以前提到過關於 Linux 的很重要的一點,一切即文件,在 Linux 上,硬件的設備驅動(如硬盤)和特殊設備文件(如/dev/zero
和/dev/random
)都像普通文件同樣,只要在各自的驅動程序中實現了對應的功能,dd 也能夠讀取自和/或寫入到這些文件。這樣,dd
也能夠用在備份硬件的引導扇區、獲取必定數量的隨機數據或者空數據等任務中。dd
程序也能夠在複製時處理數據,例如轉換字節序、或在 ASCII 與 EBCDIC 編碼間互換。
dd
的命令行語句與其餘的 Linux 程序不一樣,由於它的命令行選項格式爲選項
=
值
,而不是更標準的--
選項
值
或-
選項
=
值
。dd
默認從標準輸入中讀取,並寫入到標準輸出中,但能夠用選項if
(input file,輸入文件)和of
(output file,輸出文件)改變。
咱們先來試試用dd
命令從標準輸入讀入用戶輸入到標準輸出或者一個文件:
# 輸出到文件
$ 101# 或者 dd if=/dev/stdin of=test bs=10 count=1dd of=test bs=count=
# 輸出到標準輸出
$ if/dev/stdin/dev/stdout101dd=of=bs=count=
上述命令從標準輸入設備讀入用戶輸入(缺省值,因此可省略)而後輸出到 test 文件,bs
(block size)用於指定塊大小(缺省單位爲 Byte,也可爲其指定如'K','M','G'等單位),count
用於指定塊數量。如上圖所示,我指定只讀取總共 10 個字節的數據,當我輸入了「hello shiyanlou」以後加上空格回車總共 16 個字節(一個英文字符佔一個字節)內容,顯然超過了設定大小。使用和du
和cat
命令看到的寫入完成文件實際內容確實只有 10 個字節(那個黑底百分號表示這裏沒有換行符),而其餘的多餘輸入將被截取並保留在標準輸入。
前面說到dd
在拷貝的同時還能夠實現數據轉換,那下面就舉一個簡單的例子:將輸出的英文字符轉換爲大寫再寫入文件:
$ if/dev/stdin101dd=of=test bs=count=conv=ucase
你能夠在man
文檔中查看其餘全部轉換參數。
經過上面一小節,你應該掌握了dd
的基本使用,下面就來使用dd
命令來完成建立虛擬磁盤的第一步。
從/dev/zero
設備建立一個容量爲 256M 的空文件:
$ if/dev/zero1256dd=of=virtual.img bs=M count=
$ du -h virtual.img
而後咱們要將這個文件格式化(寫入文件系統),這裏咱們要學到一個(準確的說是一組)新的命令來完成這個需求。
你能夠在命令行輸入 mkfs 而後按下Tab
鍵,你能夠看到不少個以 mkfs 爲前綴的命令,這些不一樣的後綴其實就是表示着不一樣的文件系統,能夠用 mkfs 格式化成的文件系統:
咱們能夠簡單的使用下面的命令來將咱們的虛擬磁盤鏡像格式化爲ext4
文件系統:
virtual$ mkfs.ext4.img
能夠看到實際 mkfs.ext4 是使用 mke2fs 來完成格式化工做的。mke2fs 的參數不少,不過咱們也不會常常格式化磁盤來玩,因此就掌握這基本用法吧,等你有特殊需求時,再查看 man 文檔解決。
更多關於文件系統的知識,請查看wiki: 文件系統 ext3,ext4
若是你想一想知道 Linux 支持哪些文件系統你能夠輸入ls -l /lib/modules/$(uname -r)/kernel/fs
(咱們的環境中沒法查看)查看。
用戶在 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
目錄:
loop$ mount -o-t ext4 virtual.img /mnt
# 也能夠省略掛載類型,不少時候 mount 會自動識別
# 以只讀方式掛載
loop$ mount -o--ro virtual.img /mnt
# 或者mount -o loop,ro virtual.img /mnt
# 命令格式 sudo umount 已掛載設備名或者掛載點,如:
$ sudo umount /mnt
不過遺憾的是,因爲咱們環境的問題(環境中使用的 Linux 內核在編譯時沒有添加對 Loop device的支持),因此你將沒法掛載成功:
另外關於 loop 設備,你可能會有諸多疑問,那麼請看下面來自維基百科/dev/loop的說明:
在類 UNIX 系統中,/dev/loop(或稱vnd (vnode disk)、lofi(循環文件接口))是一種僞設備,這種設備使得文件能夠如同塊設備通常被訪問。
在使用以前,循環設備必須與現存文件系統上的文件相關聯。這種關聯將提供給用戶一個應用程序接口,接口將容許文件視爲塊特殊文件(參見設備文件系統)使用。所以,若是文件中包含一個完整的文件系統,那麼這個文件就能如同磁盤設備通常被掛載。
這種設備文件常常被用於光盤或是磁盤鏡像。經過循環掛載來掛載包含文件系統的文件,便使處在這個文件系統中的文件得以被訪問。這些文件將出如今掛載點目錄。若是掛載目錄中自己有文件,這些文件在掛載後將被禁止使用。
一樣由於環境緣由中沒有物理磁盤,也沒法建立虛擬磁盤的緣由咱們就沒法實驗練習使用該命令了,下面我將以個人物理主機爲例講解如何爲磁盤分區。
# 查看硬盤分區表信息
-l$ sudo fdisk
輸出結果中開頭顯示了我主機上的磁盤的一些信息,包括容量扇區數,扇區大小,I/O 大小等信息。
咱們重點開一下中間的分區信息,/dev/sda1,/dev/sda2 爲主分區分別安裝了 Windows 和 Linux 操做系統,/dev/sda3 爲交換分區(能夠理解爲虛擬內存),/dev/sda4 爲擴展分區其中包含 /dev/sda5,/dev/sda6,/dev/sda7,/dev/sda8 四個邏輯分區,由於主機上有幾個分區之間有空隙,沒有對齊邊界扇區,因此分區之間的不是徹底連續的。
# 進入磁盤分區模式
virtual$ sudo fdisk.img
在進行操做前咱們首先應先規劃好咱們的分區方案,這裏我將在使用 128M(可用 127M 左右)的虛擬磁盤鏡像建立一個 30M 的主分區剩餘部分爲擴展分區包含 2 個大約 45M 的邏輯分區。
操做完成後輸入p
查看結果以下:
最後不要忘記輸入w
寫入分區表。
$ 0sudo losetup /dev/loopvirtual.img
# 若是提示設備忙你也能夠使用其它的迴環設備,"ls /dev/loop*"參看全部迴環設備
# 解除設備關聯
$ 0sudo losetup -d /dev/loop
而後再使用mkfs
格式化各分區(前面咱們是格式化整個虛擬磁盤鏡像文件或磁盤),不過格式化以前,咱們還要爲各分區創建虛擬設備的映射,用到kpartx
工具,須要先安裝:
$ sudo apt-get install kpartx
$ 0sudo kpart kpartx -av /dev/loop
# 取消映射
$ 0sudo kpart kpartx -dv /dev/loop
接着再是格式化,咱們將其所有格式化爲 ext4:
$ sudo mkfs.ext4 -q /dev/mapper/loop0p1
$ sudo mkfs.ext4 -q /dev/mapper/loop0p5
$ sudo mkfs.ext4 -q /dev/mapper/loop0p6
格式化完成後在/media
目錄下新建四個空目錄用於掛載虛擬磁盤:
mkdir_13$-p /media/virtualdisk{..}
# 掛載磁盤分區
$ 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
cowsay
命令,可讓你在終端裏以一種動物說話的形式打印出一段話。
# 安裝
$ sudo apt-get install cowsay
# 默認是一隻牛
$ cowsay hello shiyanlou
# 加上'-l'參數打印全部支持的動物(其實不僅是動物)種類
$ cowsay -l
# 使用'-f'參數選擇動物種類
$ cowsay -f elephant hello shiyanlou
# 此外它還能夠結合咱們以前的做業講過的 fortune 命令一塊兒使用
$ fortune | cowsay -f daemon
實驗八
命令執行順序控制與管道
實驗介紹
順序執行、選擇執行、管道、cut 命令、grep 命令、wc 命令、sort 命令等,高效率使用 Linux 的技巧。
1、命令執行順序的控制
1.順序執行多條命令
一般狀況下,咱們每次只能在終端輸入一條命令,按下回車執行,執行完成後,咱們再輸入第二條命令,而後再按回車執行…… 你可能會遇到以下使用場景:我須要使用apt-get安裝一個軟件,而後安裝完成後當即運行安裝的軟件(或命令工具),又恰巧你的主機才更換的軟件源尚未更新軟件列表(好比以前咱們的環境中,每次從新開始實驗就得sudo apt-get update,如今已經沒有這個問題了),那麼你可能會有以下一系列操做:
$ sudo apt-get update
# 等待——————————而後輸入下面的命令
$ sudo apt-get install some-tool
# 等待——————————而後輸入下面的命令
$ some-tool
這時你可能就會想要是我能夠一次性輸入完,讓它本身去一次執行各命令就行了,這就是咱們這一小節要解決的問題。
簡單的順序執行你能夠使用;來完成,好比上述操做你能夠:
$ sudo apt-get update;sudo apt-get install some-tool;some-tool
# 讓它本身運行
2.有選擇的執行命令
關於上面的操做,不知你有沒有思考過一個問題,若是咱們在讓它自動順序執行命令時,前面的命令執行不成功,然後面的命令又依賴與上一條命令的結果,那麼就會形成花了時間,最終卻獲得一個錯誤的結果,並且有時候直觀的看你還沒法判斷結果是否正確。那麼咱們須要可以有選擇性的來執行命令,好比上一條命令執行成功才繼續下一條,或者不成功又該作出其它什麼處理,好比咱們使用which來查找是否安裝某個命令,若是找到就執行該命令,不然什麼也不作(雖然這個操做沒有什麼實際意義,但可幫你更好的理解一些概念):
$ which cowsay>/dev/null && cowsay -f head-in ohch~
你若是沒有安裝cowsay,你能夠先執行一次上述命令,你會發現什麼也沒發生,你再安裝好以後你再執行一次上述命令,你也會發現一些驚喜。
上面的&&就是用來實現選擇性執行的,它表示若是前面的命令執行結果(不是表示終端輸出的內容,而是表示命令執行狀態的結果)返回0則執行後面的,不然不執行,你能夠從$?環境變量獲取上一次命令的返回結果:
學習過 C 語言的用戶應該知道在 C 語言裏面&&表是邏輯與,並且還有一個||表示邏輯或,一樣 Shell 也有一個||,它們的區別就在於,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 命令,打印每一行的某一字段
打印/etc/passwd文件中以:爲分隔符的第1個字段和第6個字段分別表示用戶名和其家目錄:
$ cut /etc/passwd -d ':' -f 1,6
打印/etc/passwd文件中每一行的前N個字符:
# 前五個(包含第五個)
$ cut /etc/passwd -c -5
# 前五個以後的(包含第五個)
$ cut /etc/passwd -c 5-
# 第五個
$ cut /etc/passwd -c 5
# 2到5之間的(包含第五個)
$ cut /etc/passwd -c 2-5
3.grep 命令,在文本中或 stdin 中查找匹配字符串
grep命令是很強大的,也是至關經常使用的一個命令,它結合正則表達式能夠實現很複雜卻很高效的匹配和查找,不過在學習正則表達式以前,這裏介紹它簡單的使用,而關於正則表達式後面將會有單獨一小節介紹到時會再繼續學習grep命令和其餘一些命令。
grep命令的通常形式爲:
grep [命令選項]... 用於匹配的表達式 [文件]...
仍是先體驗一下,咱們搜索/home/shiyanlou目錄下全部包含"shiyanlou"的全部文本文件,並顯示出如今文本中的行號:
$ grep -rnI "shiyanlou" ~
-r 參數表示遞歸搜索子目錄中的文件,-n表示打印匹配項行號,-I表示忽略二進制文件。這個操做實際沒有多大意義,但能夠感覺到grep命令的強大與實用。
固然也能夠在匹配字段中使用正則表達式,下面簡單的演示:
# 查看環境變量中以"yanlou"結尾的字符串
$ export | grep ".*yanlou$"
其中$就表示一行的末尾。
4. wc 命令,簡單小巧的計數工具
wc 命令用於統計並輸出一個文件中行、單詞和字節的數目,好比輸出/etc/passwd文件的統計信息:
$ wc /etc/passwd
分別只輸出行數、單詞數、字節數、字符數和輸入文本中最長一行的字節數:
# 行數
$ wc -l /etc/passwd
# 單詞數
$ wc -w /etc/passwd
# 字節數
$ wc -c /etc/passwd
# 字符數
$ wc -m /etc/passwd
# 最長行字節數
$ wc -L /etc/passwd
注意:對於西文字符來講,一個字符就是一個字節,但對於中文字符一個漢字是大於2個字節的,具體數目是由字符編碼決定的
再來結合管道來操做一下,下面統計 /etc 下面全部目錄數:
$ ls -dl /etc/*/ | wc -l
5.sort 排序命令
這個命令前面咱們也是用過屢次,功能很簡單就是將輸入按照必定方式排序,而後再輸出,它支持的排序有按字典排序,數字排序,按月份排序,隨機排序,反轉排序,指定特定字段進行排序等等。
默認爲字典排序:
$ cat /etc/passswd | sort
反轉排序:
$ cat /etc/passwd | sort -r
按特定字段排序:
$ cat /etc/passwd | sort -t':' -k 3
上面的-t參數用於指定字段的分隔符,這裏是以":"做爲分隔符;-k 字段號用於指定對哪個字段進行排序。這裏/etc/passwd文件的第三個字段爲數字,默認狀況下是一字典序排序的,若是要按照數字排序就要加上-n參數:
$ cat /etc/passwd | sort -t':' -k 3 -n
6. uniq 去重命令
uniq命令能夠用於過濾或者輸出重複行。
咱們能夠使用history命令查看最近執行過的命令(實際爲讀取${SHELL}_history文件,如咱們環境中的~/.zsh_history文件),不過你可能只想查看使用了那個命令而不須要知道具體幹了什麼,那麼你可能就會要想去掉命令後面的參數而後去掉重複的命令:
$ history | cut -c 8- | cut -d ' ' -f 1 | uniq
而後通過層層過濾,你會發現確是只輸出了執行的命令那一列,不過去重效果好像不明顯,仔細看你會發現它趨勢去重了,只是不那麼明顯,之因此不明顯是由於uniq命令只能去連續重複的行,不是全文去重,因此要達到預期效果,咱們先排序:
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
# 或者$ history | cut -c 8- | cut -d ' ' -f 1 | sort -u
這就是 Linux/UNIX 哲學吸引人的地方,大繁至簡,一個命令只幹一件事卻能幹到最好。
# 輸出重複過的行(重複的只輸出一個)及重複次數
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
# 輸出全部重複的行
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D
文本處理命令還有不少,下一節將繼續介紹一些經常使用的文本處理的命令。
做業
使用之前介紹過的方法,安裝aview和imagemagick,而後用asciiview命令顯示圖片,使用方法能夠用 man 命令查看。
Linus大神的照片地址http://labfile.oss.aliyuncs.com/courses/1/Linus.png
實驗九
這一節咱們將介紹這幾個命令tr
(注意不是tar),col
,join
,paste
。實際這一節是上一節關於能實現管道操做的命令的延續,因此咱們依然將結合管道來熟悉這些命令的使用。
tr 命令能夠用來刪除一段文本信息中的某些文字。或者將其進行轉換。
tr[option].SET1[SET2]..
選項 |
說明 |
|
刪除和set1匹配的字符,注意不是全詞匹配也不是按字符順序匹配 |
|
去除set1指定的在輸入文本中連續並重復的字符 |
# 刪除 "hello shiyanlou" 中全部的'o','l','h'
echo'hello shiyanlou'-d'olh'$| tr
# 將"hello" 中的ll,去重爲一個l
echo'hello'-s'l'$| tr
# 將輸入文本,所有轉換爲大寫或小寫輸出
'[:lower:]''[:upper:]'$ cat /etc/passwd | tr
# 上面的'[:lower:]' '[:upper:]'你也能夠簡單的寫做'[a-z]' '[A-Z]',固然反過來將大寫變小寫也是能夠的
更多 tr 的使用,你能夠使用--help
或者man tr
得到。
col 命令能夠將Tab
換成對等數量的空格建,或反轉這個操做。
col [option]
選項 |
說明 |
|
將 |
|
將空格轉換爲 |
# 查看 /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
選項 |
說明 |
|
指定分隔符,默認爲空格 |
|
忽略大小寫的差別 |
|
指明第一個文件要用哪一個字段來對比,,默認對比第一個字段 |
|
指明第二個文件要用哪一個字段來對比,,默認對比第一個字段 |
# 建立兩個文件
$ '1 hello'echo> file1
$ '1 shiyanlou'echo> file2
$ join file1 file2
# 將/etc/passwd與/etc/shadow兩個文件合併,指定以':'做爲分隔符
$ ':'sudo join -t/etc/passwd /etc/shadow
# 將/etc/passwd與/etc/group兩個文件合併,指定以':'做爲分隔符, 分別比對第4和第3個字段
$ ':'1423sudo join -t-/etc/passwd -/etc/group
paste
這個命令與join
命令相似,它是在不對比數據的狀況下,簡單地將多個文件合併一塊兒,以Tab
隔開。
paste[option]file...
選項 |
說明 |
|
指定合併的分隔符,默認爲Tab |
|
不合併到一行,每一個文件爲一行 |
echo$hello > file1
echo$shiyanlou > file2
echo$www.shiyanlou.com > file3
-d':'$ pastefile1 file2 file3
-s$ pastefile1 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 命令行圖形庫作的:
getsudo apt-install ninvaders
實驗十
你可能對重定向這個概念感到些許陌生,但你應該在前面的課程中屢次見過>
或>>
操做了,並知道他們分別是將標準輸出導向一個文件或追加到一個文件中。這其實就是重定向,將本來輸出到標準輸出的數據重定向到一個文件中,由於標準輸出(/dev/stdout
)自己也是一個文件,咱們將命令輸出導向另外一個文件天然也是沒有任何問題的。
下面咱們簡單的回顧一下咱們前面常常用到的兩個重定向操做:
$ 'hello shiyanlou'echo> redirect
$ 'www.shiyanlou.com'>> echoredirect
$ cat redirect
固然前面沒有用到的<
和<<
操做也是沒有問題的,如你理解的同樣,它們的區別在於重定向的方向不一致而已,>
表示是從左到右,<
右到左。
在更多瞭解 Linux 的重定向以前,咱們須要先知道一些基本的東西,前面咱們已經提到過 Linux 默認提供了三個特殊設備,用於終端的顯示和輸出,分別爲stdin
(標準輸入,對應於你在終端的輸入),stdout
(標準輸出,對應於終端的輸出),stderr
(標準錯誤輸出,對應於終端的輸出)。
文件描述符 |
設備文件 |
說明 |
|
|
標準輸入 |
|
|
標準輸出 |
|
|
標準錯誤 |
文件描述符:文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核爲每個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者建立一個新文件時,內核向進程返回一個文件描述符。在程序設計中,一些涉及底層的程序編寫每每會圍繞着文件描述符展開。可是文件描述符這一律念每每只適用於 UNIX、Linux 這樣的操做系統。
另外還有一個符號-
,它能夠同時做爲前一個命令的。
咱們能夠這樣使用這些文件描述符:
默認使用終端的標準輸入做爲命令的輸入和標準輸出做爲命令的輸出
$ cat
CtrlC(按+退出)
將cat的連續輸出(heredoc方式)重定向到一個文件
$ mkdir Documents
$ cat > Documents/test.c\~ <<EOF
#include <stdio.h>
int main()
{
printf"hello world\n" ();
return0 ;
}
EOF
將一個文件做爲命令的輸入,標準輸出做爲命令的輸出
$ Documentscat/test.c\~
將echo命令經過管道傳過來的數據做爲cat命令的輸入,將標準輸出做爲命令的輸出
echo'hi'$| cat
將echo命令的輸出從默認的標準輸出重定向到一個普通文件
$ 'hello shiyanlou'echo> redirect
$ cat redirect
初學者這裏要注意不要將管道和重定向混淆,管道默認是鏈接前一個命令的輸出到下一個命令的輸入,而重定向一般是須要一個文件來創建兩個命令的鏈接,你能夠仔細體會一下上述第三個操做和最後兩個操做的異同點。
重定向標準輸出到文件,這是一個很實用的操做,另外一個很實用的操做是將標準錯誤重定向,標準輸出和標準錯誤都被指向僞終端的屏幕顯示,因此咱們常常看到的一個命令的輸出一般是同時包含了標準輸出和標準錯誤的結果的。好比下面的操做:
# 使用cat 命令同時讀取兩個文件,其中一個存在,另外一個不存在
$ Documentscat/test.c\~ hello.c
# 你能夠看到除了正確輸出了前一個文件的內容,還在末尾出現了一條錯誤信息
# 下面咱們將輸出重定向到一個文件,根據咱們前面的經驗,這裏將在看不到任何輸出了
$ Documentscat/test.c\~ hello.c > somefile
遺憾的是,這裏依然出現了那條錯誤信息,這正是由於如我上面說的那樣,標準輸出和標準錯誤雖然都指向終端屏幕,實際它們並不同。那有的時候咱們就是要能夠隱藏某些錯誤或者警告,那又該怎麼作呢。這就須要用到咱們前面講的文件描述符了:
# 將標準錯誤重定向到標準輸出,再將標準輸出重定向到文件,注意要將重定向到文件寫到前面
$ Documents21cat/test.c\~ hello.c >somefile >&
# 或者只用bash提供的特殊的重定向符號"&"將標準錯誤和標準輸出同時重定向到文件
$ Documentscat/test.c\~ hello.c &>somefilehell
注意你應該在輸出重定向文件描述符前加上&
,不然shell會當作重定向到一個文件名爲1的文件中
tee
命令同時重定向到多個文件
常常你可能還有這樣的需求,除了將須要將輸出重定向到文件以外也須要將信息打印在終端,那麼你能夠使用tee
命令來實現:
echo'hello shiyanlou'$| tee hello
你應該能夠看出咱們前面的重定向操做都只是臨時性的,即只對當前命令有效,那如何作到「永久」有效呢,好比在一個腳本中,你須要某一部分的命令的輸出所有進行重定向,難道要讓你在每一個命令上面加上臨時重定向的操做嘛,固然不須要,咱們能夠使用exec
命令實現「永久」重定向。exec
命令的做用是使用指定的命令替換當前的 Shell,及使用一個進程替換當前進程,或者指定新的重定向:
# 先開啓一個子 Shell
$ zsh
# 使用exec替換當前進程的重定向,將標準輸出重定向到一個文件
$ 1exec>somefile
# 後面你執行的命令的輸出都將被重定向到文件中,直到你退出當前子shell,或取消exec的重定向(後面將告訴你怎麼作)
$ ls
$ exit
$ cat somefile
默認在 Shell 中能夠有9個打開的文件描述符,上面咱們使用了也是它默認提供的0
,1
,2
號文件描述符,另外咱們還能夠使用3-8的文件描述符,只是它們默認沒有打開而已,你能夠使用下面命令查看當前 Shell 進程中打開的文件描述符:
cd$/dev/fd/;ls -Al
一樣使用exec
命令能夠建立新的文件描述符:
$ zsh
$ 3exec>somefile
# 先進入目錄,再查看,不然你可能不能獲得正確的結果,而後再回到上一次的目錄
$ Alcd /dev/fd/;ls -;cd -
# 注意下面的命令>與&之間不該該有空格,若是有空格則會出錯
$ "this is test"3echo>&
$ cat somefile
$ exit
如上面咱們打開的3號文件描述符,能夠使用以下操做將它關閉:
exec3$>&-
cdcd$/dev/fd;ls -Al;-
在 Linux 中有一個被成爲「黑洞」的設備文件,因此導入它的數據都將被「吞噬」。
在類 UNIX 系統中,/dev/null,或稱空設備,是一個特殊的設備文件,它一般被用於丟棄不須要的輸出流,或做爲用於輸入流的空文件,這些操做一般由重定向完成。讀取它則會當即獲得一個EOF。
咱們能夠利用設個/dev/null
屏蔽命令的輸出:
1/dev/null21$ cat Documents/test.c\~ nefile>>&
向上面這樣的操做將使你得不到任何輸出結果。
xargs 是一條 UNIX 和類 UNIX 操做系統的經常使用命令。它的做用是將參數列表轉換成小塊分段傳遞給其餘命令,以免參數列表過長的問題。
這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 find,locate 和 grep 的結果,詳細用法請參看 man 文檔。
-d-fecho$ cut:1 < /etc/passwd | sort | xargs
上面這個命令用於將/etc/passwd
文件按:
分割取第一個字段排序後,使用echo
命令生成一個列表。
一、理解下面這段代碼的的做用,實際這段代碼不會正常工做,請結合這一小節的知識分析這段代碼沒有正確工做的緣由,並設法解決這個問題。
若是你尚未 Shell 腳本編程的基礎,你能夠選擇跳過或者到這裏高級 Bash 編程指南學習
whilereaddofilename;
$filename rm -iv
done<<(ls)
二、以前介紹過一個在命令行將圖片轉換爲 ascii 字符查看的工具 aview/asciiview,不過它是黑白的。如今,這裏是個彩色的:
$ sudo apt-get install caca-utils
$ cacaview <pic_file>
$ cacademo
$ cacafire
實驗十一
正則表達式基礎
實驗介紹
雖然咱們這一節的標題是正則表達式,但實際這一節實驗只是介紹grep,sed,awk這三個命令,而正則表達式做爲這三個命令的一種使用方式(命令輸出中能夠包含正則表達式)。正則表達式自己的內容不少,要把它說明清楚須要單獨一門課程來實現,不過咱們這一節中涉及到的相關內容一般也可以知足不少狀況下的需求了。
想要更深刻地學習使用正則表達式,在這裏 正則表達式基礎。
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),爲用來描述或者匹配一系列符合某個句法規則的字符串。
選擇
|豎直分隔符表示選擇,例如"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 正則表達式庫和一些經典的正則表達式庫。
字符 |
描述 |
\ |
將下一個字符標記爲一個特殊字符、或一個原義字符。例如,「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的思導圖:
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 |
將輸出中的匹配項設置爲自動顏色顯示 |
注:在大多數發行版中是默認設置了grep的顏色的,你能夠經過參數指定或修改GREP_COLOR環境變量。
2.使用正則表達式
使用基本正則表達式,BRE
查找/etc/group文件中以"shiyanlou"爲開頭的行
$ grep 'shiyanlou' /etc/group
$ grep '^shiyanlou' /etc/group
# 將匹配以'z'開頭以'o'結尾的全部字符串
$ echo 'zero\nzo\nzoo' | grep 'z.*o'
# 將匹配以'z'開頭以'o'結尾,中間包含一個任意字符的字符串
$ echo 'zero\nzo\nzoo' | grep 'z.o'
# 將匹配以'z'開頭,以任意多個'o'結尾的字符串
$ echo 'zero\nzo\nzoo' | grep 'zo*'
注意:其中\n爲換行符
# grep默認是區分大小寫的,這裏將匹配全部的小寫字母
$ echo '1234\nabcd' | grep '[a-z]'
# 將匹配全部的數字
$ echo '1234\nabcd' | grep '[0-9]'
# 將匹配全部的數字
$ echo '1234\nabcd' | grep '[[:digit:]]'
# 將匹配全部的小寫字母
$ echo '1234\nabcd' | grep '[[:lower:]]'
# 將匹配全部的大寫字母
$ echo '1234\nabcd' | grep '[[:upper:]]'
# 將匹配全部的字母和數字,包括0-9,a-z,A-Z
$ echo '1234\nabcd' | grep '[[:alnum:]]'
# 將匹配全部的字母
$ echo '1234\nabcd' | grep '[[:alpha:]]'
下面包含完整的特殊符號及說明:
特殊符號 |
說明 |
[:alnum:] |
表明英文大小寫字節及數字,亦即 0-9, A-Z, a-z |
[:alpha:] |
表明任何英文大小寫字節,亦即 A-Z, a-z |
[:blank:] |
表明空白鍵與 [Tab] 按鍵二者 |
[:cntrl:] |
表明鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等 |
[:digit:] |
表明數字而已,亦即 0-9 |
[:graph:] |
除了空白字節 (空白鍵與 [Tab] 按鍵) 外的其餘全部按鍵 |
[:lower:] |
表明小寫字節,亦即 a-z |
[:print:] |
表明任何能夠被列印出來的字節 |
[:punct:] |
表明標點符號 (punctuation symbol),亦即:" ' ? ! ; : # $... |
[:upper:] |
表明大寫字節,亦即 A-Z |
[:space:] |
任何會產生空白的字節,包括空白鍵, [Tab], CR 等等 |
[:xdigit:] |
表明 16 進位的數字類型,所以包括: 0-9, A-F, a-f 的數字與字節 |
注意:之因此要使用特殊符號,是由於上面的[a-z]不是在全部狀況下都管用,這還與主機當前的語系有關,即設置在LANG環境變量的值,zh_CN.UTF-8的話[a-z],即爲全部小寫字母,其它語系多是大小寫交替的如,"a A b B...z Z",[a-z]中就可能包含大寫字母。因此在使用[a-z]時請確保當前語系的影響,使用[:lower:]則不會有這個問題。
# 排除字符
$ echo 'geek|good' | grep '[^o]'
注意:當^放到中括號內爲排除字符,不然表示行首。
使用擴展正則表達式,ERE
要經過grep使用擴展正則表達式須要加上-E參數,或使用egrep。
# 只匹配"zo"
$ echo 'zero\nzo\nzoo' | grep -E 'zo{1}'
# 匹配以"zo"開頭的全部單詞
$ echo 'zero\nzo\nzoo' | grep -E 'zo{1,}'
注意:推薦掌握{n,m}便可,+,?,*,這幾個不太直觀,且容易弄混淆。
# 匹配"www.shiyanlou.com"和"www.google.com"
$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -E 'www\.(shiyanlou|google)\.com'
# 或者匹配不包含"baidu"的內容
$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -Ev 'www\.baidu\.com'
注意:由於.號有特殊含義,因此須要轉義。
關於正則表達式和grep命令的內容就介紹這麼多,下面會介紹兩個更強大的工具sed和awk,但一樣也正是由於這兩個工具的強大,咱們的內容沒法包含它們的所有,這裏將只對基本內容做介紹。
3、sed 流編輯器
sed工具在 man 手冊裏面的全名爲"sed - stream editor for filtering and transforming text ",意即,用於過濾和轉換文本的流編輯器。
在 Linux/UNIX 的世界裏敢稱爲編輯器的工具,大都非等閒之輩,好比前面的"vi/vim(編輯器之神)","emacs(神的編輯器)","gedit"這些個編輯器。sed與上述的最大不一樣之處大於它是一個非交互式的編輯器,下面咱們就開始介紹sed這個編輯器。
sed經常使用參數介紹
sed 命令基本格式:
sed [參數]... [執行命令] [輸入文件]...
# 形如:
$ sed -i '1s/sad/happy/' test # 表示將test文件中第一行的"sad"替換爲"happy"
參數 |
說明 |
-n |
安靜模式,只打印受影響的行,默認打印輸入數據的所有內容 |
-e |
用於在腳本中添加多個執行命令一次執行,在命令行中執行多個命令一般不須要加該參數 |
-f filename |
指定執行filename文件中的命令 |
-r |
使用擴展正則表達式,默認爲標準正則表達式 |
-i |
將直接修改輸入文件內容,而不是打印到標準輸出設備 |
sed編輯器的執行命令(這裏」執行「解釋爲名詞)
sed執行命令格式:
[n1][,n2]command
[n1][~step]command
# 其中一些命令能夠在後面加上做用範圍,形如:
$ sed -i 's/sad/happy/g' test # g表示全局範圍
$ sed -i 's/sad/happy/4' test # 4表示指定行中的第四個匹配字符串
其中n1,n2表示輸入內容的行號,它們之間爲,逗號則表示從n1到n2行,若是爲~波浪號則表示從n1開始以step爲步進的全部行;command爲執行動做,下面爲一些經常使用動做指令:
命令 |
說明 |
s |
行內替換 |
c |
整行替換 |
a |
插入到指定行的後面 |
i |
插入到指定行的前面 |
p |
打印指定行,一般與-n參數配合使用 |
d |
刪除指定行 |
sed操做舉例
咱們先找一個用於練習的文本文件:
$ cp /etc/passwd ~
打印指定行
# 打印2-5行
$ nl passwd | sed -n '2,5p'
# 打印奇數行
$ nl passwd | sed -n '1~2p'
行內替換
# 將輸入文本中"shiyanlou" 全局替換爲"hehe",並只打印替換的那一行,注意這裏不能省略最後的"p"命令
$ sed -n 's/shiyanlou/hehe/gp' passwd
注意: 行內替換能夠結合正則表達式使用。
行間替換
$ nl passwd | grep "shiyanlou"
# 刪除第21行
$ sed -n '21c\www.shiyanlou.com' passwd
關於sed命令就介紹這麼多,你若是但願瞭解更多sed的高級用法,你能夠參看以下連接:
4、awk文本處理語言
看到上面的標題,你可能會感到驚異,難道咱們這裏要學習的是一門「語言」麼,確切的說,咱們是要在這裏學習awk文本處理語言,只是咱們並不會在這裏學習到比較完整的關於awk的內容,仍是由於前面的緣由,它太強大了,它的應用無處不在,咱們沒法在這裏以簡短的文字描述面面俱到,若是你有目標成爲一個linux系統管理員,確實想學好awk,你一不用擔憂,實驗樓會在以後陸續上線linux系統管理員的學習路徑,裏面會有單獨的關於正則表達式,awk,sed等相關課程,敬請期待吧。下面的內容,咱們就做爲一個關於awk的入門體驗章節吧,其中會介紹一些awk的經常使用操做。
1.awk介紹
AWK是一種優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一.其名稱得自於它的創始人Alfred Aho(阿爾佛雷德·艾侯)、Peter Jay Weinberger(彼得·溫伯格)和Brian Wilson Kernighan(布萊恩·柯林漢)姓氏的首個字母.AWK程序設計語言,三位建立者已將它正式定義爲「樣式掃描和處理語言」。它容許您建立簡短的程序,這些程序讀取輸入文件、爲數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其餘的功能。最簡單地說,AWK是一種用於處理文本的編程語言工具。
在大多數linux發行版上面,實際咱們使用的是gawk(GNU awk,awk的GNU版本),在咱們的環境中ubuntu上,默認提供的是mawk,不過咱們一般能夠直接使用awk命令(awk語言的解釋器),由於系統已經爲咱們建立好了awk指向mawk的符號連接。
$ ll /usr/bin/awk
nawk: 在 20 世紀 80 年代中期,對 awk語言進行了更新,並不一樣程度地使用一種稱爲 nawk(new awk) 的加強版本對其進行了替換。許多系統中仍然存在着舊的awk 解釋器,但一般將其安裝爲 oawk (old awk) 命令,而 nawk 解釋器則安裝爲主要的 awk 命令,也能夠使用 nawk 命令。Dr. Kernighan 仍然在對 nawk 進行維護,與 gawk 同樣,它也是開放源代碼的,而且能夠免費得到; gawk: 是 GNU Project 的awk解釋器的開放源代碼實現。儘管早期的 GAWK 發行版是舊的 AWK 的替代程序,但不斷地對其進行了更新,以包含 NAWK 的特性; mawk 也是awk編程語言的一種解釋器,mawk遵循 POSIX 1003.2 (草案 11.3)定義的 AWK 語言,包含了一些沒有在AWK 手冊中提到的特點,同時 mawk 提供一小部分擴展,另外聽說mawk是實現最快的awk
2.awk的一些基礎概念
awk全部的操做都是基於pattern(模式)—action(動做)對來完成的,以下面的形式:
$ pattern {action}
你能夠看到就如同不少編程語言同樣,它將全部的動做操做用一對{}花括號包圍起來。其中pattern一般是是表示用於匹配輸入的文本的「關係式」或「正則表達式」,action則是表示匹配後將執行的動做。在一個完整awk操做中,這二者能夠只有其中一個,若是沒有pattern則默認匹配輸入的所有文本,若是沒有action則默認爲打印匹配內容到屏幕。
awk處理文本的方式,是將文本分割成一些「字段」,而後再對這些字段進行處理,默認狀況下,awk以空格做爲一個字段的分割符,不過這不是固定了,你能夠任意指定分隔符,下面將告訴你如何作到這一點。
3.awk命令基本格式
awk [-F fs] [-v var=value] [-f prog-file | 'program text'] [file...]
其中-F參數用於預先指定前面提到的字段分隔符(還有其餘指定字段的方式) ,-v用於預先爲awk程序指定變量,-f參數用於指定awk命令要執行的程序文件,或者在不加-f參數的狀況下直接將程序語句放在這裏,最後爲awk須要處理的文本輸入,且能夠同時輸入多個文本文件。如今咱們仍是直接來具體體驗一下吧。
4.awk操做體驗
先用vim新建一個文本文檔
$ vim test
包含以下內容:
I like linux
www.shiyanlou.com
# "quote>" 不用輸入
$ awk '{
> }' test
# 或者寫到一行
$ awk '{print}' test
說明:在這個操做中我是省略了patter,因此awk會默認匹配輸入文本的所有內容,而後在"{}"花括號中執行動做,即print打印全部匹配項,這裏是所有文本內容
$ 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
說明:你首先應該注意的是,這裏我使用了awk語言的分支選擇語句if,它的使用和不少高級語言如C/C++語言基本一致,若是你有這些語言的基礎,這裏將很好理解。另外一個你須要注意的是NR與OFS,這兩個是awk內建的變量,NR表示當前讀入的記錄數,你能夠簡單的理解爲當前處理的行數,OFS表示輸出時的字段分隔符,默認爲" "空格,如上圖所見,咱們將字段分隔符設置爲\n換行符,因此第一行本來以空格爲字段分隔的內容就分別輸出到單獨一行了。而後是$N其中N爲相應的字段號,這也是awk的內建變量,它表示引用相應的字段,由於咱們這裏第一行只有三個字段,因此只引用到了$3。除此以外另外一個這裏沒有出現的$0,它表示引用當前記錄(當前行)的所有內容。
$ 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
說明:這裏的-F參數,前面已經介紹過,它是用來預先指定待處理記錄的字段分隔符。咱們須要注意的是除了指定OFS咱們還能夠在print 語句中直接打印特殊符號如這裏的\t,print打印的非變量內容都須要用""一對引號包圍起來。上面另外一個版本,展現了實現預先指定變量分隔符的另外一種方式,即便用BEGIN,就這個表達式指示了,其後的動做將在全部動做以前執行,這裏是FS賦值了新的"."點號代替默認的" "空格
注意:首先說明一點,咱們在學習和使用awk的時候應該儘量將其做爲一門程序語言來理解,這樣將會使你學習起來更容易,因此初學階段在練習awk時應該儘可能按照我那樣的方式分多行按照通常程序語言的換行和縮進來輸入,而不是所有寫到一行(固然這在你熟練了以後是沒有任何問題的)。
6.awk經常使用的內置變量
變量名 |
說明 |
FILENAME |
當前輸入文件名,如有多個文件,則只表示第一個。若是輸入是來自標準輸入,則爲空字符串 |
$0 |
當前記錄的內容 |
$N |
N表示字段號,最大值爲NF變量的值 |
FS |
字段分隔符,由正則表達式表示,默認爲" "空格 |
RS |
輸入記錄分隔符,默認爲"\n",即一行爲一個記錄 |
NF |
當前記錄字段數 |
NR |
已經讀入的記錄數 |
FNR |
當前輸入文件的記錄數,請注意它與NR的區別 |
OFS |
輸出字段分隔符,默認爲" "空格 |
ORS |
輸出記錄分隔符,默認爲"\n" |
關於awk的內容本課程將只會包含這些內容,若是你想了解更多,請期待後續課程,或者參看一下連接內容:
做業
一、練習其餘幾個命令動做的使用。
二、一個在線遊戲,固然咱們主要目的是學習,這個遊戲也是有寓教於樂的性質,讓你快速學會vim的基礎操做:
實驗十二
Linux 下軟件安裝
實驗介紹
介紹 Ubuntu 下軟件安裝的幾種方式,及 apt,dpkg 工具的使用。
1、Linux 上的軟件安裝
一般 Linux 上的軟件安裝主要有三種方式:
這幾種安裝方式各有優劣,而大多數軟件包會採用多種方式發佈軟件,因此咱們經常須要所有掌握這幾種軟件安裝方式,以便適應各類環境。下面將介紹前三種安裝方式,從源碼編譯安裝你將在 Linux 程序設計中學習到。
2、在線安裝
試想一下,平時咱們在使用 Windows 的時候,想要安裝一個軟件,咱們須要在網上去下載對應軟件的安裝包,接着安裝的時候就是不斷的去點擊下一步,這些流程想必你們已經經歷的無數回了,可是在 Linux 下,一個命令加回車,等待一下,軟件就安裝好了,這就是方便的在線安裝軟件的方式。在學習這種安裝方式以前有一點須要說明的是,在不一樣的linux發行版上面在線安裝方式會有一些差別包括使用的命令及它們的包管理工具,由於咱們的開發環境是基於ubuntu的,因此這裏咱們涉及的在線安裝方式將只適用於ubuntu發行版,或其它基於ubuntu的發行版如國內的ubuntukylin(優麒麟),ubuntu又是基於debian的發行版,它使用的是debian的包管理工具dpkg,因此一些操做也適用與debian。而在其它一些採用其它包管理工具的發行版如redhat,centos,fedora等將不適用(redhat和centos使用rpm)。
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 相關的軟件,而且有相關軟件的簡介。
關於在線安裝的的內容咱們就介紹這麼多,想了解更多關於APT的內容,你能夠參考:
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
dpkg還有一些其餘的參數,這裏將做爲練習題由你本身來學習
4、從二進制包安裝
二進制包的安裝比較簡單,咱們須要作的只是將從網絡上下載的二進制包解壓後放到合適的目錄,而後將包含可執行的主程序文件的目錄添加進PATH環境變量便可,若是你不知道該放到什麼位置,請從新複習第四節關於 Linux 目錄結構的內容。
做業
安裝:
$ sudo apt-get install bb
7、遇到的問題及解決
8、其餘
經過此次試驗,我對Linux有了基本的認識,學習到了不少新知識。由於實驗有點多,因此效率不是過高,而且沒有徹底消化,但願之後能夠提升效率,繼續深刻理解所學知識。