學習計時:共24小時html
讀書:1小時前端
代碼:8小時node
做業:3小時python
博客:12小時linux
1、學習目標git
2、學習資源正則表達式
1. 課程資料:https://www.shiyanlou.com/courses/413 實驗一,課程邀請碼:W7FQKW4Yshell
2. Linux 基礎入門:https://www.shiyanlou.com/courses/1(重點,第一次課考覈內容所有從這裏面出)數據庫
3、學習方法
1. 進度很重要:必須跟上每週的進度,閱讀,練習,問答,項目。我會認真對待每一位同窗,請你不要由於困難半途而廢。
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. 測試示例:
五、後續學習預告(可選):
六、學習過程
1. 重要知識點總結梳理:
1.操做系統:是系統調用和內核那兩層,固然直觀的來看,咱們使用的操做系統還包含一些在其上運行的應用程序,好比文本編輯器,瀏覽器,電子郵件。
2.最初的操做系統當時的操做系統能運行批處理程序。批處理程序不須要用戶的交互,它從文件或者穿孔卡片讀取數據,而後輸出到另一個文件或者打印機。
二十世紀六十年代初,交互式操做系統開始流行。它不只僅能夠交互,還能使多個用戶從不一樣的終端同時操做主機。這樣的操做系統被稱做分時操做系統。
3.Linux 系統還提供了一個叫作終端模擬器的程序(Terminal),下面幾個比較常見的終端模擬器,例如 gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm,
4.Unix/Linux 操做系統下的 Shell 既是用戶交互的界面,也是控制系統的腳本語言。在 UNIX/Linux 中比較流行的常見的 Shell 有 bash,zsh,ksh,csh 等等,Ubuntu 終端默認使用的是 bash,默認的桌面環境是 GNOME 或者 Unity(基於 GNOME),但咱們的環境中使用的分別是zsh 和 xfce。
5.1).重要快捷鍵:
真正學習命令行以前,你先要掌握幾個十分有用,必需掌握的小技巧:
使用Tab
鍵來進行命令補全,Tab
鍵通常鍵盤是在字母Q
旁邊,這個技巧給你帶來的最大的好處就是當你忘記某個命令的全稱時你能夠只輸入它的開頭的一部分而後按下Tab
鍵就能夠獲得提示或者幫助完成:
[Ctrl+c]
你就可使用Ctrl+c
鍵來強行終止當前程序(你能夠放心它並不會使終端退出)。
其餘一些經常使用快捷鍵
按鍵 做用
Ctrl+d 鍵盤輸入結束或退出終端
Ctrl+s 暫停當前程序,暫停後按下任意鍵恢復運行
Ctrl+z 將當前程序放到後臺運行,恢復到前臺爲命令fg
Ctrl+a 將光標移至輸入行頭,至關於Home鍵
Ctrl+e 將光標移至輸入行末,至關於End鍵
Ctrl+k 刪除從光標所在位置到行末
Alt+Backspace 向前刪除一個單詞
Shift+PgUp 將終端顯示向上滾動
Shift+PgDn 將終端顯示向下滾動
你可使用鍵盤上的方向上
鍵,恢復你以前輸入過的命令。
通配符是一種特殊語句,主要有星號(*)和問號(?),用來對對字符串進行模糊匹配(好比文件名,參數名)。當查找文件夾時,可使用它來代替一個或多個真正字符;當不知道真正字符或者懶得輸入完整名字時,經常使用通配符代替一個或多個真正的字符。
創建多個文件的快捷方式
Shell 經常使用通配符:
字符 含義
* 匹配 0 或多個字符
? 匹配任意一個字符
[list] 匹配 list 中的任意單一字符
[!list] 匹配 除list 中的任意單一字符之外的字符
[c1-c2] 匹配 c1-c2 中的任意單一字符 如:[0-9] [a-z]
{string1,string2,...} 匹配 sring1 或 string2 (或更多)其一字符串
{c2..c2} 匹配 c1-c2 中所有字符 如{1..10}
在 Linux 環境中,若是你遇到困難,可使用man
命令,它是Manual page
的縮寫。得到某個命令的說明和使用方式的詳細介紹:
通常狀況下,man 手冊裏面的內容都是英文的,這就要求你有必定的英文基礎。man 手冊的內容不少,涉及了 Linux 使用過程當中的方方面面,爲了便於查找,是作了分冊(分區段)處理的,在Research UNIX、BSD、OS X 和 Linux 中,手冊一般被分爲8個區段,安排以下:
區段 說明
1 通常命令
2 系統調用
3 庫函數,涵蓋了C標準函數庫
4 特殊文件(一般是/dev中的設備)和驅動程序
5 文件格式和約定
6 遊戲和屏保
7 雜項
8 系統管理命令和守護進程
要查看相應區段的內容,就在 man 後面加上相應區段的數字便可,如:
一般 man 手冊中的內容不少,你可能不太容易找到你想要的結果,不過幸運的是你能夠在 man 中使用搜索,/<你要搜索的關鍵字>
,查找到後你可使用n
鍵切換到下一個關鍵字所在處,shift+n
爲上一個關鍵字所在處。使用Space
(空格鍵)翻頁,Enter
(回車鍵)向下滾動一行,或者使用j
,k
(vim編輯器的移動鍵)進行向前向後滾動一行。按下h
鍵爲顯示使用幫助(由於man使用less做爲閱讀器,實爲less
工具的幫助),按下q
退出。
想要得到更詳細的幫助,你還可使用info
命令,不過一般使用man
就足夠了。若是你知道某個命令的做用,只是想快速查看一些它的某個具體參數的做用,那麼你可使用--help
參數,大部分命令都會帶有這個參數,如:
ls --help
6.輸入的who am i表示打開當前僞終端的用戶的用戶名(要查看當前登陸用戶的用戶名,去掉空格直接使用 whoami
便可)
7.who 命令其它經常使用參數
參數 說明
-a 打印能打印的所有
-d 打印死掉的進程
-m 同am i,mom likes
-q 打印當前登陸用戶數及用戶名
-u 打印當前登陸用戶登陸信息
-r 打印運行等級
8.在 Linux 系統裏, root
帳戶擁有整個系統至高無上的權利,好比 新建/添加 用戶。要建立用戶須要 root 權限,這裏就要用到 sudo
這個命令了。不過使用這個命令有兩個大前提,一是你要知道當前登陸用戶的密碼,二是當前用戶必須在 sudo
用戶組。
建立新用戶lilei,退出當前用戶跟退出終端同樣可使用 exit
命令或者使用快捷鍵 Ctrl+d
。
登錄新用戶lilei
退出當前用戶lilei
9.
在 Linux 裏面知道本身屬於哪些用戶組的方法
方法一:使用groups命令
$ groups shiyanlou
其中冒號以前表示用戶,後面表示該用戶所屬的用戶組。這裏能夠看到 shiyanlou 用戶同時屬於 shiyanlou用戶組,每次新建用戶若是不指定用戶組的話,默認會自動建立一個與用戶名相同的用戶組(差很少就至關於家長的意思,或者說是老總)。默認狀況下在sudo用戶組裏的可使用sudo命令得到root權限。
方法二:查看/etc/group文件
$ cat /etc/group | sort
提示 lilei 不在 sudoers 文件中,意思就是 lilei 不在 sudo 用戶組中
使用 usermod 命令能夠爲用戶添加用戶組,一樣使用該命令你必需有 root 權限,你能夠直接使用 root 用戶爲其它用戶添加用戶組,或者用其它已經在 sudo 用戶組的用戶使用 sudo 命令獲取權限來執行該命令
這裏我用 shiyanlou 用戶執行 sudo 命令將 lilei 添加到 sudo 用戶組,讓它也可使用 sudo 命令得到 root 權限
$ su shiyanlou
$ groups lilei
$ sudo usermod -G sudo lilei
$ groups lilei
而後你再切換會 lilei 用戶,如今就可使用 sudo 獲取 root 權限了。
刪除用戶:
10.查看文件權限
•文件類型
關於文件類型,這裏有一點你必需時刻牢記Linux 裏面一切皆文件,正由於這一點纔有了設備文件( /dev 目錄下有各類設備文件,大都跟具體的硬件設備相關)這一說,還有 socket(網絡套接字,具體是什麼,感興趣的用戶能夠本身去了解或期待實驗樓的後續相關課程),和 pipe (管道,這個東西很重要,咱們之後將會討論到,這裏你先知道有它的存在便可)。軟連接文件,連接文件是分爲兩種的,另外一種固然是「硬連接」(硬連接不經常使用,具體內容不做爲本課程討論重點,而軟連接等同於Windows 上的快捷方式,你記住這一點就夠了)
•文件權限
讀權限,表示你可使用 cat <file name> 之類的命令來讀取某個文件的內容;寫權限,表示你能夠編輯和修改某個文件; 執行權限,一般指能夠運行的二進制程序文件或者腳本文件,如同 Windows 上的 'exe' 後綴的文件,不過 Linux 上不是經過文件後綴名來區分文件的類型。你須要注意的一點是,一個目錄要同時具備讀權限和執行權限才能夠打開,而一個目錄要有寫權限才容許在其中建立其它文件,這是由於目錄文件實際保存着該目錄裏面的文件的列表等信息
全部者權限,這一點相信你應該明白了,至於所屬用戶組權限,是指你所在的用戶組中的全部其它用戶對於該文件的權限,好比,你有一個艾派德,那麼這個用戶組權限就決定了你的兄弟姐妹有沒有權限使用它破壞它和佔有它。
•連接數
連接到該文件所在的 inode 結點的文件名數目(關於這個概念涉及到 Linux 文件系統的相關概念知識,不在本課程的討論範圍,感興趣的用戶能夠本身去了解)。
•文件大小
以 inode 結點大小爲單位來表示的文件大小,你能夠給 ls 加上 -lh 參數來更直觀的查看文件的大小。
ls的其餘命令
顯示除了 '.'(當前目錄),'..' 上一級目錄以外的全部包含隱藏文件(Linux 下以 '.' 開頭的文件爲隱藏文件)
$ ls -A
查看某一個目錄的完整屬性,而不是顯示目錄裏面的文件屬性:
$ ls -Al
顯示全部文件大小,並以普通人類能看懂的方式呈現:
$ ls -dl <目錄名>
其中小 s 爲顯示文件大小,大 S 爲按文件大小排序,若須要知道如何按其它方式排序,請使用「man」命令查詢。
$ ls -AsSh
11.變動文件全部者
文件music的全部者是用戶lilei,將其擁有者修改成shiyanlou
12.修改文件權限
•方式一:二進制數字表示
每一個文件的三組權限(擁有者,所屬用戶組,其餘用戶,記住這個順序是必定的)就對應這一個 "rwx",也就是一個 '7' 。
•方式二:加減賦值操做
13.
FHS 定義了兩層規範,第一層是, / 下面的各個目錄應該要放什麼文件數據,例如 /etc 應該要放置設置文件,/bin 與 /sbin 則應該要放置可執行文件等等。
第二層則是針對 /usr 及 /var 這兩個目錄的子目錄來定義。例如 /var/log 放置系統登陸文件、/usr/share 放置共享數據等等。
使用 cd 命令能夠切換目錄,在 Linux 裏面使用 . 表示當前目錄,.. 表示上一級目錄(**注意,還記得咱們上一節介紹過的,以 . 開頭的文件都是隱藏文件,因此這兩個目錄必然也是隱藏的,你可使用 ls -a 命令查看隱藏文件), - 表示上一次所在目錄,~ 一般表示當前用戶的"home"目錄。使用 pwd 命令能夠獲取當前所在路徑(絕對路徑)。
進入上一級目錄:
$ cd ..
進入你的「home」目錄:
$ cd ~
# 或者 cd /home/<你的用戶名>
使用 pwd 獲取當前路徑:
$ pwd
絕對路徑
關於絕對路徑,簡單地說就是以根"/"目錄爲起點的完整路徑,以你所要到的目錄爲終點,表現形式如: /usr/local/bin,表示根目錄下的 usr 目錄中的 local 目錄中的 bin 目錄。
相對路徑
相對路徑,也就是相對於你當前的目錄的路徑,相對路徑是以當前目錄 . 爲起點,以你所要到的目錄爲終點,表現形式如: usr/local/bin (這裏假設你當前目錄爲根目錄)。
提示:在進行目錄切換的過程當中請多使用 Tab 鍵自動補全,可避免輸入錯誤,連續按兩次Tab能夠顯示所有候選結果
1.新建
新建空白文件
使用 touch 命令建立空白文件,建立名爲 test 的空白文件,由於在其餘目錄沒有權限,因此須要先 cd ~ 切換回用戶的 /home/shiyanlou 目錄:
$ cd ~
$ touch test
新建目錄
使用 mkdir(make directories)命令能夠建立一個空目錄,也可同時指定建立目錄的權限屬性
建立名爲"mydir"的空目錄:
$ mkdir mydir
使用 -p 參數,同時建立父目錄(若是不存在該父目錄),以下咱們同時建立一個多級目錄(這在有時候安裝軟件,配置安裝路徑時很是有用):
$ mkdir -p father/son/grandson
2.複製
複製文件
使用cp(copy)命令複製一個文件或目錄到指定目錄。將以前建立的"test"文件複製到"/home/shiyanlou/father/son/grandson"目錄中:
$ cp test father/son/grandson
複製目錄
要成功複製目錄須要加上-r或者-R參數,表示遞歸複製,就是說有點「株連九族」的意思:
$ cp -r father family
3.刪除
刪除文件
使用rm(remove files or directories)命令,刪除一個文件或目錄:
$ rm test
你若是想忽略這提示,直接刪除文件,可使用-f參數強制刪除:
$ rm -f test
刪除目錄
跟複製目錄同樣,要刪除一個目錄,也須要加上-r或-R參數:
$ rm -r family
4.移動文件與文件重命名
移動文件
使用mv(move or rename files)命令,移動文件(剪切)。將文件"file1"移動到"Documents"目錄mv 源目錄文件 目的目錄:
$ mv file1 Documents
重命名文件
將文件"file1"重命名爲"myfile" mv 舊的文件名 新的文件名:
$ mv file1 myfile
5.查看文件
使用cat,tac和nl命令查看文件
這兩個命令都是用來打印文件內容到標準輸出(終端),其中cat爲正序顯示,tac倒序顯示。
nl命令,添加行號並打印,這是個比cat -n更專業的行號打印命令。
這裏簡單列舉它的經常使用的幾個參數:
-b : 指定添加行號的方式,主要有兩種:
-b a:表示不管是否爲空行,一樣列出行號("cat -n"就是這種方式)
-b t:只列出非空行的編號並列出(默認爲這種方式)
-n : 設置行號的樣式,主要有三種:
-n ln:在行號字段最左端顯示
-n rn:在行號字段最右邊顯示,且不加 0
-n rz:在行號字段最右邊顯示,且加 0
-w : 行號字段佔用的位數(默認爲 6 位)
使用more工具打開passwd文件:
$ more passwd
這裏想到系統新增長一個用戶,應該會將用戶的信息添加到passwd文件的最後,那麼這時候咱們就可使用tail命令了:
$ tail /etc/passwd
甚至更直接的只看一行, 加上-n參數,後面緊跟行數:
$ tail -n 1 /etc/passwd
6.查看文件類型
前面我提到過,在 Linux 下面文件的類型不是根據文件後綴來判斷的,咱們一般使用file命令能夠查看文件的類型:
$ file /bin/ls
7.編輯文件
$ vimtutor
15.
1、環境變量
1.變量
變量的做用域即變量的有效範圍(好比一個函數中、一個源文件中或者全局範圍),在該範圍內只能有一個同名變量。一旦離開則該變量無效,如同不存在這個變量通常。
使用=號賦值運算符爲變量 tmp 賦值爲 shiyanlou:
$ tmp=shiyanlou
讀取變量的值,使用echo命令和$符號($符號用於表示引用一個變量的值,初學者常常會忘記輸入):
$ echo $tmp
2.環境變量
簡單理解了變量的概念,就很好解釋環境變量了,環境變量就是做用域比自定義變量要大,如Shell 的環境變量做用於自身和它的子進程。
一般咱們會涉及到的環境變量有三種:
•當前 Shell 進程私有用戶自定義變量,如上面咱們建立的 temp 變量,只在當前 Shell 中有效。
•Shell 自己內建的變量。
•從自定義變量導出的環境變量。
也有三個與上述三種環境變量相關的命令,set,env,export。
命令 說明
set 顯示當前 Shell 全部環境變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量
env 顯示與當前用戶相關的環境變量,還可讓命令在指定環境中運行
export 顯示從 Shell 中導出成環境變量的變量,也能經過它將自定義變量導出爲環境變量
3.命令的查找路徑與順序
咱們在 Shell 中輸入一個命令,Shell 是怎麼知道在哪去找到這個命令而後執行的呢?這是經過環境變量PATH來進行搜索的,這個PATH裏面就保存了Shell中執行的命令的搜索路徑。
查看PATH環境變量的內容:
$ echo $PATH
一般這一類目錄下放的都是可執行文件,當咱們在 Shell 中執行一個命令時,系統就會按照 PATH 中設定的路徑按照順序依次到目錄中去查找,若是存在同名的命令,則執行先找到的那個。
建立一個 Shell 腳本文件:
$ vim hello_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
4.添加自定義路徑到「PATH」環境變量
在前面咱們應該注意到PATH裏面的路徑是以:做爲分割符,因此咱們能夠這樣添加自定義路徑:
$ PATH=$PATH:/home/shiyanlou/mybin
注意這裏必定要使用絕對路徑
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中>>表示將標準輸出以追加的方式重定向到一個文件中,注意前面用到的>是以覆蓋的方式重定向到一個文件中,使用的時候必定要注意分辨。在指定文件不存在的狀況下都會建立新的文件。
5.修改和刪除已有變量
變量修改
變量的修改有如下幾種方式:
變量設置方式 說明
${變量名#匹配字串} 從頭向後開始匹配,刪除符合匹配字串的最短數據
${變量名##匹配字串} 從頭向後開始匹配,刪除符合匹配字串的最長數據
${變量名%匹配字串} 從尾向前開始匹配,刪除符合匹配字串的最短數據
${變量名%%匹配字串} 從尾向前開始匹配,刪除符合匹配字串的最長數據
${變量名/舊的字串/新的字串} 將符合舊字串的第一個字串替換爲新的字串
${變量名//舊的字串/新的字串} 將符合舊字串的所有字串替換爲新的字串
變量刪除
可使用unset命令刪除一個環境變量:
$ unset temp
6.如何讓環境變量當即生效
在上面咱們在 Shell 中修改了一個配置腳本文件以後(好比 zsh 的配置文件 home 目錄下的.zshrc),每次都要退出終端從新打開甚至重啓主機以後其才能生效,非常麻煩,咱們可使用source命令來讓其當即生效,如:
$ source .zshrc
$ . ./.zshrc
注意第一個點後面有一個空格,並且後面的文件必須指定完整的絕對或相對路徑名,source 則不須要。
16.搜索文件
與搜索相關的命令經常使用的有以下幾個whereis,which,find,locate。
•whereis簡單快速
$whereis who
若是想要得到更全面的搜索結果可使用locate命令。(注意,它不僅是在 etc 目錄下查找並會自動遞歸子目錄進行查找)
•locate快而全
查找 /usr/share/ 下全部 jpg 文件:
$ locate /usr/share/\*.jpg
注意要添加*號前面的反斜槓轉義,不然會沒法找到
若是想只統計數目能夠加上-c參數,-i參數能夠忽略大小寫進行查找,whereis 的-b,-m,-s一樣能夠是使用。
which小而精
which自己是 Shell 內建的一個命令,咱們一般使用which來肯定是否安裝了某個指定的軟件,由於它只從PATH環境變量指定的路徑中去搜索命令:
$ which man
•find精而細
find應該是這幾個命令中最強大的了,它不但能夠經過文件類型、文件名進行查找並且能夠根據文件的屬性(如文件的時間戳,文件的權限等)進行搜索。find命令強大到,要把它將明白至少須要單獨好幾節課程才行,咱們這裏只介紹一些經常使用的內容。
在指定目錄下搜索指定文件名的文件:
$ find /etc/ -name interfaces
注意 find 命令的路徑是做爲第一個參數的, 基本命令格式爲 find [path] [option] [action]
與時間相關的命令參數:
參數 說明
-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
17.文件打包和解壓縮
在講 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打包文件夾:
•設置壓縮級別爲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(所查看文件的深度)
•建立加密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
18.使用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 壓縮包。
•安裝rar和unrar工具:
$ sudo apt-get update
$ sudo apt-get install rar unrar
•從指定文件或目錄建立壓縮包或添加文件到壓縮包:
$ rm *.zip
$ rar a shiyanlou.rar .
上面的命令使用a參數添加一個目錄~到一個歸檔文件中,若是該文件不存在就會自動建立。
注意:rar 的命令參數沒有-,若是加上會報錯。
•從指定壓縮包文件中刪除某個文件:
$ rar d shiyanlou.rar .zshrc
•查看不解壓文件:
$ rar l shiyanlou.rar
•使用unrar解壓rar文件
全路徑解壓:
$ unrar x shiyanlou.rar
去掉路徑解壓:
$ mkdir tmp
$ unrar e shiyanlou.rar tmp/
4.tar打包工具
tar 的解壓和壓縮都是同一個命令,只需參數不一樣,使用比較方便。
下面先掌握tar命令一些基本的使用方式,即不進行壓縮只是進行打包(建立歸檔文件)和解包的操做。
•建立一個 tar 包:
$ tar -cf shiyanlou.tar ~
•解包一個文件(-x參數)到指定路徑的已存在目錄(-C參數):
$ mkdir tardir
$ tar -xf shiyanlou.tar -C tardir
•只查看不解包文件-t參數:
$ tar -tf shiyanlou.tar
•保留文件屬性和跟隨連接(符號連接或軟連接),有時候咱們使用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
19.簡單文件系統操做
1.查看磁盤和目錄的容量
使用 df 命令查看磁盤的容量
$ df
$ df -h
如今你就可使用命令查看你主機磁盤的使用狀況了。至於掛載點若是你還記得前面第 4 節介紹 Linux 目錄樹結構的內容,那麼你就應該能很好的理解掛載的概念,這裏就再也不贅述。
使用 du 命令查看目錄的容量,這個命令前面其實已經用了不少次了:
# 默認一樣以 blocks 的大小展現
$ du
# 加上`-h`參數,以更易讀的方式展現
$ du -h
-d參數指定查看目錄的深度
# 只查看1級目錄的信息
$ du -h -d 0 ~
# 查看2級
$ du -h -d 1 ~
du(estimate file space usage)命令與df(report file system disk space usage)只用一字只差,首先就但願注意不要弄混淆了,以能夠像我這樣從man手冊中獲取命令的完整描述,記全稱就不會搞混了。
2、簡單的磁盤管理
下面涉及的命令具備必定的危險性,操做不當可能會丟失你的我的數據,初學者建議在虛擬環境中進行操做
的命令行語句與其餘的 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
將輸出的英文字符轉換爲大寫再寫入文件:
$ dd if=/dev/stdin of=test bs=10 count=1 conv=ucase
使用 dd 命令建立虛擬鏡像文件
經過上面一小節,你應該掌握了dd的基本使用,下面就來使用dd命令來完成建立虛擬磁盤的第一步。
從/dev/zero設備建立一個容量爲 256M 的空文件:
$ dd if=/dev/zero of=virtual.img bs=1M count=256
$ du -h virtual.img
使用 mkfs 命令格式化磁盤(咱們這裏是本身建立的虛擬磁盤鏡像)
你能夠在命令行輸入 mkfs 而後按下Tab鍵,你能夠看到不少個以 mkfs 爲前綴的命令,這些不一樣的後綴其實就是表示着不一樣的文件系統,能夠用 mkfs 格式化成的文件系統:
咱們能夠簡單的使用下面的命令來將咱們的虛擬磁盤鏡像格式化爲ext4文件系統:
$ mkfs.ext4 virtual.img
使用 mount 命令掛載磁盤到目錄樹
咱們先來使用mount來查看下主機已經掛載的文件系統:
$ sudo mount
那麼咱們如何掛載真正的磁盤到目錄樹呢,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
使用 umount 命令卸載已掛載磁盤
# 命令格式 sudo umount 已掛載設備名或者掛載點,如:
$ sudo umount /mnt
咱們重點開一下中間的分區信息,/dev/sda1,/dev/sda2 爲主分區分別安裝了 Windows 和 Linux 操做系統,/dev/sda3 爲交換分區(能夠理解爲虛擬內存),/dev/sda4 爲擴展分區其中包含 /dev/sda5,/dev/sda6,/dev/sda7,/dev/sda8 四個邏輯分區,由於主機上有幾個分區之間有空隙,沒有對齊邊界扇區,因此分區之間的不是徹底連續的。
# 進入磁盤分區模式
$ sudo fdisk virtual.img
使用 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
20.1、命令執行順序的控制
順序執行多條命令:簡單的順序執行你可使用;來完成
有選擇的執行命令:那麼咱們須要可以有選擇性的來執行命令,好比上一條命令執行成功才繼續下一條,或者不成功又該作出其它什麼處理,好比咱們使用which來查找是否安裝某個命令,若是找到就執行該命令,不然什麼也不作(雖然這個操做沒有什麼實際意義,但可幫你更好的理解一些概念):
$ which cowsay>/dev/null && cowsay -f head-in ohch~
你若是沒有安裝cowsay,你能夠先執行一次上述命令,你會發現什麼也沒發生,你再安裝好以後你再執行一次上述命令,你也會發現一些驚喜。上面的&&就是用來實現選擇性執行的,它表示若是前面的命令執行結果(不是表示終端輸出的內容,而是表示命令執行狀態的結果)返回0則執行後面的,不然不執行,你能夠從$?環境變量獲取上一次命令的返回結果:
||在這裏就是與&&相反的控制效果,當上一條命令執行結果爲≠0($?≠0)時則執行它後面的命令
2、管道
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 | 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
# 輸出重複過的行(重複的只輸出一個)及重複次數
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
# 輸出全部重複的行
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D
21.文本處理命令
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
23.簡單的重定向
在更多瞭解 Linux 的重定向以前,咱們須要先知道一些基本的東西,前面咱們已經提到過 Linux 默認提供了三個特殊設備,用於終端的顯示和輸出,分別爲stdin(標準輸入,對應於你在終端的輸入),stdout(標準輸出,對應於終端的輸出),stderr(標準錯誤輸出,對應於終端的輸出)。
文件描述符
設備文件 說明
0 /dev/stdin 標準輸入
1 /dev/stdout 標準輸出
2 /dev/stderr 標準錯誤
咱們能夠這樣使用這些文件描述符:
默認使用終端的標準輸入做爲命令的輸入和標準輸出做爲命令的輸出
$ 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的文件中
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的文件描述符,只是它們默認沒有打開而已,你可使用下面命令查看當前 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
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 操做系統的經常使用命令。它的做用是將參數列表轉換成小塊分段傳遞給其餘命令,以免參數列表過長的問題。
這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 find,locate 和 grep 的結果,詳細用法請參看 man 文檔。
$ cut -d: -f1 < /etc/passwd | sort | xargs echo
上面這個命令用於將/etc/passwd文件按:分割取第一個字段排序後,使用echo命令生成一個列表。
24.1、正則表達式
正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫爲 regex、regexp 或 RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。
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} 限定符
^、$、\任何元字符 定位點和序列
| 選擇
更多正則表達式的內容能夠參考如下連接:
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*'
# 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 的數字與字節
# 排除字符
$ echo 'geek|good' | grep '[^o]'
注意:當^放到中括號內爲排除字符,不然表示行首。
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
4、awk文本處理語言
在咱們的環境中ubuntu上,默認提供的是mawk,不過咱們一般能夠直接使用awk命令(awk語言的解釋器),由於系統已經爲咱們建立好了awk指向mawk的符號連接。
$ ll /usr/bin/awk
2.awk的一些基礎概念
awk全部的操做都是基於pattern(模式)—action(動做)對來完成的,以下面的形式:
$ pattern {action}
.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
$ 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 -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"
24.1、Linux 上的軟件安裝
一般 Linux 上的軟件安裝主要有三種方式:
•在線安裝
•從磁盤安裝deb軟件包
•從二進制軟件包安裝
•從源代碼編譯安裝
2、在線安裝
在 Linux 下,一個命令加回車,等待一下,軟件就安裝好了,這就是方便的在線安裝軟件的方式。好比咱們想安裝一個軟件,名字叫作 w3m(w3m是一個命令行的簡易網頁瀏覽器),那麼輸入以下命令:
$ sudo apt-get install w3m
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 軟件的相關信息,並根據這些信息在相關的服務器上下載軟件安裝,這裏你們可能會一個疑問:既然是在線安裝軟件,爲啥會在本地的數據庫中搜索?要解釋這個問題就得提到幾個名詞了:
•軟件源鏡像服務器
•軟件源
.apt-get
apt-get使用各用於處理apt包的公用程序集,咱們能夠用它來在線安裝、卸載和升級軟件包等,下面列出一些apt-get包含的經常使用的一些工具:
工具
說明
install 其後加上軟件包名,用於安裝一個軟件包
update 從軟件源鏡像服務器上下載/更新用於更新本地軟件源的軟件包列表
upgrade 升級本地可更新的所有軟件包,但存在依賴問題時將不會升級,一般會在更新以前執行一次update
dist-upgrade 解決依賴關係並升級(存在必定危險性)
remove 移除已安裝的軟件包,包括與被移除軟件包有依賴關係的軟件包,但不包含軟件包的配置文件
autoremove 移除以前被其餘軟件包依賴,但如今再也不被使用的軟件包
purge 與remove相同,但會徹底移除軟件包,包含其配置文件
clean 移除下載到本地的已經安裝的軟件包,默認保存在/var/cache/apt/archives/
autoclean 移除已安裝的軟件的舊版本軟件包
下面是一些apt-get經常使用的參數:
參數
說明
-y 自動迴應是否安裝軟件包的選項,在一些自動化安裝腳本中使用這個參數將十分有用
-s 模擬安裝
-q 靜默安裝方式,指定多個q或者-q=#,#表示數字,用於設定靜默級別,這在你不想要在安裝軟件包時屏幕輸出過多時頗有用
-f 修復損壞的依賴關係
-d 只下載不安裝
--reinstall 從新安裝已經安裝但可能存在問題的軟件包
--install-suggests 同時安裝APT給出的建議安裝的軟件包
4.安裝軟件包
關於安裝,如前面演示的同樣你只須要執行apt-get install <軟件包名>便可,除了這一點,你還應該掌握的是如何從新安裝軟件包。 不少時候咱們須要從新安裝一個軟件包,好比你的系統被破壞,或者一些錯誤的配置致使軟件沒法正常工做。
你可使用以下方式從新安裝:
$ sudo apt-get --reinstall install w3m
另外一個你須要掌握的是,如何在不知道軟件包完整名的時候進行安裝。一般咱們是使用Tab鍵補全軟件包名,後面會介紹更好的方法來搜索軟件包。有時候你須要同時安裝多個軟件包,你還可使用正則表達式匹配軟件包名進行批量安裝。
5.軟件升級
# 更新軟件源
$ sudo apt-get update
# 升級沒有依賴問題的軟件包
$ sudo apt-get upgrade
# 升級並解決依賴關係
$ sudo apt-get dist-upgrade
6.卸載軟件
若是你如今以爲 w3m 這個軟件不合本身的胃口,或者是找到了更好的,你須要卸載它,那麼簡單!一樣是一個命令加回車 sudo apt-get remove w3m ,系統會有一個確認的操做,以後這個軟件便「滾蛋了」。
7.軟件搜索
當本身剛知道了一個軟件,想下載使用,須要確認軟件倉庫裏面有沒有,就須要用到搜索功能了,命令以下:
sudo apt-cache search softname1 softname2 softname3……
3、使用 dpkg 從本地磁盤安裝 deb 軟件包
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
3.查看已安裝軟件包的安裝目錄
若是你依然在糾結到底linux將軟件安裝到了什麼地方,那麼很幸運你將能夠經過dpkg找到答案
使用dpkg -L查看deb包目錄信息
$ sudo dpkg -L emacs
4、從二進制包安裝
二進制包的安裝比較簡單,咱們須要作的只是將從網絡上下載的二進制包解壓後放到合適的目錄,而後將包含可執行的主程序文件的目錄添加進PATH環境變量便可,若是你不知道該放到什麼位置,請從新複習第四節關於 Linux 目錄結構的內容。
3. 課後做業
課程第二節實驗內容,安裝banner,toilet,figlet
課程第三節做業:
課程第四節做業:
課程第五節做業:
《黑客帝國》電影裏滿屏幕代碼的「數字雨」,在 Linux 裏面你也能夠輕鬆實現這樣的效果,你只須要一個命令cmatrix。
課程六做業:
天冷的時候,要是有個火爐就行了。這裏有個有趣的程序:
$ sudo apt-get install libaa-bin
# 提示command not found,請自行解決
$ aafire
課程七做業:
cowsay命令,可讓你在終端裏以一種動物說話的形式打印出一段話。
課程八做業:
使用之前介紹過的方法,安裝aview和imagemagick,而後用asciiview命令顯示圖片,使用方法能夠用 man 命令查看。
課程九做業: dos 文本格式到 UNIX 文本格式的轉換
#從dos 到unix文本格式轉換
$ cat -A [dos] | tr -d '^M' | cat -A [dos]
課程十做業:以前介紹過一個在命令行將圖片轉換爲 ascii 字符查看的工具 aview/asciiview,不過它是黑白的。如今,這裏是個彩色的:
$ sudo apt-get install caca-utils $ cacaview <pic_file> $ cacademo $ cacafire
課程11做業:
參考論文:http://www.cricode.com/3388.html
參考網站:http://blog.csdn.net/fan_hai_ping/article/details/8352087
7、遇到的問題及解決
1.在使用aview打開圖片時,因爲terminal終端默認的用戶是shiyanlou,它是在shiyanlou下搜索文件,剛開始我將圖片放置於桌面,不能打開,將其移動到shiyanlou目錄下就能成功地打開圖片了。
3.
8、其餘
(提示:此處由學生填寫,靈感,領悟等)