第二週(9.14-9.20):javascript
學習計時:共17小時css 實驗樓:6小時 讀書:1小時 代碼:3小時 做業:0小時 博客:7小時前端 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1、學習目標java |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. 可以獨立安裝Linux操做系統 node 2. 可以熟練使用Linux系統的基本命令 python 3. 熟練使用Linux中用戶管理命令/系統相關命令/文件目錄相關命令/打包壓縮相關命令/比較合併相關命令/網絡相關命令等linux 4. 熟練應用「搜索」進行觸類旁通的學習nginx |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2、學習資源git |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. 課程資料:https://www.shiyanlou.com/courses/413 實驗一正則表達式 2. Linux 基礎入門:https://www.shiyanlou.com/courses/1(重點,第一次課考覈內容所有從這裏面出) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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進行自動化 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
六、學習過程 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(提示:此處由學生填寫,學習過程,學習筆記,代碼編譯,運行結果,思考等) 1. 重要知識點總結梳理:(參考資料:實驗樓Linux基礎入門) (1)Linux終端與圖形界面切換 Linux 默認提供了 6 個純命令行界面的 「terminal」來讓用戶登陸,在物理機系統上你能夠經過使用 切換到其中一個終端後想要切換回圖形界面: (2)命令解析器 核:UNIX/Linux 內核 殼Shell:是指「提供給使用者使用界面」的軟件(命令解析器),隱藏了操做系統底層的細節。普通意義上的Shell 就是能夠接受用戶輸入命令的程序。 (3)快捷鍵 |
變量設置方式 |
說明 |
|
從頭向後開始匹配,刪除符合匹配字串的最短數據 |
|
從頭向後開始匹配,刪除符合匹配字串的最長數據 |
|
從尾向前開始匹配,刪除符合匹配字串的最短數據 |
|
從尾向前開始匹配,刪除符合匹配字串的最長數據 |
|
將符合舊字串的第一個字串替換爲新的字串 |
|
將符合舊字串的所有字串替換爲新的字串 |
好比要修改咱們前面添加到 PATH 的環境變量。爲了不操做失誤致使命令找不到,咱們先將 PATH 賦值給一個新的自定義變量 path:
$ path=
$PATH
$
echo
$path
$ path=
${path%/home/shiyanlou/mybin}
# 或使用通配符,*表示任意多個任意字符
$ path=
${path%*/mybin}
可使用unset
命令刪除一個環境變量:$
unset temp
(21)搜索文件
與搜索相關的命令經常使用的有以下幾個whereis,which,find,locate
-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
(22)「數字雨」
(23)文件打包和解壓縮
zip
壓縮打包程序$ zip -r -q -o shiyanlou.zip /home/shiyanlou
$ du -h shiyanlou.zip
$ file shiyanlou.zip
使用-e參數能夠建立加密壓縮包:
$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou
使用unzip命令解壓縮zip文件
將shiyanlou.zip解壓到當前目錄:$ unzip shiyanlou.zip
使用安靜模式,將文件解壓到指定目錄:
$ unzip -q shiyanlou.zip -d ziptest
(24)文件系統操做與管理
$ df
在實驗樓的環境中你將看到以下的輸出內容:
但在實際的物理主機上會更像這樣:
cowsay
命令,可讓你在終端裏以一種動物說話的形式打印出一段話。
# 安裝 $ sudo apt-get install cowsay # 默認是一隻牛 $ cowsay hello shiyanlou # 加上'-l'參數打印全部支持的動物(其實不僅是動物)種類 $ cowsay -l # 使用'-f'參數選擇動物種類 $ cowsay -f elephant hello shiyanlou # 此外它還能夠結合咱們以前的做業講過的 fortune 命令一塊兒使用 $ fortune | cowsay -f daemon
一般狀況下,咱們每次只能在終端輸入一條命令,按下回車執行,執行完成後,咱們再輸入第二條命令,而後再按回車執行…… 你可能會遇到以下使用場景:我須要使用apt-get
安裝一個軟件,而後安裝完成後當即運行安裝的軟件(或命令工具),又恰巧你的主機才更換的軟件源尚未更新軟件列表(好比以前咱們的環境中,每次從新開始實驗就得sudo apt-get update,如今已經沒有這個問題了),那麼你可能會有以下一系列操做:
$ sudo apt-get update # 等待——————————而後輸入下面的命令 $ sudo apt-get install some-tool # 等待——————————而後輸入下面的命令 $ some-tool
這時你可能就會想要是我能夠一次性輸入完,讓它本身去一次執行各命令就行了,這就是咱們這一小節要解決的問題。
簡單的順序執行你可使用;
來完成,好比上述操做你能夠:
$ sudo apt-get update;sudo apt-get install some-tool;some-tool # 讓它本身運行
關於上面的操做,不知你有沒有思考過一個問題,若是咱們在讓它自動順序執行命令時,前面的命令執行不成功,然後面的命令又依賴與上一條命令的結果,那麼就會形成花了時間,最終卻獲得一個錯誤的結果,並且有時候直觀的看你還沒法判斷結果是否正確。那麼咱們須要可以有選擇性的來執行命令,好比上一條命令執行成功才繼續下一條,或者不成功又該作出其它什麼處理,好比咱們使用which
來查找是否安裝某個命令,若是找到就執行該命令,不然什麼也不作(雖然這個操做沒有什麼實際意義,但可幫你更好的理解一些概念):
$ which cowsay>/dev/null && cowsay -f head-in ohch~
打印/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
這個命令前面咱們也是用過屢次,功能很簡單就是將輸入按照必定方式排序,而後再輸出,它支持的排序有按字典排序,數字排序,按月份排序,隨機排序,反轉排序,指定特定字段進行排序等等。
默認爲字典排序:
$ 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
tr 命令能夠用來刪除一段文本信息中的某些文字。或者將其進行轉換。
tr [option]...SET1 [SET2]
選項 | 說明 |
---|---|
-d |
刪除和set1匹配的字符,注意不是全詞匹配也不是按字符順序匹配 |
-s |
去除set1指定的在輸入文本中連續並重復的字符 |
# 刪除 "hello shiyanlou" 中全部的'o','l','h' $ echo 'hello shiyanlou' | tr -d 'olh' # 將"hello" 中的ll,去重爲一個l $ echo 'hello' | tr -s 'l' # 將輸入文本,所有轉換爲大寫或小寫輸出 $ cat /etc/passwd | tr '[:lower:]' '[:upper:]' # 上面的'[:lower:]' '[:upper:]'你也能夠簡單的寫做'[a-z]' '[A-Z]',固然反過來將大寫變小寫也是能夠的
更多 tr 的使用,你可使用--help
或者man tr
得到。
col 命令能夠將Tab
換成對等數量的空格建,或反轉這個操做。
col [option]
選項 | 說明 |
---|---|
-x |
將Tab 轉換爲空格 |
-h |
將空格轉換爲Tab (默認選項) |
# 查看 /etc/protocols 中的不可見字符,能夠看到不少 ^I ,這其實就是 Tab 轉義成可見字符的符號 $ cat -A /etc/protocols # 使用 col -x 將 /etc/protocols 中的 Tab 轉換爲空格,而後再使用 cat 查看,你發現 ^I 不見了 $ cat /etc/protocols | col -x | cat -A
學過數據庫的用戶對這個應該不會陌生,這個命令就是用於將兩個文件中包含相同內容的那一行合併在一塊兒。
join [option]... file1 file2
選項 | 說明 |
---|---|
-t |
指定分隔符,默認爲空格 |
-i |
忽略大小寫的差別 |
-1 |
指明第一個文件要用哪一個字段來對比,,默認對比第一個字段 |
-2 |
指明第二個文件要用哪一個字段來對比,,默認對比第一個字段 |
# 建立兩個文件 $ echo '1 hello' > file1 $ echo '1 shiyanlou' > file2 $ join file1 file2 # 將/etc/passwd與/etc/shadow兩個文件合併,指定以':'做爲分隔符 $ sudo join -t':' /etc/passwd /etc/shadow # 將/etc/passwd與/etc/group兩個文件合併,指定以':'做爲分隔符, 分別比對第4和第3個字段 $ sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group
paste
這個命令與join
命令相似,它是在不對比數據的狀況下,簡單地將多個文件合併一塊兒,以Tab
隔開。
paste [option] file...
選項 | 說明 |
---|---|
-d |
指定合併的分隔符,默認爲Tab |
-s |
不合併到一行,每一個文件爲一行 |
$ echo hello > file1 $ echo shiyanlou > file2 $ echo www.shiyanlou.com > file3 $ paste -d ':' file1 file2 file3 $ paste -s file1 file2 file3
下面咱們簡單的回顧一下咱們前面常常用到的兩個重定向操做:
$ echo 'hello shiyanlou' > redirect $ echo 'www.shiyanlou.com' >> redirect $ cat redirect
固然前面沒有用到的
<
和<<
操做也是沒有問題的,如你理解的同樣,它們的區別在於重定向的方向不一致而已,>
表示是從左到右,<
右到左。
在更多瞭解 Linux 的重定向以前,咱們須要先知道一些基本的東西,前面咱們已經提到過 Linux 默認提供了三個特殊設備,用於終端的顯示和輸出,分別爲stdin
(標準輸入,對應於你在終端的輸入),stdout
(標準輸出,對應於終端的輸出),stderr
(標準錯誤輸出,對應於終端的輸出)。
文件描述符 | 設備文件 | 說明 |
---|---|---|
0 |
/dev/stdin |
標準輸入 |
1 |
/dev/stdout |
標準輸出 |
2 |
/dev/stderr |
標準錯誤 |
文件描述符:文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核爲每個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者建立一個新文件時,內核向進程返回一個文件描述符。在程序設計中,一些涉及底層的程序編寫每每會圍繞着文件描述符展開。可是文件描述符這一律念每每只適用於 UNIX、Linux 這樣的操做系統。
另外還有一個符號-
,它能夠同時做爲前一個命令的。
咱們能夠這樣使用這些文件描述符:
默認使用終端的標準輸入做爲命令的輸入和標準輸出做爲命令的輸出
$ cat (按Ctrl+C退出)
將cat的連續輸出(heredoc方式)重定向到一個文件
$ mkdir Documents
$ cat > Documents/test.c\~ <<EOF
#include <stdio.h> int main() { printf("hello world\n"); return 0; } EOF
將一個文件做爲命令的輸入,標準輸出做爲命令的輸出
$ cat Documents/test.c\~
將echo命令經過管道傳過來的數據做爲cat命令的輸入,將標準輸出做爲命令的輸出
$ echo 'hi' | cat
將echo命令的輸出從默認的標準輸出重定向到一個普通文件
$ echo 'hello shiyanlou' > redirect $ cat redirect
初學者這裏要注意不要將管道和重定向混淆,管道默認是鏈接前一個命令的輸出到下一個命令的輸入,而重定向一般是須要一個文件來創建兩個命令的鏈接,你能夠仔細體會一下上述第三個操做和最後兩個操做的異同點。
重定向標準輸出到文件,這是一個很實用的操做,另外一個很實用的操做是將標準錯誤重定向,標準輸出和標準錯誤都被指向僞終端的屏幕顯示,因此咱們常常看到的一個命令的輸出一般是同時包含了標準輸出和標準錯誤的結果的。好比下面的操做:
# 使用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的文件中
tee
命令同時重定向到多個文件常常你可能還有這樣的需求,除了將須要將輸出重定向到文件以外也須要將信息打印在終端,那麼你可使用tee
命令來實現:
$ echo 'hello shiyanlou' | tee hello
你應該能夠看出咱們前面的重定向操做都只是臨時性的,即只對當前命令有效,那如何作到「永久」有效呢,好比在一個腳本中,你須要某一部分的命令的輸出所有進行重定向,難道要讓你在每一個命令上面加上臨時重定向的操做嘛,固然不須要,咱們可使用exec
命令實現「永久」重定向。exec
命令的做用是使用指定的命令替換當前的 Shell,及使用一個進程替換當前進程,或者指定新的重定向:
# 先開啓一個子 Shell $ zsh # 使用exec替換當前進程的重定向,將標準輸出重定向到一個文件 $ exec 1>somefile # 後面你執行的命令的輸出都將被重定向到文件中,直到你退出當前子shell,或取消exec的重定向(後面將告訴你怎麼作) $ ls $ exit $ cat somefile
默認在 Shell 中能夠有9個打開的文件描述符,上面咱們使用了也是它默認提供的0
,1
,2
號文件描述符,另外咱們還可使用3-8的文件描述符,只是它們默認沒有打開而已,你可使用下面命令查看當前 Shell 進程中打開的文件描述符:
$ cd /dev/fd/;ls -Al
一樣使用exec
命令能夠建立新的文件描述符:
$ zsh $ exec 3>somefile # 先進入目錄,再查看,不然你可能不能獲得正確的結果,而後再回到上一次的目錄 $ cd /dev/fd/;ls -Al;cd - # 注意下面的命令>與&之間不該該有空格,若是有空格則會出錯 $ echo "this is test" >&3 $ cat somefile $ exit
如上面咱們打開的3號文件描述符,可使用以下操做將它關閉:
$ exec 3>&- $ cd /dev/fd;ls -Al;cd -
在 Linux 中有一個被成爲「黑洞」的設備文件,因此導入它的數據都將被「吞噬」。
在類 UNIX 系統中,/dev/null,或稱空設備,是一個特殊的設備文件,它一般被用於丟棄不須要的輸出流,或做爲用於輸入流的空文件,這些操做一般由重定向完成。讀取它則會當即獲得一個EOF。
咱們能夠利用設個/dev/null
屏蔽命令的輸出:
$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1
向上面這樣的操做將使你得不到任何輸出結果。
xargs 是一條 UNIX 和類 UNIX 操做系統的經常使用命令。它的做用是將參數列表轉換成小塊分段傳遞給其餘命令,以免參數列表過長的問題。
這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 find,locate 和 grep 的結果,詳細用法請參看 man 文檔。
$ cut -d: -f1 < /etc/passwd | sort | xargs echo
上面這個命令用於將/etc/passwd
文件按:
分割取第一個字段排序後,使用echo
命令生成一個列表。
正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫爲 regex、regexp 或 RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。
許多程序設計語言都支持利用正則表達式進行字符串操做。例如,在 Perl 中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由 UNIX 中的工具軟件(例如
sed
和grep
)普及開的。正則表達式一般縮寫成「regex」,單數有 regexp、regex,複數有 regexps、regexes、regexen。
一個正則表達式一般被稱爲一個模式(pattern),爲用來描述或者匹配一系列符合某個句法規則的字符串。
|
豎直分隔符表示選擇,例如"boy|girl"能夠匹配"boy"或者"girl"
數量限定除了咱們舉例用的*
,還有+
加號,?
問號,.
點號,若是在一個模式中不加數量限定符則表示出現一次且僅出現一次:
+
表示前面的字符必須出現至少一次(1次或屢次),例如,"goo+gle",能夠匹配"gooogle","goooogle"等;?
表示前面的字符最多出現一次(0次或1次),例如,"colou?r",能夠匹配"color"或者"colour";*
星號表明前面的字符能夠不出現,也能夠出現一次或者屢次(0次、或1次、或屢次),例如,「0*42」能夠匹配4二、04二、004二、00042等。()
圓括號能夠用來定義模式字符串的範圍和優先級,這能夠簡單的理解爲是否將括號內的模式串做爲一個總體。例如,"gr(a|e)y"等價於"gray|grey",(這裏體現了優先級,豎直分隔符用於選擇a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(這裏體驗了範圍,?
將圓括號內容做爲一個總體匹配)。
正則表達式有多種不一樣的風格,下面列舉一些經常使用的做爲 PCRE 子集的適用於perl
和python
編程語言及grep
或egrep
的正則表達式匹配規則:(因爲markdown表格解析的問題,下面的豎直分隔符用全角字符代替,實際使用時請換回半角字符)
PCRE(Perl Compatible Regular Expressions中文含義:perl語言兼容正則表達式)是一個用 C 語言編寫的正則表達式函數庫,由菲利普.海澤(Philip Hazel)編寫。PCRE是一個輕量級的函數庫,比Boost 之類的正則表達式庫小得多。PCRE 十分易用,同時功能也很強大,性能超過了 POSIX 正則表達式庫和一些經典的正則表達式庫。
字符 | 描述 |
---|---|
\ | 將下一個字符標記爲一個特殊字符、或一個原義字符。例如,「n」匹配字符「n」。「\n」匹配一個換行符。序列「\\」匹配「\」而「\(」則匹配「(」。 |
^ | 匹配輸入字符串的開始位置。 |
$ | 匹配輸入字符串的結束位置。 |
{n} | n是一個非負整數。匹配肯定的n次。例如,「o{2}」不能匹配「Bob」中的「o」,可是能匹配「food」中的兩個o。 |
{n,} | n是一個非負整數。至少匹配n次。例如,「o{2,}」不能匹配「Bob」中的「o」,但能匹配「foooood」中的全部o。「o{1,}」等價於「o+」。「o{0,}」則等價於「o*」。 |
{n,m} | m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,「o{1,3}」將匹配「fooooood」中的前三個o。「o{0,1}」等價於「o?」。請注意在逗號和兩個數之間不能有空格。 |
* | 匹配前面的子表達式零次或屢次。例如,zo*能匹配「z」、「zo」以及「zoo」。*等價於{0,}。 |
+ | 匹配前面的子表達式一次或屢次。例如,「zo+」能匹配「zo」以及「zoo」,但不能匹配「z」。+等價於{1,}。 |
? | 匹配前面的子表達式零次或一次。例如,「do(es)?」能夠匹配「do」或「does」中的「do」。?等價於{0,1}。 |
? | 當該字符緊跟在任何一個其餘限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘量少的匹配所搜索的字符串,而默認的貪婪模式則儘量多的匹配所搜索的字符串。例如,對於字符串「oooo」,「o+?」將匹配單個「o」,而「o+」將匹配全部「o」。 |
. | 匹配除「\n」以外的任何單個字符。要匹配包括「\n」在內的任何字符,請使用像「(.|\n)」的模式。 |
(pattern) | 匹配pattern並獲取這一匹配的子字符串。該子字符串用於向後引用。要匹配圓括號字符,請使用「\(」或「\)」。 |
x|y | 匹配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} | 限定符 |
^、$、\任何元字符 | 定位點和序列 |
| | 選擇 |
上面空談了那麼多正則表達式的內容也並無說起具體該如何使用它,實在枯燥,若是說正則表達式是一門武功話,那它也只能算得上一些口訣招式罷了,要把它真正練起來還得須要一些兵器在手才行,這裏咱們要介紹的grep
命令以及後面要講的sed
,awk
這些就該算做是這樣的兵器了。
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 |
將輸出中的匹配項設置爲自動顏色顯示 |
查找/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]'
注意:當
^
放到中括號內爲排除字符,不然表示行首。
要經過grep
使用擴展正則表達式須要加上-E
參數,或使用egrep
。
# 只匹配"zo" $ echo 'zero\nzo\nzoo' | grep -E 'zo{1}' # 匹配以"zo"開頭的全部單詞 $ echo 'zero\nzo\nzoo' | grep -E 'zo{1,}'
# 匹配"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'
試想一下,平時咱們在使用 Windows 的時候,想要安裝一個軟件,咱們須要在網上去下載對應軟件的安裝包,接着安裝的時候就是不斷的去點擊下一步,這些流程想必你們已經經歷的無數回了,可是在 Linux 下,一個命令加回車,等待一下,軟件就安裝好了,這就是方便的在線安裝軟件的方式。在學習這種安裝方式以前有一點須要說明的是,在不一樣的linux發行版上面在線安裝方式會有一些差別包括使用的命令及它們的包管理工具,由於咱們的開發環境是基於ubuntu的,因此這裏咱們涉及的在線安裝方式將只適用於ubuntu發行版,或其它基於ubuntu的發行版如國內的ubuntukylin(優麒麟),ubuntu又是基於debian的發行版,它使用的是debian的包管理工具dpkg,因此一些操做也適用與debian。而在其它一些採用其它包管理工具的發行版如redhat,centos,fedora等將不適用(redhat和centos使用rpm)。
好比咱們想安裝一個軟件,名字叫作 w3m
(w3m是一個命令行的簡易網頁瀏覽器),那麼輸入以下命令:
$ sudo apt-get install w3m
這樣的操做你應該在前面的章節中看到過不少次了,它就表示將會安裝一個軟件包名爲w3m
的軟件
執行後的效果:
$ w3m www.shiyanlou.com/faq
注意:若是你在安裝一個軟件以後,沒法當即使用Tab
鍵補全這可命令,你能夠嘗試先執行source ~/.zshrc
,而後你就可使用補全操做。
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
能正常的工做。
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給出的建議安裝的軟件包 |
關於安裝,如前面演示的同樣你只須要執行apt-get install <軟件包名>
便可,除了這一點,你還應該掌握的是如何從新安裝軟件包。 不少時候咱們須要從新安裝一個軟件包,好比你的系統被破壞,或者一些錯誤的配置致使軟件沒法正常工做。
你可使用以下方式從新安裝:
$ sudo apt-get --reinstall install w3m
另外一個你須要掌握的是,如何在不知道軟件包完整名的時候進行安裝。一般咱們是使用Tab
鍵補全軟件包名,後面會介紹更好的方法來搜索軟件包。有時候你須要同時安裝多個軟件包,你還可使用正則表達式匹配軟件包名進行批量安裝。
# 更新軟件源 $ sudo apt-get update # 升級沒有依賴問題的軟件包 $ sudo apt-get upgrade # 升級並解決依賴關係 $ sudo apt-get dist-upgrade
# 不保留配置文件的移除 $ sudo apt-get purge w3m # 或者 sudo apt-get --purge remove # 移除再也不須要的被依賴的軟件包 $ sudo apt-get autoremove
當本身剛知道了一個軟件,想下載使用,須要確認軟件倉庫裏面有沒有,就須要用到搜索功能了,命令以下:
sudo apt-cache search softname1 softname2 softname3……
apt-cache
命令則是針對本地數據進行相關操做的工具,search
顧名思義在本地的數據庫中尋找有關 softname1
softname2
…… 相關軟件的信息。
7、遇到的問題及解決
(提示:此處由學生填寫,是重要的得分點,要寫出遇到的問題和解決方案以及對出現問題的思考)
1.
嘗試了不少次,多是自己的問題,惟一成功的是man 1 ls:
2.不會使用toilet、filget
百度以後詳見學習過程(5)
3.建立用戶名輸入密碼沒有反應?
自己的設計就是不回顯的
4.
沒有跳到shiyanlou:~/
5.
cd後面必定要有空格再加「~」或「..」
6. 使用wq沒法退出
不知道如何解決?
8、其餘
(提示:此處由學生填寫,靈感,領悟等)