Linux Shell 基礎知識(二)

  • 2019 年 10 月 10 日
  • 筆記

1.本文知識結構

2.文件的查詢與檢索

2.1. cd 目錄切換

  • 找到文件/目錄位置:cd
  • 切換到上一個工作目錄: cd –
  • 切換到home目錄: cd or cd ~
  • 顯示當前路徑: pwd
  • 更改當前工作路徑為path: $cd path

2.2. locate 查找目錄及文件

  • find 實時查找
  • locate 為文件系統建立索引資料庫,如果有文件更新,需要定期執行更新命令來更新索引庫,在查找文件之前要先更新資料庫
# 搜尋文件或目錄:  $find ./ -name "core*" | xargs file    # 查找目標文件夾中是否有obj文件:  $find ./ -name '*.o'    # 遞歸當前目錄及子目錄刪除所有.o文件  $find ./ -name "*.o" -exec rm {} ;    # 尋找包含有string的路徑  $updatedb  $locate string

2.3. chown 文件與目錄許可權修改

  • 改變文件的擁有者 chown
  • 改變文件讀、寫、執行等屬性 chmod
  • 遞歸子目錄修改: chown -R tuxapp source/
  • 增加腳本可執行許可權: chmod a+x myscript

2.4. 管道和重定向

  • 批處理命令連接執行,使用 |
  • 串聯: 使用分號 ;
  • 前面成功,則執行後面一條,否則,不執行:&&
  • 前面失敗,則後一條執行: ||
  • 重定向: >

3.文本處理

3.1. find 文件查找

find命令用來在指定目錄下查找文件。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件,並且將查找到的子目錄和文件全部進行顯示。

一般來說,其語法格式為:

find path -option [ -print ] [ -exec -ok command ] {} ;

find 後分為兩部分: path 和 expression ,以 第一個 – 為分隔線。如果 path 是空字串則使用目前路徑,如果 expression 是空字串則使用 -print 為預設 expression。

常用的expression選項

選項 含義
-mount, -xdev 只檢查和指定目錄在同一個文件系統下的文件,避免列出其它文件系統中的文件
-amin n 在過去 n 分鐘內被讀取過
-anewer file 比文件 file 更晚被讀取過的文件
-atime n 在過去 n 天內被讀取過的文件
-cmin n 在過去 n 分鐘內被修改過
-cnewer file 比文件 file 更晚被更新過的文件
-ctime n 在過去 n 天內被修改過的文件
-empty 空的文件
-gid n , -group name gid 是 n 或是 group 名稱是 name的文件
-ipath p , path p 路徑名稱符合 p 的文件,ipath 會忽略大小寫
-name name , -iname name 文件名稱符合 name 的文件。iname 會忽略大小寫
-size n 文件大小 是 n 單位。b 代表 512 位元組的區塊,c 表示字元數,k 表示 kilo bytes,w 是二個位元組
-type c 文件類型是 c 的文件。d 代表目錄,c 代表字型裝置文件,b 代表區塊裝置文件,p 代表具名貯列,f 代表一般文件,l 代表符號連結,s 代表socket
-pid n process id 是 n 的文件

另外,在find查找文件也是可以使用正則表達式的。

使用正則表達式查詢需要的選項有兩個:-regextype 和 -regex。—-regextype 指定正則匹配的類型,可用的選項有很多,常見的有:’awk’ , ‘egrep’ , ‘ed’, ’emacs’, ‘grep’, ‘sed’ 等,不同匹配模式匹配的結果不一樣。默認是emacs。

-regex pattern 表示文件名與正則表達式 pattern 匹配。這是對整個路徑的匹配,不是搜索文件。即書寫正則表達式時要考略前面的路徑。

3.2. grep 文本搜索

grep 指令用於查找內容包含指定的範本樣式的文件,如果發現某文件的內容符合所指定的範本樣式,預設 grep 指令會把含有範本樣式的那一列顯示出來。

其一般語法為:

grep [ options ] pattern [file]

常見的 options 選項

短命令 長命令 含義
-a –text 不要忽略二進位的數據
-A –after-context = 行數 除了顯示符合範本樣式的那一行之外,並顯示該行之後的內容
-b –byte-offset 在顯示符合樣式的那一行之前,標示出該行第一個字元的編號
-c –count 計算符合樣式的列數
-C –context = 行數 除了顯示符合樣式的那一行之外,並顯示該行之前後的內容
-d –directories = 動作 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep指令將回報資訊並停止動作
-e –regexp = 範本樣式 指定字元串做為查找文件內容的樣式
-E –extended-regexp 將樣式為延伸的正則表達式來使用
-f –file = 規則 指定規則文件,其內容含有一個或多個規則樣式,讓grep查找符合規則條件的文件內容,格式為每行一個規則樣式
-F –fixed-regexp 將樣式視為固定字元串的列表
-G –basic-regexp 將樣式視為普通的表示法來使用
-h –no-filename 在顯示符合樣式的那一行之前,不標示該行所屬的文件名稱
-H –with-filename 在顯示符合樣式的那一行之前,表示該行所屬的文件名稱
-i –ignore-case 忽略字元大小寫的差別
-l –file-with-match 列出文件內容符合指定的樣式的文件名稱
-L –file-without-match 列出文件內容不符合指定的樣式的文件名稱
-n –line-number 在顯示符合樣式的那一行之前,標示出該行的列數編號
-o –only-matching 只顯示匹配 pattern 部分
-q –quiet , –silent 不顯示任何資訊
-r –recursive 此參數的效果和指定"-d recurse"參數相同
-s –no-messages 不顯示錯誤資訊
-v –revert-match 顯示不包含匹配文本的所有行
-V –version 顯示版本資訊
-w –word-regexp 只顯示全字元合的列
-x –line-regexp 只顯示全列符合的列
-y 此參數的效果和指定 -i 參數相同

3.3. xargs 命令行參數轉換

xargs 是給命令傳遞參數的一個過濾器,也是組合多個命令的一個工具。xargs 可以將管道或標準輸入(stdin)數據轉換成命令行參數,也能夠從文件的輸出中讀取數據。之所以能用到這個命令,關鍵是由於很多命令不支援|管道來傳遞參數,而日常工作中有有這個必要,所以就有了 xargs 命令。xargs 一般是和管道一起使用。

其一般語法為:

somecommand | xargs -item command

常見的item選項

選項 含義
-a file 從文件中讀入作為sdtin
-e flag 當xargs分析到含有flag這個標誌的時候就停止,默認為’_’
-p 當每次執行一個argument的時候詢問一次用戶
-n num 後面加次數,表示命令在執行的時候一次用的argument的個數,默認是用所有的
-t 先列印命令,然後再執行
-r no-run-if-empty 當xargs的輸入為空的時候則停止xargs,不用再去執行了
-s num 命令行的最大字元數,指的是 xargs 後面那個命令的最大命令行字元數
-L num 從標準輸入一次讀取 num 行送給 command 命令
-d delim 分隔符,默認的xargs分隔符是回車,argument的分隔符是空格,這裡修改的是xargs的分隔符
-x exit的意思,主要是配合-s使用
-P 修改最大的進程數,默認是1,為0時候為as many as it can

3.4. uniq 刪除重複

uniq 命令用於檢查及刪除文本文件中重複出現的行列,一般與 sort 命令結合使用。

# 消除重複行  $ sort unsort.txt | uniq    # 統計各行在文件中出現的次數  $ sort unsort.txt | uniq -c    # 找出重複行  $ sort unsort.txt | uniq -d

3.5. tr 字元轉換

tr 命令用於轉換或刪除文件中的字元。它從標準輸入設備讀取數據,經過字元串轉譯後,將結果輸出到標準輸出設備。

其一般語法為:

tr [options]  SET1 [SET2]

常見options選項

短命令 長命令 含義
-c –complement 反選設定字元。也就是符合 SET1 的部份不做處理,不符合的剩餘部份才進行轉換
-d –delete 刪除指令字元
-s –squeeze-repeats 縮減連續重複的字元成指定的單個字元
-t –truncate-set1 削減 SET1 指定範圍,使之與 SET2 設定長度相等

常見SET字元含義

字元 含義
NNN 八進位值為NNN的字元
\ 反斜杠
a 終端鳴響
b 退格
f 換頁
n 換行
r 回車
t 水平製表符
v 垂直製表符
char1-char2 從char1到char2的升序遞增過程中經歷的所有字元
[:alnum:] 所有的字母和數字
[:alpha:] 所有的字母
[:blank:] 所有呈水平排列的空白字元
[:cntrl:] 所有的控制字元
[:digit:] 所有的數字
[:graph:] 所有的可列印字元,不包括空格
[:lower:] 所有的小寫字母
[:print:] 所有的可列印字元,包括空格
[:punct:] 所有的標點字元
[:space:] 所有呈水平或垂直排列的空白字元
[:upper:] 所有的大寫字母
[:xdigit:] 所有的十六進位數
[=char=] 所有和指定char相等的字元

3.6. cut、paste 裁剪與拼接

cut命令用於顯示每行從開頭算起 num1 到 num2 的文字。

  • cut 取的範圍

    N- 第N個欄位到結尾

    -M 第1個欄位為M

    N-M N到M個欄位

  • cut 取的單位

    -b 以位元組為單位

    -c 以字元為單位

    -f 以欄位為單位(使用定界符)

paste 指令會把每個文件以列對列的方式,一列列地加以合併。

其一般語法為:

$ paste [-s] [-d <間隔字元>] [文件...]

參數:

  • -d<間隔字元>或–delimiters=<間隔字元>  用指定的間隔字元取代跳格字元。
  • -s或–serial  串列進行而非平行處理。
  • –help  在線幫助。
  • –version  顯示幫助資訊。
  • [文件…] 指定操作的文件路徑

3.7. sed 文本替換

sed 命令可依照腳本的指令來處理、編輯文本文件,它主要用來自動編輯一個或多個文件、簡化對文件的反覆操作、編寫轉換程式等。sed 命令是一行一行的處理文件內容的,一般在動作前加數字以確定對應的行。

其一般語法為:

$ sed [-hnV][-e<script>][-f<script文件>][文本文件]

參數說明

  • -e script 或–expression=script 以選項中指定的script來處理輸入的文本文件。
  • -f script文件 或–file=script文件 以選項中指定的script文件來處理輸入的文本文件。
  • -h或–help 顯示幫助。
  • -n或–quiet或–silent 僅顯示script處理後的結果。
  • -V或–version 顯示版本資訊。
  • -r或–regexp-extended 在腳本中使用擴展的正則表達式

動作說明

  • a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)
  • c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行
  • d :刪除,因為是刪除啊,所以 d 後面通常不接任何東西
  • i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
  • p :列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行
  • s :取代,可以直接進行字元級的替換的工作
# sed 命令需要多練習,可參考菜鳥教程實例  

3.8. awk 數據流處理

awk 是一種處理文本文件的語言,是一個強大的文本分析工具。

其一般語法為:

awk [選項參數] 'script' var=value file(s)  或  awk [選項參數] -f scriptfile var=value file(s)  

選項參數說明:

  • -F fs or –field-separator fs
    指定輸入文件折分隔符,fs是一個字元串或者是一個正則表達式,如-F:。
  • -v var=value or –asign var=value
    賦值一個用戶定義變數。
  • -f scripfile or –file scriptfile
    從腳本文件中讀取awk命令。
  • -mf nnn and -mr nnn
    對nnn值設置內在限制,-mf選項限制分配給nnn的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。
  • -W compact or –compat, -W traditional or –traditional
    在兼容模式下運行awk。所以gawk的行為和標準的awk完全一樣,所有的awk擴展都被忽略。
  • -W copyleft or –copyleft, -W copyright or –copyright
    列印簡短的版權資訊。
  • -W help or –help, -W usage or –usage
    列印全部awk選項和每個選項的簡短說明。
  • -W lint or –lint
    列印不能向傳統unix平台移植的結構的警告。
  • -W lint-old or –lint-old
    列印關於不能向傳統unix平台移植的結構的警告。
  • -W posix
    打開兼容模式。但有以下限制,不識別:/x、函數關鍵字、func、換碼序列以及當fs是一個空格時,將新行作為一個域分隔符;操作符=不能代替^和^=;fflush無效。
  • -W re-interval or –re-inerval
    允許間隔正則表達式的使用,參考(grep中的Posix字元類),如括弧表達式[[:alpha:]]。
  • -W source program-text or –source program-text
    使用program-text作為源程式碼,可與-f命令混用。
  • -W version or –version
    列印bug報告資訊的版本。

4.進程管理

4.1. lsof 查看進程狀態

lsof 命令的全稱是 list open files ,它是一個列出當前系統打開文件的工具。在 Linux 環境中,所有的事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網路連接和硬體。

其一般語法為:

$ lsof [options] filename  

常用參數列表:

選項 含義
lsof filename 顯示打開指定文件的所有進程
lsof -a 表示兩個參數都必須滿足時才顯示結果
lsof -c string 顯示COMMAND列中包含指定字元的進程所有打開的文件
lsof -u username 顯示所屬user進程打開的文件
lsof -g gid 顯示歸屬gid的進程情況
lsof +d /DIR/ 顯示目錄下被進程打開的文件
lsof +D /DIR/ 顯示目錄下被進程打開的文件,它會搜索目錄下的所有目錄,時間相對較長
lsof -d FD 顯示指定文件描述符的進程
lsof -n 不將IP轉換為hostname,預設是不加上-n參數
lsof -i 用以顯示符合條件的進程情況
$ lsof -i[46] [protocol][@hostname|hostaddr][:service|port]    # 46 –> IPv4 or IPv6  # protocol –> TCP or UDP  # hostname –> Internet host name  # hostaddr –> IPv4地址  # service –> /etc/service中的 service name (可以不只一個)  # port –> 埠號 (可以不只一個)  

4.2. pmap 分析執行緒棧

Pmap 提供了進程的記憶體映射,pmap命令用於顯示一個或多個進程的記憶體狀態。其報告進程的地址空間和記憶體狀態資訊

其一般語法為:

$ pmap [options] PID  

常見的options選項為:

  • -x:顯示擴展格式;
  • -d:顯示設備格式;
  • -q:不顯示頭尾行;
  • -V:顯示指定版本。

5.性能監控

5.1. sar 性能監控

sar 命令是系統維護的重要工具,主要幫助我們掌握系統資源的使用情況,特別是記憶體和CPU 的使用情況。

其一般語法為:

$ sar [options] [-A] [-o file] t [n]  

其中:t為取樣間隔,n為取樣次數,默認值是1;-o file表示將命令結果以二進位格式存放在文件中,file 是文件名。

常見的options選項有:

選項 含義
-A 所有報告的總和
-u 輸出CPU使用情況的統計資訊
-v 輸出inode、文件和其他內核表的統計資訊
-d 輸出每一個塊設備的活動資訊
-r 輸出記憶體和交換空間的統計資訊
-b 顯示I/O和傳送速率的統計資訊
-a 文件讀寫情況
-c 輸出進程統計資訊,每秒創建的進程數
-R 輸出記憶體頁面的統計資訊
-y 終端設備活動情況
-w 輸出系統交換活動資訊

參考材料:

Linux教程|菜鳥教程
Linux Tools Quick Tutorial
Linux 命令幫助文檔