基本命令(2)+管道符、重定向、環境變量

      基本命令僅剩3個,但這三個很重要,在日常會多次使用

   1.打包壓縮與搜索命令

      1.1 tar命令

      tar命令用於對文件進行打包壓縮或解壓,格式為:tar [選項] [文件]。Linux中比較常見的壓縮格式很多,主要使用的是.tar或.tar.gz或.tar.bz2格式。這幾個壓縮格式都是使用tar命令壓縮生成的

參數 作用
-c 創建壓縮文件
-x 解開壓縮文件
-z 用Gzip格式壓縮或解壓
-j 用bzip2格式壓縮或解壓
-v 顯示壓縮或解壓的過程
-f 目標文件名
-C 解壓到指定目錄
-t 查看壓縮包內有哪些文件

      通過參數可以知道-c和-x參數不能同時使用;-z參數和-j參數的壓縮格式不同,所以二者也不能同時使用。
      假設,我們需要壓縮的文件很多也很大,再加上終端在執行完一個任務之前是不會顯示新的命令行的,我們就可能因為長時間的沒有提示而認為系統死機了,那麼使用-v參數就顯得很便利了。
      -f參數很重要,它必須放在參數的最後一位,代表需要壓縮或解壓的文件名稱。
      綜合上面幾條就能看到壓縮文件和解壓文件的具體參數了。
壓縮文件為.tar:tar -cvf 文件名.tar 目錄或文件

壓縮格式為.tar.gz:tar -czvf 文件名.tar.gz 目錄或文件

壓縮格式為.tar.bz2:tar -cjvf 文件名.tar.bz2 目錄或文件

查看壓縮包內的文件

      解壓基本同壓縮,僅僅時將參數c換為參數x,我便不放截圖了。
將需要解壓的文件解壓到置頂目錄(以.tar.bz2為例):tar -xjvf 文件名.tar.bz2 -C 目錄

      當出現未知格式的壓縮包時(使用tar命令壓縮),可以嘗試使用tar -xvf進行解壓。Linux不存在後綴名,所以不論是.tar或.tar.gz或.tar.bz2都可以換成其他的形式,而使用上面的這些格式是給使用壓縮包的用戶減少工作量。

      1.2 grep命令

      grep命令用於在文本中執行關鍵詞搜索,並顯示匹配的結果,格式為:grep [選項] [文件]
      grep命令相比較於cut命令是按行提取。

參數 作用
-b 將可執行文件當作文本文件來搜索
-c 僅顯示找到的行數
-i 忽略大小寫
-n 顯示行號
-v 反向選擇——僅列出沒有關鍵詞的行

      grep是使用相當廣泛的文本搜索匹配工具。
查找系統中不允許登錄的賬戶:grep /sbin/nologin /etc/passwd

      1.3 find命令

      find命令用於按照指定條件來查找文件,格式為:tar [查找路徑] 參數 操作
      find命令比較特殊,它沒有短格式,同時他的長格式只有一個「-」,同時find命令需要消耗很大的系統資源。

參數 作用
-name 匹配名稱
-user 匹配所有者
-group 匹配所有組
-perm 匹配權限(mode為完全匹配,-mode為包含即可)
-nouser 匹配沒有所有者的文件
-nogroup 匹配沒有所有組的文件
-newer f1 ! f2 匹配比文件1新但比文件2舊的文件
-size 匹配文件的大小

      匹配指定文件大小可以使用「+」「-」號表示大於或小於特定大小的文件,同時需要指名單位。

b——塊(512位元組)
c——位元組
k——千位元組
M——兆位元組
G——吉位元組

      例搜索大小為1MB的文件:find / -size 1M

全盤搜索指定名稱的文件:find / -name 文件名`

搜索所有屬於特定用戶的文件:find / -user 用戶名

      可以看到有一個報錯信息說proc目錄下的某某某不是一個文件也不是一個目錄,這是正常的。

      如果我們需要查找的不是文件而是命令呢,這時候就需要whereis命令來幫忙了:whereis 命令名

   2、重定向

      輸入重定向:將文件內容導入到命令中
      輸出重定向:將命令的結果導入到文件中

標準輸入重定向:文字描述符為0,默認從鍵盤輸入,也可以從其他文件或命令中輸入
標準輸出重定向:文字描述符為1,默認輸出到屏幕
錯誤輸出重定向:文字描述符為2.默認輸出到屏幕

輸出重定向很容易:uptime > uptime.txt

輸入重定向是很少用的

      上面是兩個重定向的內容我理解也不是很清楚。第一個輸入重定嚮導入的是uptime.txt里的信息而不是文件本身,即將uptime.txt文件的內容導入到wc命令中,命令對內容進行了操作,相當於下面的例子。

   3、管道符

      現在再說一下之前見到的一個符號,在前面用命令將文件內的所有小寫字母換成了大寫字母。
      管道符的格式為:命令A | 命令 B。簡單的描述這個命令就是「把前一個命令要輸出到屏幕的信息作為後一個命令的輸入進行又一次處理」。
      前面grep命令已經知道怎麼獲取不允許登錄的賬戶信息,因為內容太多無法完全顯示。現在需要知道有多少個賬戶就需要使用管道符和wc命令的合作:grep /sbin/nologin //etc/passwd | wc -l

      管道符就像一個制勝法寶,通過嵌套不同的命令我們可以得到想要的信息。比如/etc目錄下眾多的文件,可以用ls命令和more命令的結合分頁查看都有那些文件。

      實際上管道符可以進行多個命令進行嵌套,你不僅限於兩個命令,比如:命令A | 命令B | 命令C|……

   4、命令行的通配符

      Linux系統內文件眾多,時間一長我們就忘記了自己曾經創建的文件在哪、叫什麼。所以在日常使用的時候就需要使用通配符進行查找。
      現在我想看一下我的硬盤分區權限屬性,其中一種方法是:ls -l /dev/sdals -l /dev/sda1ls -l /dev/sda2一一查看。這樣可以,但是數量一多就顯得不現實。
      通配符就可以完美解決這個問題。通配符就是通用的匹配信息的字符。

星號(*):代表零個或者多個字符
問號(?):代表一個字符
中括號([]):不同的格式代表不同的匹配內容

比如上面說的硬盤分區權限信息,就可以用星號來匹配:ls -l /dev/sda*

可以看到使用星號時/dev/sda本身也被匹配到了。而問號和中括號則沒有匹配到sda本身。[0-9]想來也能理解,就是從0開始不停的對比,直到9為止;[1,3,5]這個其實可以不加逗號,但是建議加上,因為雖然電腦可以理解時1,3,5三個數,但是人會讀錯,可以是1,35,也可以是13,5同時也可以直接理解成135。我們加上逗號的作用就是為了防止歧義產生。

   5、常用轉義字符

      有4種轉義字符是比較常見的:

反斜杠():使反斜杠後面的一個變量變為單純的字符串
單引號(”):使單引號內的所有變量轉義為單純的字符串
雙引號(“”):保留期中的變量屬性,不對其進行轉義處理
反引號(‘“):把其中的命令執行後返回結果

      先對變量賦值在輸出變量。我要輸出「價格為15美元」 的內容。直接在變量前加$是不可以的,兩個$$是顯示當前程序的pid號,不是我們預期的信息。所以我們用反斜杠對其轉義

      那麼如果我需要10個”$”符號呢,我分別加一個反斜杠?可以。如果是100個,1000個呢?顯然不現實,單引號便是首選,只需要開頭和結尾分別放置單引號的一部分就可以了,其中的所有特殊字符全部變成了普通的字符串。

      雙引號呢,好像沒有那麼明顯。其實不是的,echo輸出的文字是需要雙引號引起的,但是他可以省略雙引號,只有特殊的時候不能省略,所以表現不是很明顯。輸出價格的截圖中可以看到雙引號內的特殊字符並沒有發生變化。

   6、重要的環境變量

      環境變量是計算機系統用於保存可變值的數據類型。在Linux中變量名稱一般都是大寫的,這是一種約定俗成的規範。我們可以通過變量名提取相應的變量值。
      我們執行一個命令要經歷4個步驟;

步驟1:判斷用戶是否以絕對路徑或相對路徑的方法輸入命令,如果是則直接執行
步驟2:Linux系統檢查用戶輸入的命令是否有別名
步驟3:bash解釋器判斷用戶輸入的是內部命令還是外部命令,外部命令交給步驟4執行
步驟4:系統在多個路徑中查找用戶輸入的命令文件

      systemtl restart network是重啟網卡的命令,使用別名可以簡化操作。當然使用這種方式創建的別名都是臨時的。如果想要修改別名可以使用whereis alias來查找alias所在目錄進行修改。

      我們使用的99%的命令都是外部命令,只有1%的命令是前面三個步驟。
      比較不同的用戶在使用相同的變量時是可以有不同值的.比如:root用戶使用echo $HOME時和普通用戶使用echo $HOME是不一樣的。
      我們可以用env命令查看所有的環境變量。

      在我們設置的變量都是局部變量,換個可能換個目錄就不能使用了.這時候我們就需要用export 變量名的方式將變量設置為全局變量。這個設置好的變量不是永久的,想將變量設置為永久的需要修改文件才可以。文件有兩個,只需要修改其中之一就可以了。一個是etc目錄下的profile文件,一個是家目錄下的.bashrc文件。如果存在兩個同名變量,新設置的變量將會覆蓋舊的變量。