我之前常常在網上查相似於「在Ubuntu下如何讓某個用戶對某個文件夾擁有可讀可寫的權限?」,「Mac上如何經過命令行啓動某個程序?」,「在Linux中如何完全卸載某個軟件?」這類的問題,固然這類問題均可以較容易的在網上找到解決方案,可是每次解決我都是知其然不知其因此然,因此當下次我碰到相似的問題時,我仍是要花必定的時間去查,這讓我有一種挫敗感;開發相關的知識大多變得特別快,可是有些知識特別經典,其實比起某些庫或框架也許更值得系統的瞭解。這也是本文的寫做初衷,一方面是本身對近兩個月來看的相關資料作一個總結,另外一方面也但願能夠幫助Linux初學者更好的理解,運用這個系統。css
在我大二的時候,學校裏有個學長就《神奇的Ubuntu》爲題進行了一次演講(演講我並沒去聽,可是仔細看了那個手繪的宣傳板,當時以爲頗有意思,不過到如今過了七年多了,也實在是不記得宣傳板上具體的內容了,依稀記得把Windows批判了一番。。)。html
在那個好奇心最重的年齡,我回去就開始查關於Ubuntu相關的消息,發現它是Linux的衆多發行版之一,其它發行版還有centos
,redHat
,Fedora
等等,又不知道從哪裏看到,Ubuntu還和MacOS 有必定的親緣關係(都是類Unix系統),瞬間就懂了嘗試使用的心,連夜下載了當時最新的Ubuntu發行版(應該是Ubuntu10.04),覆蓋安裝了本機的Win7系統(當時剛買電腦半年,那時候還不知道還有虛擬機這個東西),當時就以爲利用命令行下載軟件特別酷,嘗試了酷炫的3D桌面,尋找了windows相關軟件的替代品,不過大概仍是10天左右仍是因爲各類緣由就又換回了Windows(其實當時也並無理解這個系統)。node
可能也是一直念念不忘這個系統,後來又安裝了好幾回,有裝雙系統,有用虛擬機,有用Docker,有用阿里雲的遠程服務器等等。就我本身的體驗來看,我最推薦的安裝方式仍是使用虛擬機,virtualbox是一個開源的免費的虛擬機軟件(支持MacOS和Windows),在Linux發行版官網下載好想使用的Linux系統後(好比Ubuntu16.04桌面版,本文以後的代碼也大多基於Ubuntu,有的也使用了Mac),經過虛擬機進行安裝便可,虛擬機的使用很是簡單,聰明的你確定一試就會。python
在Windows下,咱們習慣於使用各類具備完善圖形界面的軟件,毫無疑問,圖形界面大大下降了普通人使用電腦的成本,甚至我的計算機的普及,圖形界面都功不可沒,在Linux下也有圖形界面(俗話說的桌面),經過如下文字,咱們能夠對其有初步的瞭解:mysql
相對於如今的 Windows 系統,UNIX/Linux 自己是沒有圖形界面的,咱們一般在 UNIX/Linux 發行版上看到的圖形界面實際都只是運行在 Linux 系統之上的一套軟件,而 Linux 上的這套軟件之前是 XFree86,如今則是 xorg(X.Org),而這套軟件又是經過 X 窗口系統(X Window System,也常被稱爲 X11 或 X)實現的,X 自己只是工具包及架構協議,而 xorg 即是 X 架構規範的一個實現體,也就是說它是實現了 X 協議規範的一個提供圖形界面服務的服務器,就像實現了 http 協議提供 web 服務的 Apache 。若是隻有服務器也是不能實現一個完整的桌面環境的,固然還須要一個客戶端,咱們稱爲 X Client,像以下幾個你們熟知也最流行的實現了客戶端功能的桌面環境 KDE,GNOME,XFCE,LXDE 。
注:以上文字引自實驗樓《Linux基礎入門》linux
固然也許你早就知道Linux的正確打開方式是使用命令行(呃..啥是命令行?),不過看了對Linux圖形界面的描述後,是否是更加理解爲啥咱們要用命令行了。那接下來就說說啥是命令行?git
?,呃,慢着,不是說好解釋啥是命令行麼,怎麼忽然冒出了四個名詞。熟悉又模式的四個詞,別急,咱們一個個來解釋。web
命令行界面是相對於圖形界面而言的,較圖形用戶界面節約計算機系統的資源。在熟記命令的前提下,使用命令行界面每每要較使用圖形用戶界面的操做速度要快。命令行中,可使用腳本語言和宏語言,以其提供更加豐富的控制與自動化的系統管理能力。命令行界面-維基百科正則表達式
終端特指計算機或通訊網絡中輸入或輸出信息的裝置,一般由鍵盤和顯示器等組成。可是使用Mac或者安裝好了Ubuntu的童鞋會發現有一個程序也叫終端(Terminal),在某種意義上,終端仍是咱們與系統交互的窗口,嚴格來說,咱們如今在系統中運行的終端程序只是終端模擬器(常見的終端模擬器有如下幾個: gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm
),更多關於終端的描述,能夠參考這篇文章。sql
這裏還得插一句:終端本質上是對應着 Linux 上的 /dev/tty
設備(設備稍後詳述),Linux 的多用戶登錄就是經過不一樣的 /dev/tty
設備完成的.
英語好的同窗一會兒就能夠看出shell
是殼的意思,有殼就有核,核指的是 UNIX/Linux 內核,Shell之因此叫Shell 是由於它隱藏了操做系統底層的細節。咱們能夠換個你們一下就能懂的詞來理解Shell:命令解析器。
當咱們在終端中輸入node
,按回車,會啓用node解釋器,輸入python
按回車會啓動Python解釋器,以後就能夠在裏面輸入並執行對應語言的代碼啦。
在 UNIX/Linux 中比較流行的常見的 Shell 有 bash
、zsh
(用沒用過美美的oh my zsh)、ksh
、csh
等等,Ubuntu 終端默認使用的是 bash
。本文後面對shell命令的講解也大多基於bash。
從字面上來說,console是控制檯的意思,如今的console通常與終端在外表上沒什麼區別,不過其在功能上卻大不相同,console的出現有其歷史緣由,簡單的說來,就是在之前電腦仍是很稀缺的物件的年代,一臺電腦是會陪伴多套終端的,這時候就須要專門的系統管理員利用console來管理系統。目前對通常人來講console的做用可能沒有那麼大了,不過可能其仍是會在一些特殊場景下有很大的做用,具體我也不是很清楚,在此就不闡述了。
終端分字符終端和圖形終端,字符終端(Character Terminal)也叫文本終端(Text Terminal),是隻能接收和輸出文本信息的終端。圖形終端(Graphics Terminal)不但能夠接收和輸出文本信息,也能夠輸出圖形圖像。
通常說來字符終端的的標準是DEC公司1978製造的型號爲VT100的終端。而圖形終端的標準是X Window,它是大多數Unix-like系統GUI界面的基礎,xterm是Unix世界裏最著名的圖形終端模擬程序。
以Ubuntu具體說來,它默認提供七個終端,其中第一個到第六個虛擬控制檯是全屏的字符終端,第七個虛擬控制檯是圖形終端,用來運行GUI程序,按快捷鍵CTRL+ALT+F1,或CTRL+ALT+F2…….CTRL+ALT+F6,CTRL+ALT+F7可完成對應的切換,安裝了虛擬機的童鞋能夠動手嘗試一下哈。
shell多是咱們在Linux下使用最多的工具了,本小節咱們咱們以bash爲例,固然zsh下如下命令也是適用的,咱們先熟悉一下shell的基本操做。
命令行的操做分爲輸入和輸出兩個方面:
輸入:打開終端,按鍵盤輸入,按回車結束輸入並執行;
輸出:輸出會返回你想要的結果,好比你看的是文件,就會返回文件的內容。若是是執行的程序,執行失敗會告訴你哪裏錯了,若是施行成功會沒有輸出,這是linux的哲學:沒有結果就是最好的結果。
我還記得在我初用Mac終端(shell爲zsh)時,有人告訴我輸入文件目錄時,輸入幾個字母后按tap
鍵,能夠自動補全,當時以爲特別神奇,還特地向我不是學計算機的同窗炫耀,命令行有多麼好用。合理的使用快捷鍵確實能夠明顯的提升工做效率,對shell
經常使用快捷鍵的總結以下:
Tap
:點擊Tab鍵能夠實現命令補全,目錄補全、命令參數補全;
Ctrl+c
:強行終止當前程序(經常使用);
Ctrl+d
:鍵盤輸入結束或退出終端(經常使用);
Ctrl+s
:暫停當前程序,暫停後按下任意鍵恢復運行;
Ctrl+z
:將當前程序放到後臺運行,恢復到前臺爲命令fg
;
Ctrl+a
:將光標移至輸入行頭,至關於Home鍵;
Ctrl+e
:將光標移至輸入行末,至關於End鍵;
Ctrl+k
:刪除從光標所在位置到行末,常配合ctrl+a
使用;
Alt+Backspace
:向前刪除一個單詞,常配合ctrl+e
使用;
Shift+PgUp
:將終端顯示向上滾動;
Shift+PgDn
:將終端顯示向下滾動;
上下方向鍵:瀏覽歷史輸入記錄;
熟練運用上述的操做技巧將大大提高咱們命令行的操做效率,不過真正解決問題須要應用各類bash
命令,下面對經常使用命令進行簡單的介紹:
bash
命令文件相關
ls
:列出某文件夾下的文件,添加參數可實現更細緻的功能,
ls -a
列出全部文件,包括隱藏文件
ls -l
列出文件及其詳細信息
cd
切換目錄,cd
到不存在的目錄時會報錯
pwd
打印當前目錄
cat
:讀取某一個文件內的內容
wc
:獲取某一個文件的行數和字數
$ wc package.json # 79 175 2712 package.json
cp
:複製某文件
mkdir
:建立目錄
rmdir
:刪除目錄
rm-rf
:r
刪除內部全部文件,f
參數表示強制,rm -r junk
刪除junk目錄及其下面的全部文件;
mv
移動 mv photos.jpg Photos
將photos移動到文件夾Photos
下
sort
排序
diff
:比較兩個文件的異同
系統相關:
date
:獲取當前時間
uname
:返回系統名稱
hostname
:返回系統的主機名稱
網絡相關:
host xx.xxx.com
:顯示某域名相關託管服務器/郵件服務器
ping 8.8.8.8
檢測鏈接
搜索相關命令:
whereis
:
描述:簡單快捷
使用$whereis who
說明:這個搜索很快,由於它並無從硬盤中依次查找,而是直接從數據庫中查詢。whereis 只能搜索二進制文件(-b),man 幫助文件(-m)和源代碼文件(-s)。
locate
:
描述:快而全
使用$ locate /etc/sh
(查找 /etc 下全部以 sh 開頭的文件),$ locate /usr/share/\*.jpg
(注意要添加 * 號前面的反斜槓轉義,不然會沒法找到。)
說明:經過/var/lib/mlocate/mlocate.db
數據庫查找,不過這個數據庫也不是實時更新的,系統會使用定時任務天天自動執行 updatedb 命令更新一次,因此有時候你剛添加的文件,它可能會找不到,須要手動執行一次 updatedb 命令(在咱們的環境中必須先執行一次該命令)。它能夠用來查找指定目錄下的不一樣文件類型
可帶參數:如-i
參數能夠忽略大小寫進行查找
which
:
描述:小而精
使用:$ which man
說明:咱們一般使用 which 來肯定是否安裝了某個指定的軟件,由於它只從 PATH 環境變量指定的路徑中去搜索命令
find
:
描述:精而細
使用:$ sudo find /etc/ -name interfaces
/格式find [path] [option] [action]
;
說明:find 應該是這幾個命令中最強大的了,它不但能夠經過文件類型、文件名進行查找並且能夠根據文件的屬性(如文件的時間戳,文件的權限等)進行搜索。find很強大也相對而言很複雜,在此先不贅述;$ sudo find /etc/ -name \*.list
其它:
--version/-V
查看某個程序的版本
history
顯示歷史
echo
:返回你給的值,能夠簡單理解爲js中的console
或python中的print
man
使用一個叫作less
的程序,查看某個命令的幫助文檔
less
:linenumer u d keyarray search
(大小寫敏感),正則表達式
通配符(Globbing):
- 使用命令時可在參數中使用通配符 - `*`:匹配 0 或多個字符,如`ls *.html`將匹配全部以html結尾的文件,`ls b*.png`將匹配全部以b開頭,png結尾的文件; - `?`:匹配任意一個字符,如`ls abc?.png` 可匹配abcd.png/abce.png - `[list]`:匹配 list 中的任意單一字符 - `[!list]`:匹配 除list 中的任意單一字符之外的字符 - `[c1-c2]`:匹配 c1-c2 中的任意單一字符 如:[0-9] [a-z] - `{string1,string2,...}`:匹配 string1 或 string2 (或更多)其一字符串,如 `{css,html}`, `ls app.{html.css}`將匹配app.css 和app.html; - `{c1..c2}`:匹配 c1-c2 中所有字符 如{1..10} - 使用`man`查看幫助(man分類以下:) - 注意通配符大小寫敏感
上文只對常見命令進行了簡單的描述,其中一些命令在下文講到具體應用場景時還會詳細的說明。結合剛剛所說的這些命令,咱們來理解Linux是一個怎麼樣的系統。
有沒有想過這樣一個問題,咱們能夠很容易經過外貌等特徵認出某臺計算機是屬於咱們本身的,那反過來,計算機是怎麼識別目前正在操做的那我的是你呢?就Linux而言,這就涉及到用戶管理系統。
Linux 是一個能夠實現多用戶登錄的操做系統,多用戶能夠同時登錄同一臺主機,共享主機的一些資源,不一樣的用戶也分別有本身的用戶空間,可用於存放各自的文件。雖然不一樣用戶的文件是放在同一個物理磁盤上的甚至同一個邏輯分區或者目錄裏,可是因爲 Linux 的用戶管理和 文件權限機制,不一樣用戶不能夠輕易地查看、修改彼此的文件。
那先看看咱們是誰?
查看當前用戶有多種方式能夠實現,咱們試試下面三種命令:
$ who am i
:只列出用戶名
$ who mom likes
/who am i
:列出用戶名,所使用終端的編號和開啓時間;
$ finger
:列出當前用戶的詳細信息,需使用apt-get
提早安裝;
實例:
$ who mom likes zhangwang ttys003 May 8 14:58 $ who am i zhangwang ttys003 May 8 14:58 # pts/0 中 pts(mac ttys) 表示僞終端,pts/0(ttys003) 後面那個數字就表示打開的僞終端序號 $ sudo apt-get finger $ finger # 會列出當前用戶的信息 Login Name Tty Idle Login Time Office Office Phone zhangwang zhangwang pts/0 May 4 21:04 (125.34.199.251)
root
通常經過上面的操做會發現咱們當前登陸的用戶並不是root
,在Linux中,老大root 帳戶擁有整個系統至高無上的權利,它能夠操做系統中全部的對象。在某些發行版中,這個用戶並不顯式存在,不過若是其它的用戶具備使用sudo
的權利(後文會敘述如何獲取),經過sudo 命令
也能夠達到用root帳號操做的效果。建立用戶就是一個須要sudo權限的命令。
adduser
此命令的使用可參看如下實例:
zhangwang@Ubuntu:~$ sudo adduser student [sudo] password for zhangwang: Adding user `student' ... Adding new group `student' (1002) ... Adding new user `student' (1002) with group `student' ... Creating home directory `/home/student' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for student Enter the new value, or press ENTER for the default Full Name []: Udacity Linux Student Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] Y # finger 用戶管理用戶 zhangwang@Ubuntu:~$ finger student Login: student Name: Udacity Linux Student Directory: /home/student Shell: /bin/bash Never logged in. No mail. No Plan.
說完了如何添加用戶,再說說如何切換用戶。
切換用戶相關命令:
su <user>
:切換到用戶user,執行時須要輸入目標用戶的密碼;
su - <user>
:切換用戶,同時環境變量也會跟着改變成目標用戶的環境變量。
su -l lilei
:切換登陸用戶;
有時候咱們也會看到添加用戶使用的命令是useradd
,而非adduser
下面說說兩者的區別:
sudo adduser lilei
:新建一個叫作lilei的用戶,添加用戶到系統,同時也會默認爲新用戶建立 home目錄:
sudo useradd
:只建立用戶,建立完了須要用 passwd lilei
去設置新用戶的密碼;
在 Linux 裏面每一個用戶都有一個歸屬(用戶組),用戶組簡單地理解就是一組用戶的集合,它們共享一些資源和權限,同時擁有私有資源。
查看用戶屬於那些組(groups):
使用示例:
~ groups zhangwang # staff everyone localaccounts _appserverusr admin...
關於用戶組咱們須要注意:
每次新建用戶若是不指定用戶組的話,默認會自動建立一個與用戶名相同的用戶組;
默認狀況下在 sudo 用戶組裏的可使用 sudo 命令得到 root 權限。
使用cat /etc/group | sort
命令查看某組包含那些成員:/etc/group
文件中分行顯示了用戶組(Group)、用戶組口令、GID 及該用戶組所包含的用戶(User),格式以下:
group_name:password:GID:user_list group:*:16: interactusers:*:51: kmem:*:2:root localaccounts:*:61: # *表示密碼不可見 mail:*:6:_teamsserver
爲用戶添加組織:
不一樣的組對不一樣的文件可能具備不一樣的操做權限,好比說經過上述命令新建的用戶默認是沒有使用sudo
的權限的,咱們可使用usermod
命令把它加入sudo
組用以具有相應的權限。
方法以下:
$ sudo usermod -G sudo student $ groups lilei # lilei:lilei sudo
刪除用戶也是一個須要管理員權限的命令,使用方法以下:
sudo deluser student --remove-home
:刪除用戶及用戶相關文件;
直接的deluser
會刪除該用戶,可是不會刪除用戶相關文件;
使用Linux的過程當中,查看修改文件是咱們常作的事情之一。可是正如前文所說,文件是有全部權概念的,對同一個文件並不是全部用戶都對其有同樣的權限。
前面咱們提到使用ls
命令能夠查看文件,ls
後還能夠帶各類參數以實現不一樣的查看效果,具體以下:
ls -l
:查看文件及其權限;
ls -A
:顯示隱藏文件(包括以.
開頭的文件);(a->all)
ls -Al
:顯示隱藏文件及其權限;
ls -dl<查看一文件的完整屬性>
:(d->detail)
ls -AsSh
:顯示全部文件大小,並以普通人類能看懂的方式呈現(小 s 爲顯示文件大小,大 S 爲按文件大小排序);
示例以下(注:命令行中的Python是我所操做的當前目錄的名稱):
➜ Python ls -l total 0 drwxr-xr-x 9 zhangwang staff 306 5 11 19:06 Bucketlist drwxr-xr-x 10 zhangwang staff 340 5 4 13:58 TofelWePrograme drwxr-xr-x 14 zhangwang staff 476 4 25 16:41 alien_invasion drwxr-xr-x 12 zhangwang staff 408 5 25 11:13 flasky drwxr-xr-x 10 zhangwang staff 340 4 26 19:06 learning_log # 文件類型和權限 連接數 全部者 用戶所在組 大小 最後修改時間 文件名稱
上面的代碼中,最讓人疑惑的可能就是文件類型和權限這一項了,咱們來逐一解釋。
說到文件,不得不提文件類型,Linux中的文件不一樣於Windows中的文件,在Linux 裏面一切皆文件,主要文件類型有如下幾種:
普通文件:通常是用一些相關的應用程序建立的(如圖像工具、文檔工具、歸檔工具... 或 cp工具等),這類文件的刪除方式是用rm
命令,而建立使用touch
命令,用符號-
表示;
目錄:目錄在Linux是一個比較特殊的文件,用字符d
表示,刪除用rm 或rmdir命令;
塊設備文件:存在於/dev
目錄下,如硬盤,光驅等設備,用字符d
表示;
設備文件:( /dev 目錄下有各類設備文件,大都跟具體的硬件設備相關),如貓的串口設備,用字符c
表示;
socket文件;用字符s
表示,好比啓動MySQL服務器時,產生的mysql.sock
的文件;
pipe 管道文件:能夠實現兩個程序(能夠從不一樣機器上telnet)實時交互,用字符p
表示;
連接文件:軟連接等同於 Windows 上的快捷方式;用字符l
表示;
軟硬連接文件的共同點和區別:不管是修改軟連接,硬連接生成的文件仍是直接修改源文件,相應的文件都會改變,可是若是刪除了源文件,硬連接生成的文件依舊存在而軟連接生成的文件就再也不有效了。
上面的代碼示例中,另外一個比較讓人疑惑的是drwxr-xr-x
這樣的語句,這段語句代表了文件的權限。Linux中文件權限主要由如下幾種:
讀權限:可使用 cat <file name>
之類的命令來讀取某個文件的內容;
寫權限,表示你能夠編輯和修改某個文件;
執行權限,一般指能夠運行的二進制程序文件或者腳本文件(Linux 上不是經過文件後綴名來區分文件的類型);
全部者權限,所屬用戶組權限,是指你所在的用戶組中的全部其它用戶對於該文件的權限
一個目錄同時具備讀權限和執行權限才能夠打開並查看內部文件,而一個目錄要有寫權限才容許在其中建立其它文件,這是由於目錄文件實際保存着該目錄裏面的文件的列表等信息。
可用下圖增強對文件權限的理解:
從上圖中能夠看出,每一個文件有三組權限(擁有者,所屬用戶組,其餘用戶,這個順序是必定的),修改權限的命令是chmod
,修改文件權限的方法有兩種,所示:
# 用數字的形式表示,數字的來源及計算方法見下圖,數字的意義見下圖 $ chmod 700 iphone6 # 讓用戶對iPhone6文件具有讀寫權限,所在組和其它用戶都沒有讀寫權限 # 用字母的形式表示,g、o 還有 u 分別表示 group、others 和 user,+ 和 - 分別表示增長和去掉相應的權限 $ chmod go-rw iphone6 # 讓用戶所屬用戶組及其它用戶對iPhone6這個文件再也不有讀寫權限
chown
上面描述文件權限時,都是以本身,所在組,其它三個級別來描述的,那若是你登陸的當前帳戶不是某個文件的全部者,你又不想讓這個文件對全部用戶開發你想用到的權限,該怎麼辦呢。還記得前面咱們說過老大root
用戶對全部的文件具備絕對的支配權,咱們能夠利用這個帳號把一個文件過繼給另一個用戶(更改文件的全部者)以方便該用戶對該文件的操做,使用方法以下:
# sudo 表示已root的權限執行,下面語句的意思是把/etc/apt文件夾下面的sources.list的全部權轉讓給用戶zhangwang $ sudo chown zhangwang /etc/apt/sources.list $ sudo chmod 700 /etc/apt/sources.list
如今咱們有能力得到對某文件的操做能力了,接下來看看Linux下對文件進行簡單操做的命令。
touch
:
主要做用是來更改已有文件的時間戳的(好比,最近訪問時間,最近修改時間);
在不加任何參數的狀況下,只指定一個文件名,則能夠建立一個指定文件名的空白普通文件(不會覆蓋已有同名文件)
mkdir
:
新建空目錄$ mkdir mydir
新建多級目錄$ mkdir -p father/son/grandson
cp
:
$ cp test father/son/grandson
:複製test文件到father/son/grandson;
$ cp -r father family
:遞歸複製目錄mv
:
$ mv file1 Documents
:移動文件files到Documents目錄
$ mv file1 myfile
:將文件「 file1 」重命名爲「 myfile 」
rm
:
$ rm test
$ rm -f test
:刪除只讀文件,強制刪除
$ rm -r family
:刪除目錄(遞歸刪除其中的子文件)
rename
:批量重命名,須要用到正則表達式
代碼示例
# 使用通配符批量建立 5 個文件: $ touch file{1..5}.txt # 批量將這 5 個後綴爲 .txt 的文本文件重命名爲以 .c 爲後綴的文件: $ rename 's/\.txt/\.c/' *.txt # 批量將這 5 個文件,文件名改成大寫: $ rename 'y/a-z/A-Z/' *.c
cat
:打印文件內容到標準輸出(終端)(正序);
cat -n passwd
:顯示行號,此外還有如下命令
tac
:打印文件內容到標準輸出(終端)(逆序);
標準輸入輸出:當咱們執行一個 shell 命令行時一般會自動打開三個標準文件,即標準輸入文件(stdin),默認對應終端的鍵盤、標準輸出文件(stdout)和標準錯誤輸出文件(stderr),後兩個文件都對應被重定向到終端的屏幕,以便咱們能直接看到輸出內容。進程將從標準輸入文件中獲得輸入數據,將正常輸出數據輸出到標準輸出文件,而將錯誤信息送到標準錯誤文件中。
對cat
,tac
參數的說明以下:
-b : 指定添加行號的方式,主要有兩種: -b a:表示不管是否爲空行,一樣列出行號("cat -n"就是這種方式) -b t:只列出非空行的編號並列出(默認爲這種方式) -n : 設置行號的樣式,主要有三種: -n ln:在行號字段最左端顯示 -n rn:在行號字段最右邊顯示,且不加 0 -n rz:在行號字段最右邊顯示,且加 0 -w : 行號字段佔用的位數(默認爲 6 位)
more
:比較簡單,只能向一個方向滾動,查看文件:打開後默認只顯示一屏內容,終端底部顯示當前閱讀的進度。可使用 Enter 鍵向下滾動一行,使用 Space 鍵向下滾動一屏,按下 h 顯示幫助,q 退出。
less
:less 基於 more 和 vi查看文件,使用基本和 more 一致
head
:查看文件的頭幾行(默認10行)tail
:查看文件的尾幾行(默認10行)
$ tail -n 1 /etc/passwd
查看固定行數
file
:查看文件類型$ file /bin/ls
前面屢次提到了相似/dev
這樣的目錄,也提到了目錄文件d
,不知道你對目錄有沒有也產生好奇,Linux的目錄也是Linux系統中比較重要的一塊,不過首先咱們得區分Linux的目錄和Window的目錄的較大的區別:
不一樣之一體如今目錄與存儲介質(磁盤,內存,DVD 等)的關係上,Windows 一直是以存儲介質爲主的,主要以盤符(C 盤,D 盤...)及分區來實現文件管理,而後之下才是目錄,目錄就顯得不是那麼重要,除系統文件以外的用戶文件放在任何地方任何目錄也是沒有多大關係。
然而 UNIX/Linux 剛好相反,UNIX 是以目錄爲主的,Linux 也繼承了這一優良特性。 Linux 以樹形目錄結構的形式來構建整個系統,能夠理解爲樹形目錄是一個用戶可操做系統的骨架。雖然本質上不管是目錄結構仍是操做系統內核都是存儲在磁盤上的,但從邏輯上來講 Linux 的磁盤是「掛在」(掛載在)目錄上的,每個目錄不只能使用本地磁盤分區的文件系統,也可使用網絡上的文件系統。
簡言之,Windows的目錄掛載在磁盤下,而Linux磁盤掛載在目錄下,使用Mac的童鞋們,看了這段話是否是忽然明白了爲何Mac上安裝第三方軟件時,會出現盤符。
初接觸Linux時,咱們很容易被其看似複雜的文件系統弄得暈頭轉向,其實在掌握了必定的規律後,Linux的目錄結構是比Window簡單的(你如今能說清windows系統盤各文件夾的做用不),Linux的大部分目錄結構是依據FHS標準(英文:Filesystem Hierarchy Standard 中文:文件系統層次結構標準)規定好的,
多數 Linux 版本採用這種文件組織形式,FHS 定義了系統中每一個區域的用途、所須要的最小構成的文件和目錄同時還給出了例外處理與矛盾處理。
FHS包含兩層規範:
第一層是, /
下面的各個目錄應該要放什麼文件數據,例如 /etc
應該放置設置文件,/bin
與 /sbin
則應該放置可執行文件等等。
第二層則是針對 /usr
及 /var
這兩個目錄的子目錄來定義。例如 /var/log
放置系統登陸文件,/usr/share
放置共享數據等等。
這裏有個有用的命令:tree
(須要先安裝),能夠查看某個目錄的子目錄的結構,這個命令還能夠限制目錄的展現層級,經過man tree
你能夠獲知如何進行具體的操做。
FHS 是根據以往無數 Linux 用戶和開發者的經驗總結出來的,而且會維持更新,網上有不少結束FHS的文章,若是感興趣 能夠搜索看看。
咱們回顧一下關於目錄的一些經常使用相關命令:
..
:表示上一級目錄
cd
:切換目錄,後面能夠是相對目錄,也能夠是絕對目錄,如$ cd /usr/local/bin
pwa
:查看當前所在目錄
du
使用du
命令能夠查看目錄的容量,配合如下參數能夠實現更多效果。
參數:
-d
:指定查看目錄的深度``
# 只查看1級目錄的信息 $ du -h -d 0 ~ # 查看2級 $ du -h -d 1 ~ du -h #同--human-readable 以K,M,G爲單位,提升信息的可讀性。 du -a #同--all 顯示目錄中全部文件的大小。 du -s #同--summarize 僅顯示總計,只列出最後加總的值。 # 只查看特定目錄 ➜ ~ du -h -d 1 /Users/zhangwang/Git 0B /Users/zhangwang/Git/.idea 654M /Users/zhangwang/Git/backUp 80K /Users/zhangwang/Git/Canvas 235M /Users/zhangwang/Git/CoderWood 273M /Users/zhangwang/Git/frontend 64K /Users/zhangwang/Git/git_hug 217M /Users/zhangwang/Git/mongodb 3.6M /Users/zhangwang/Git/node 304M /Users/zhangwang/Git/proJourn
在Linux下磁盤是掛載在目錄下的,前文大體聊了目錄,接下來咱們簡單說說磁盤管理,前面剛剛說完如何查看目錄容量,咱們先卡如何查看磁盤的容量。
df
使用df
命令能夠查看磁盤的容量
使用方法可見下例:
➜ ~ df Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on /dev/disk1 234586112 194476264 39597848 84% 2414807 4292552472 0% / devfs 370 370 0 100% 640 0 100% /dev map -hosts 0 0 0 100% 0 0 100% /net map auto_home 0 0 0 100% 0 0 100% /home /dev/disk2s1 732080 461176 270904 63% 4684 4294962595 0% /Volumes/微信web開發者工具 # 以更友善的方式展現 $ df -h
上面這條命令是在Mac上執行的,有沒有發現微信web開發者工具的安裝盤也是一個磁盤。固然這類磁盤都不是真實的物理磁盤,而是虛擬磁盤,下面咱們看看如何建立虛擬磁盤:
dd
說明:
dd命令用於轉換和複製文件,不過它的複製不一樣於cp。以前提到過關於 Linux 的很重要的一點,一切即文件,在 Linux 上,硬件的設備驅動(如硬盤)和特殊設備文件(如/dev/zero和/dev/random)都像普通文件同樣,只要在各自的驅動程序中實現了對應的功能,dd 也能夠讀取自和/或寫入到這些文件。這樣,dd也能夠用在備份硬件的引導扇區、獲取必定數量的隨機數據或者空數據等任務中。dd程序也能夠在複製時處理數據,例如轉換字節序、或在 ASCII 與 EBCDIC 編碼間互換。
語句格式:選項=值
dd默認從標準輸入中讀取,並寫入到標準輸出中,但輸入輸出也能夠用選項if(input file,輸入文件)和of(output file,輸出文件)改變。
bb複製的基本使用方法以下:
$ dd if=/dev/stdin of=/dev/stdout bs=10 count=1 # 將輸出的英文字符轉換爲大寫再寫入文件 $ dd if=/dev/stdin of=test bs=10 count=1 conv=ucase
bs
(block size)用於指定塊大小(缺省單位爲 Byte,也可爲其指定如'K','M','G'等單位),
count
用於指定塊數量。
超過bs的多餘輸入將被截取並保留在標準輸入。
# 從/dev/zero設備建立一個容量爲 256M 的空文件virtual.img: $ dd if=/dev/zero of=virtual.img bs=1M count=256 $ du -h virtual.img
# 輸入 sudo mkfs 而後按下Tab鍵,你能夠看到不少個以 mkfs 爲前綴的命令,表明不一樣的文件系統格式 # 格式化virtual.img爲ext4格式 $ sudo mkfs.ext4 virtual.img
用戶在 Linux/UNIX 的機器上打開一個文件之前,包含該文件的文件系統必須先進行掛載的動做,此時用戶要對該文件系統執行 mount 的指令以進行掛載。
Linux/UNIX 文件系統能夠對應一個文件而不必定要是硬件設備,因此能夠掛載一個包含文件系統的文件到目錄樹。
對Mac安裝軟件方式的緣由理解又進了一步了。
具體使用方法以下:
# 查看下主機已經掛載的文件系統,每一行表明一個設備或虛擬設備格式[設備名]on[掛載點]: $ sudo mount ➜ ~ sudo mount Password: /dev/disk1 on / (hfs, local, journaled) devfs on /dev (devfs, local, nobrowse) map -hosts on /net (autofs, nosuid, automounted, nobrowse) map auto_home on /home (autofs, automounted, nobrowse) /dev/disk2s1 on /Volumes/微信web開發者工具 (hfs, local, nodev, nosuid, read-only, noowners, quarantine, mounted by zhangwang) # 掛載文件到目錄樹mount [-o [操做選項]] [-t 文件系統類型] [-w|--rw|--ro] [文件系統源] [掛載點] # 類型可省略,不少時候會自動識別 $ mount -o loop -t ext4 virtual.img /mnt # 以只讀方式掛載 $ mount -o loop --ro virtual.img /mnt
磁盤分區你們確定也很熟悉,Linux下對磁盤分區的方法也很簡單,示例以下
# 查看硬盤分區表信息 $ sudo fdisk -l # 進入磁盤分區模式 $ sudo fdisk virtual.img
到這裏,咱們初步初步瞭解了Linux的核心繫統,接下來咱們對Linux下的一些經常使用操做進行敘述。
不少人裝完系統後第一件事就是裝軟件,應用部分咱們也從軟件的安裝提及,仍是以Ubuntu爲例介紹軟件的安裝和卸載方法:
Linux上軟件的安裝有四種形式
在線安裝
從磁盤安裝deb安裝包
從二進制軟件包安裝
從源代碼安裝
在線安裝命令很簡潔,咱們先看使用方式,而後敘述每一步的意義:
$ sudo apt-get install cowsay # 若是你在安裝一個軟件以後,沒法當即使用Tab鍵補全這可命令,使用下述命令刷新 $ source ~/.zshrc
那麼安裝的過程究竟發生了什麼:
在本地的一個數據庫中搜索關於 cowsay 軟件的相關信息
根據這些信息在相關的服務器上下載軟件安裝
安裝某個軟件時,若是該軟件有其它依賴程序,系統會爲咱們自動安裝因此來的程序;
若是本地的數據庫不夠新,可能就會發生搜索不到的狀況,這時候須要咱們更新本地的數據庫,使用命令sudo apt-get update
可執行更新;
軟件源鏡像服務器可能會有多個,有時候某些特定的軟件須要咱們添加特定的源;
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給出的建議安裝的軟件包
實例
# 重裝 $ sudo apt-get --reinstall install w3m # 更新軟件源 $ sudo apt-get update # 升級沒有依賴問題的軟件包 $ sudo apt-get upgrade # 升級並解決依賴關係 $ sudo apt-get dist-upgrade # 卸載 $ sudo apt-get remove w3m # 不保留配置文件的移除 $ 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 …… 相關軟件的信息
有時候咱們也須要下載一些安裝包安裝,好比你想在Ubuntu下使用webstorm,就能夠在其官網上下載響應的deb軟件包,使用dpkg命令來安裝
dpkg的常見參數
-i
安裝指定deb包
-R
後面加上目錄名,用於安裝該目錄下的全部deb安裝包
-r
remove,移除某個已安裝的軟件包
-I
顯示deb包文件的信息
-s
顯示已安裝軟件的信息
-S
搜索已安裝的軟件包
-L 顯示已安裝軟件包的目錄信息
使用實例
$ cp /var/cache/apt/archives/emacs24_24.3+1-4ubuntu1_amd64.deb ~ # 安裝以前參看deb包的信息 $ sudo dpkg -I emacs24_24.3+1-4ubuntu1_amd64.deb # dpkg並不能爲你解決依賴關係 $ sudo dpkg -i emacs24_24.3+1-4ubuntu1_amd64.deb # 修復依賴關係的安裝 $ sudo apt-get -f install # 查看已安裝軟件包的安裝目錄 $ sudo dpkg -L emacs
二進制包的安裝比較簡單,咱們須要作的只是將從網絡上下載的二進制包解壓後放到合適的目錄,而後將包含可執行的主程序文件的目錄添加進PATH環境變量便可,若是你不知道該放到什麼位置,請從新複習第四節關於 Linux 目錄結構的內容。
說到了環境變量,接下來咱們仔細聊聊shell下的變量,並掌握添加環境變量的方法。
或許你也有過這樣的經歷,想經過命令行啓動某些操做,好比說使用VSCode時但願經過 在命令行中經過code ./project
命令打開相應的文件夾。
各編程語言中都有變量的概念,Shell中的變量也基本如此,變量有以下特色
有不一樣類型(但不用專門指定類型名)
能夠參與運算
有做用域限定。
咱們看看在bash中添加變量的方法:
#使用 declare 命令建立一個變量名爲 tmp 的變量 $ declare tmp: # 使用 = 號賦值運算符,將變量 tmp 賦值爲 God $ tmp=God # 讀取變量的值:使用 echo 命令和 $ 符號($ 符號用於表示引用一個變量的值) $ echo $tmp # 將輸出God ➜ ~
1.自定義變量:當前 Shell 進程私有用戶自定義變量,如上面咱們建立的 tmp 變量,只在當前 Shell 中有效。
相關命令:set
:顯示當前 Shell 全部變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量。
Shell 自己內建的變量
相關命令:env
:顯示與當前用戶相關的環境變量,還可讓命令在指定環境中運行。
從自定義變量導出的環境變量。
相關命令:export
:顯示從 Shell 中導出成環境變量的變量,也能經過它將自定義變量導出爲環境變量。
export temp
導出變量temp爲環境變量
一般咱們習慣將環境變量名設置爲大寫;
在全部的 UNIX 和類 UNIX 系統中,每一個進程都有其各自的環境變量設置,且默認狀況下,當一個進程被建立時,處理建立過程當中明確指定的話,它將繼承其父進程的絕大部分環境設置。Shell 程序也做爲一個進程運行在操做系統之上,而咱們在 Shell 中運行的大部分命令都將以 Shell 的子進程的方式運行。
環境變量,能夠簡單地理解成若是某變量在當前進程的子進程有效則爲環境變量,不然不是。(在Shell中輸入zsh或者bash其實就是建立了一個子shell)。
咱們也能夠安裝生存週期劃分Shell變量:
永久的:須要修改配置文件,變量永久生效;
臨時的:使用 export 命令行聲明便可,變量在關閉 shell 時失效。
永久變量涉及到兩個重要文件 /etc/bashrc
(有的 Linux 沒有這個文件) 和 /etc/profile
,它們分別存放的是 shell 變量和環境變量。 .profile
(不是/etc/profile
) 只對當前用戶永久生效。而寫在 /etc/profile
裏面的是對全部用戶永久生效,因此若是想要添加一個永久生效的環境變量,只須要打開 /etc/profile
,在最後加上你想添加的環境變量就好啦。
添加命令到環境變量幾乎是每一個使用Linux系統的人都會進行的操做:它實現了在 Shell 中輸入一個命令,能經過環境變量 PATH 來進行搜索並執行命令,PATH 裏面就保存了 Shell 中執行的命令的搜索路徑。
添加自定義路徑到"PATH"環境變量的具體方法以下:
一次性的:
# 這裏必定要使用絕對路徑 $ PATH=$PATH:/home/zhangwang/mybin # 給 PATH 環境變量追加了一個路徑,它也只是在當前 Shell 有效,我一旦退出終端,再打開就會發現又失效了。
經過上述設置,就能夠執行mybin
目錄下的全部命令了。
永久的:
想要永久的添加這類環境變量能夠用接下來額方法,每一個用戶的 home 目錄中有一個 Shell 每次啓動時會默認執行一個配置腳本,以初始化環境,包括添加一些用戶自定義環境變量等等。zsh 的配置文件是 .zshrc,相應 Bash 的配置文件爲 .bashrc 。它們在 etc 下還都有一個或多個全局的配置文件,不過咱們通常只修改用戶目錄下的配置文件。
# 能夠簡單地使用下面命令直接添加內容到 .zshrc 中 $ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中 >>
表示將標準輸出以追加的方式重定向到一個文件中
固然,你用vim等編輯器直接打開對應文件也是能夠實現相似的操做的。
有以下幾種方式:
${變量名#匹配字串}
: 從頭向後開始匹配,刪除符合匹配字串的最短數據
${變量名##匹配字串}
: 從頭向後開始匹配,刪除符合匹配字串的最長數據
${變量名%匹配字串}
: 從尾向前開始匹配,刪除符合匹配字串的最短數據
${變量名%%匹配字串}
: 從尾向前開始匹配,刪除符合匹配字串的最長數據
${變量名/舊的字串/新的字串}
:將符合舊字串的第一個字串替換爲新的字串
${變量名//舊的字串/新的字串}
: 將符合舊字串的所有字串替換爲新的字串
# 刪除變量temp $ unset temp
有時候修改了環境變量並未立刻生效可用下面這種方法使其立刻生效:
# 在修改了.zshrc文件後 $ source .zshrc # source有一個別名叫作.所以能夠用下面的方法使得理解生效(第一個點後面有一個空格,且路徑須要爲絕對路徑或者相對路徑) $ . ./.zshrc
文件的打包和壓縮是另外一種咱們可能會常作的操做,好比說你想在服務器上部署一個wiki系統,下載了dokuwiki的壓縮文件夾,這時候就須要解壓啦。
*.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
壓縮打包程序# 代碼引用自實驗樓相關課程 $ zip -r -q -o shiyanlou.zip /home/shiyanlou # 查看文件大小 $ du -h shiyanlou.zip $ file shiyanlou.zip # 設置不一樣壓縮等級 $ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou -x ~/*.zip $ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou -x ~/*.zip $ du -h -d 0 *.zip ~ | sort # 建立加密 $ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou # 解決windows和linux對換行的不一樣處理問題 $ zip -r -l -o shiyanlou.zip /home/shiyanlou
參數說明:
-r
:表示遞歸打包包含子目錄的所有內容
-q
:表示爲安靜模式,即不向屏幕輸出信息
-o
:表示輸出文件,需在其後緊跟打包輸出文件名
-[1-9]
:設置壓縮等級,1 表示最快壓縮但體積大,9 表示體積最小但耗時最久。
-x
:排除咱們上一次建立的 zip 文件,不然又會被打包進這一次的壓縮文件中
-e
:建立加密壓縮包
-l
:將 LF
(換行) 轉換爲 CR+LF
(windows 回車加換行)
unzip
命令解壓縮zip文件# 基本使用 $ unzip shiyanlou.zip # 靜默且指定解壓目錄,目錄不存在會自動建立 $ unzip -q shiyanlou.zip -d ziptest # 使用 -O(英文字母,大寫 o)參數指定編碼類型 $ unzip -O GBK 中文壓縮文件.zip
rar
打包壓縮命令# 安裝 $ sudo apt-get update $ sudo apt-get install rar unrar # 基本使用,a(沒有`-`) 參數添加一個目錄 ~ 到一個歸檔文件中,若是該文件不存在就會自動建立 $ rar a shiyanlou.rar . # 從指定壓縮包文件中刪除某個文件: $ rar d shiyanlou.rar .zshrc # 查看不解壓文件: $ rar l shiyanlou.rar # 全路徑解壓: $ rar l shiyanlou.rar # 去掉路徑解壓: $ mkdir tmp $ unrar e shiyanlou.rar tmp/
tar
的使用說明:
tar 本來只是一個打包工具,只是同時仍是實現了對 7z、gzip、xz、bzip2 等工具的支持,這些壓縮工具自己只能實現對文件或目錄(單獨壓縮目錄中的文件)的壓縮,沒有實現對文件的打包壓縮,因此咱們也無需再單獨去學習其餘幾個工具,tar 的解壓和壓縮都是同一個命令,只需參數不一樣,使用比較方便。
# 建立一個 tar 包: $ tar -cf shiyanlou.tar ~ # 解壓 $ mkdir tardir $ tar -xf shiyanlou.tar -C tardir # 查看不解包文件 -t 參數 $ tar -tf shiyanlou.tar # 建立不一樣格式壓縮文件(gzip) $ tar -czf shiyanlou.tar.gz ~ #解壓gzip $ tar -xzf shiyanlou.tar.gz
-c
:建立一個 tar 包文件
-f
:指定建立的文件名,文件名必須寫在-f參數後
-v
:以可視的的方式輸出打包的文件
-P
:保留絕對路徑符(默認不保留,防止解壓到根目錄)
-x
:解壓
-C
:解壓到指定路徑的已存在目錄
-z
:使用gzip壓縮
其它壓縮格式
*.tar.gz
:-z
*.tar.xz
:-J
*.tar.bz2
:-j
Linux下的命令很是多,遇到不熟悉的命令的狀況很常見,不過在Linux獲取相應的幫助的方法也很簡單,主要有如下幾種方法:
help
help 命令是用於顯示 shell 內建命令的簡要幫助信息。幫助信息中顯示有該命令的簡要說明以及一些參數的使用以及說明。
使用:help exit
man
man 沒有內建與外部命令的區分,由於 man 工具是顯示系統手冊頁中的內容,也就是一本電子版的字典,這些內容大多數都是對命令的解釋信息,還有一些相關的描述。經過查看系統文檔中的 man 也能夠獲得程序的更多相關信息和 Linux的更多特性。
使用:man cowsay
info
獲得的信息比 man 還要多,info 來自自由軟件基金會的 GNU 項目,是 GNU 的超文本幫助系統,可以更完整的顯示出 GNU 信息。
man 和 info 就像兩個集合,它們有一個交集部分,但與 man 相比,info 工具可顯示更完整的 GNU 工具信息。若 man 頁包含的某個工具的概要信息在 info 中也有介紹,那麼 man 頁中會有「請參考 info 頁更詳細內容」的字樣。
使用:info ls
crontab 命令常見於 Unix 和類 Unix 的操做系統之中,用於設置週期性被執行的指令。該命令從輸入設備讀取指令,並將其存放於 crontab 文件中,以供以後讀取和執行。一般,crontab 儲存的指令被守護進程激活,crond 爲其守護進程,crond 經常在後臺運行,每一分鐘會檢查一次是否有預約的做業須要執行。
經過 crontab 命令,咱們能夠在固定的間隔時間執行指定的系統指令或 shell script 腳本。時間間隔的單位能夠是分鐘、小時、日、月、周的任意組合。好比咱們須要天天半夜兩點鐘自動在線更新數據源,用這個命令進行相關設置就能夠實現啦。
crontab
命令使用步驟啓動rsyslog
方便查看日誌信息:sudo service rsyslog start
;
啓動crontab
:sudo cron -f &
;
添加任務:crontab -e
,選擇合適的編輯器,這裏選擇1,最後一排咱們能夠看到計劃任務的格式# m h dom mon dow command
;(分 時 日 月 周 命令)
在文檔最後一排添加以下命令:*/1 * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)
(每分鐘添加一個以當前時間日期命名的空白文件)
使用crontab -l
,查看添加了那些任務;
肯定咱們的 cron 是否成功的在後臺啓動,方式1:ps aux | grep cron
或pgrep cron
;
在日誌系統中查看信息反饋:sudo tail -f /var/log/syslog
;
刪除任務:crontab -r
;
每一個用戶使用 crontab -e 添加計劃任務,都會在 /var/spool/cron/crontabs
中添加一個該用戶本身的任務文檔,這樣目的是爲了隔離。以 sudo 權限編輯 /etc/crontab 文件就能夠添加系統級別的定時任務;
crontab -e 表示爲當前用戶添加計劃任務 sudo crontab -e 表示爲root用戶添加計劃任務
cron 服務監測時間最小單位是分鐘,因此 cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron/crontabs 裏面的內容。
/etc/cron.daily,目錄下的腳本會天天執行一次,在天天的6點25分時運行;
/etc/cron.hourly,目錄下的腳本會每一個小時執行一次,在每小時的17分鐘時運行;
/etc/cron.mouthly,目錄下的腳本會每個月執行一次,在每個月1號的6點52分時運行;
/etc/cron.weekly,目錄下的腳本會每週執行一次,在每週第七天的6點47分時運行;
簡單的順序執行能夠安裝如下方法,以;
分隔衆多命令,shell會自動執行:
$ sudo apt-get update;sudo apt-get install some-tool;some-tool
不過咱們也能夠有選擇的執行命令:&& 和 ||
的使用:
&&
:表示當前一條命令知足條件時執行後面的語句:
$ which cowsay>/dev/null && cowsay -f head-in ohch~
||
:當前的命令不知足條件時執行的後面的語句
$ 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"
注:使用
$?
能夠獲取上一個命令的返回值(成功爲0,不成功爲1),which命令在前文中有敘述;
管道是一種通訊機制,一般用於進程間的通訊(也可經過socket進行網絡通訊),它表現出來的形式就是將前面每個進程的輸出(stdout)直接做爲下一個進程的輸入(stdin)。
管道又分爲匿名管道和具名管道。咱們在使用一些過濾程序時常常會用到的就是匿名管道,在命令行中由|分隔符表示,|在前面的內容中咱們已經屢次使用到了。具名管道簡單的說就是有名字的管道。
# 獲取etc文件下的詳細信息,並以less的方式顯示 $ ls -al /etc | less
前面已經講述了不少Shell下的經常使用命令,下面在列出一塊兒其它經常使用的命令
cut
命令,打印每一行的某一字段# 打印/etc/passwd文件中以:爲分隔符的第1個字段和第6個字段分別表示用戶名和其家目錄: $ cut /etc/passwd -d ':' -f 1,6 # 前五個(包含第五個) $ cut /etc/passwd -c -5 # 前五個以後的(包含第五個) $ cut /etc/passwd -c 5- # 第五個 $ cut /etc/passwd -c 5 # 2到5之間的(包含第五個) $ cut /etc/passwd -c 2-5
-d
:用來定義分隔符,默認爲tab鍵,通常與-f配合使用(若是分隔符是空格,必須是兩個單引號之間確實有一個空格,是一個哦,不是支持多個)
-f
:須要選取的字段,根據-d切分的字段集選取,下標從1開始
-s
:表示不包括那些不含分隔符的行,用於去掉註釋或者標題一類的信息
-c
:以字符爲單位進行分割,能夠選取指定字符
-b
:以字節爲單位進行分割,能夠選取指定字節,這些字節位置將忽略多字節字符邊界(好比:漢字),除非同時指定了-n參數
-n
:取消分割多字節字符,只能和-b參數配合使用,即若是字符的最後一個字節落在由-b參數列表指定的範圍以內,則該字符將被選出,不然,該字符將被排除。
grep命令是很強大的,也是至關經常使用的一個命令,它結合正則表達式能夠實現很複雜卻很高效的匹配和查找
查找,按照單引號匹配的內容進行搜索grep -n 'a' abc.txt
:搜索abc.txt 文件中帶a的內容- n
:表示結果中帶有行號。- i
:忽略大小寫-v
: 取反 grep -v -n 'a' abc.txt
:不帶a
grep [命令選項]... 用於匹配的表達式 [文件]...
# 搜索/home/zhangwang目錄下全部包含"zhangwang"的全部文本文件,並顯示出如今文本中的行號: $ grep -rnI "zhangwang" ~
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
sort
排序命令將輸入按照必定方式排序,而後再輸出,它支持的排序有按字典排序,數字排序,按月份排序,隨機排序,反轉排序,指定特定字段進行排序等等。
# 字典排序 $ cat /etc/passswd | sort # 反轉排序 $ cat /etc/passwd | sort -r # 按特定字段排序 $ cat /etc/passwd | sort -t':' -k 3 # 按照數字排序就要加上-n參數 $ cat /etc/passwd | sort -t':' -k 3 -n
-t參數用於指定字段的分隔符,這裏是以":"做爲分隔符;-k 字段號用於指定對哪個字段進行排序
uniq命令能夠用於過濾或者輸出重複行。
# 讓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 | uniq -dc # 輸出全部重複的行 $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D
使用vim
等編輯器固然能夠進行文本處理,不過這裏咱們要討論的是使用命令來進行文本處理
tr
命令刪除使用方法tr [option]...SET1 [SET2]
經常使用選項
選項 說明
-d
刪除和set1匹配的字符,注意不是全詞匹配也不是按字符順序匹配
-s
去除set1指定的在輸入文本中連續並重復的字符
實例:
# 刪除 "hello world" 中全部的'o','l','h' $ echo 'hello world' | tr -d 'olh' # 將"hello" 中的ll,去重爲一個l $ echo 'hello' | tr -s 'l' # 將輸入文本,所有轉換爲大寫或小寫輸出 $ cat /etc/passwd | tr '[:lower:]' '[:upper:]' # 上面的'[:lower:]' '[:upper:]'你也能夠簡單的寫做'[a-z]' '[A-Z]',固然反過來將大寫變小寫也是能夠的
col
命令進行轉換使用方法col [option]
選項
選項 說明
-x 將Tab轉換爲空格
-h 將空格轉換爲Tab(默認選項)
cat
命令打印文件內容打印文件內容,加劇定向可實現複製功能:
cat 01.py > laowang.txt
,把文件01.py的內容添加到laowang.txt中。
同時打印多個文件的內容,後面的文件在後面顯示
cat 01.py 02.py > laozhang.txt
: 合併多個文件到某個文件中;
實例:
# 查看 /etc/protocols 中的不可見字符,能夠看到不少 ^I ,這其實就是 Tab 轉義成可見字符的符號 $ cat -A /etc/protocols # 使用 col -x 將 /etc/protocols 中的 Tab 轉換爲空格,而後再使用 cat 查看,你發現 ^I 不見了 $ cat /etc/protocols | col -x | cat -A
join
命令合併文件內容將兩個文件中包含相同內容的那一行合併在一塊兒。
使用方式:join [option]... file1 file2
選項
選項 說明
-t 指定分隔符,默認爲空格
-i 忽略大小寫的差別
-1 指明第一個文件要用哪一個字段來對比,,默認對比第一個字段
-2 指明第二個文件要用哪一個字段來對比,,默認對比第一個字段
paste
命令合併文件與join
命令相似,它是在不對比數據的狀況下,簡單地將多個文件合併一塊兒,以Tab隔開。
使用方法paste [option] file...
常見參數
-d 指定合併的分隔符,默認爲Tab
-s 不合併到一行,每一個文件爲一行
還記得在Linux下輸入輸出也是文件麼,數據流重定向的做用就是將本來輸出到標準輸出的數據重定向到一個文件中.
對輸入輸出的描述--三個特殊設備
stdin
(標準輸入,對應於你在終端的輸入),0
/dev/stdin
標準輸入
stdout
(標準輸出,對應於終端的輸出),1
/dev/stdout
標準輸出
stderr
(標準錯誤輸出,對應於終端的輸出)2
/dev/stderr
標準錯誤
文件描述符:文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核爲每個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者建立一個新文件時,內核向進程返回一個文件描述符。在程序設計中,一些涉及底層的程序編寫每每會圍繞着文件描述符展開。可是文件描述符這一律念每每只適用於 UNIX、Linux 這樣的操做系統。
重定向模式有兩種:>
:將標準輸出導向一個文件(若是該文件已經存在,則清空以前的文件)>>
:將標準輸出追加到一個文件中
使用實例
➜ ~ echo 'lalala' > redirect ➜ ~ echo 'lalalalala' >> redirect ➜ ~ cat redirect lalala lalalalala ➜ ~
# 將標準錯誤重定向到標準輸出,再將標準輸出重定向到文件,注意要將重定向到文件寫到前面 $ cat Documents/test.c hello.c >somefile 2>&1 # 或者只用bash提供的特殊的重定向符號"&"將標準錯誤和標準輸出同時重定向到文件 $ cat Documents/test.c hello.c &>somefilehell
tee
命令同時重定向到多個文件將須要將輸出重定向到文件以外也須要將信息打印在終端
➜ ~ echo 'hello shiyanlou' | tee hello hello shiyanlou ➜ ~ cat hello hello shiyanlou ➜ ~
exec
命令可使用exec命令實現「永久」重定向。exec命令的做用是使用指定的命令替換當前的 Shell,及使用一個進程替換當前進程,或者指定新的重定向:
# 先開啓一個子 Shell $ zsh # 使用exec替換當前進程的重定向,將標準輸出重定向到一個文件 $ exec 1>somefile # 後面你執行的命令的輸出都將被重定向到文件中,直到你退出當前子shell,或取消exec的重定向(後面將告訴你怎麼作) $ ls $ exit $ cat somefile Applications Calibre 書庫 Desktop Documents Downloads Dropbox Git GitBook Library Movies Music Pictures Projects Public WebstormProjects
默認在 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 $ exec 3>&- $ cd /dev/fd;ls -Al;cd -
在類 UNIX 系統中,
/dev/null
,或稱空設備,是一個特殊的設備文件,它一般被用於丟棄不須要的輸出流,或做爲用於輸入流的空文件,這些操做一般由重定向完成。讀取它則會當即獲得一個EOF。
$ cat Documents/test.c nefile 1>/dev/null 2>&1
查看日誌能夠幫咱們瞭解不少問題
常見的日誌通常存放在 /var/log 中
日誌的分類
系統日誌
應用日誌
系統日誌主要是存放系統內置程序或系統內核之類的日誌信息如 alternatives.log 、btmp 等等,應用日誌主要是咱們裝的第三方應用所產生的日誌如 tomcat7 、apache2 等等。
對不一樣日誌名稱及其描述以下:
日誌名稱 記錄信息
alternatives.log 系統的一些更新替代信息記錄
apport.log 應用程序崩潰信息記錄
apt/history.log 使用apt-get安裝卸載軟件的信息記錄
apt/term.log 使用apt-get時的具體操做,如 package 的下載打開等
auth.log 登陸認證的信息記錄
boot.log 系統啓動時的程序服務的日誌信息
btmp 錯誤登錄的信息記錄
Consolekit/history 控制檯的信息記錄
dist-upgrade dist-upgrade這種更新方式的信息記錄
dmesg 啓動時,顯示屏幕上內核緩衝信息,與硬件有關的信息
dpkg.log dpkg命令管理包的日誌。
faillog 用戶登陸失敗詳細信息記錄
fontconfig.log 與字體配置有關的信息記錄
kern.log 內核產生的信息記錄,在本身修改內核時有很大幫助
lastlog 用戶的最近信息記錄
wtmp 登陸信息的記錄。wtmp能夠找出誰正在登錄進入系統,誰使用命令顯示這個文件或信息等
syslog 系統信息記錄
查看方法less auth.log
固然查看也能夠用以前接觸到的其它方法more
、cat
等等。
注:wtmp,lastlog兩個日誌不能直接用 less、cat、more 這樣的工具來查看。其查看方法是使用last 與 lastlog 工具來提取其中的信息
一種是由軟件開發商本身來自定義日誌格式而後指定輸出日誌位置,
還有一種方式就是 Linux 提供的日誌服務程序,而咱們這裏系統日誌是經過 syslog 來實現,提供日誌管理服務。
syslog 是一個系統日誌記錄程序,在早期的大部分 Linux 發行版都是內置 syslog,讓其做爲系統的默認日誌收集工具,雖然時代的進步與發展,syslog 已經年老體衰跟不上時代的需求,因此他被 rsyslog 所代替了,較新的Ubuntu、Fedora 等等都是默認使用 rsyslog 做爲系統的日誌收集工具
# 開啓 sudo service rsyslog start ps aux | grep syslog
rsyslog 的配置文件有兩個,
一個是 /etc/rsyslog.conf
:第一個主要是配置的環境,也就是 rsyslog 的加載什麼模塊,文件的所屬者等;
一個是 /etc/rsyslog.d/50-default.conf
。而第二個主要是配置的 Filter Conditions;
rsyslog 主要是由 Input、Output、Parser 這樣三個模塊構成的,而且瞭解到數據的簡單走向,首先經過 Input module 來收集消息,而後將獲得的消息傳給 Parser module,經過分析模塊的層層處理,將真正須要的消息傳給 Output module,而後便輸出至日誌文件中。
又是好長的一篇讀書筆記,但願你在看完以後有所收穫,但願本文能助你打開Linux的使用大門,附上我以爲比較好shell,Linux學習資料以下:
多練習總能有所收穫,祝學習愉快?。