5分鐘學會使用Linux的 grep、find、ls、wc 命令

Harda發表於2024-10-14
01

概述

本系列主要講解Linux執行時命令,包括網路、磁碟、記憶體、CPU相關引數等,主要是為了分享怎麼透過常見的 Linux 命令去排查相關問題。比如:

  1. 發現機器的CPU負荷比較高,那麼怎麼查到是哪個程序CPU佔用率比較高?

  2. 磁碟IO的寫入很頻繁,怎麼查到是哪個程序或執行緒對磁碟IO頻繁的操作?等等。

本系列就是分享諸如這類問題的排查技巧。注意,本系列的核心方向不是去講解Linux的命令查詢、顯示當前目錄等(比如ls、cat等)基礎命令操作。本系列的重點分享內容包括:

  1. Linux基礎命令和工具。

  2. CPU效能監控。

  3. 記憶體效能監控。

  4. 檔案IO效能監控。

  5. 網路IO效能監控。

強烈推薦:Linux 大牛,Netflix 高階效能架構師 Brendan Gregg的部落格http://www.brendangregg.com。《效能之巔》書籍就是他出版的,主要分為:CPU、記憶體、磁碟、網路四大塊。

下面對應的命令大部分都不是專為某一個模組設計的。所以先把基本的命令都掌握,再去細分每個命令的側重點。

1.1、監控

常用的命令:

工具描述
free 顯示系統記憶體使用情況,包括使用的記憶體、空閒的記憶體、快取和交換區等資訊。
ping 用於測試網路連線的工具,透過向目標主機傳送 ICMP 回顯請求並等待回覆來測量網路延遲。
vmstat Virtual Memory Statistics,虛擬記憶體統計工具,提供系統記憶體、程序、CPU活動等資訊。
iostat 用於報告中央處理器(CPU)統計資訊和整個系統、介面卡、tty 裝置、磁碟和 CD-ROM 的輸入/輸出統計資訊。
dstat 顯示了cpu使用情況,磁碟io情況,網路發包情況和換頁情況,輸出是彩色的,可讀性較強,相對於vmstatiostat的輸入更加詳細且較為直觀。
pidstat 監控所有或指定程序的資源佔用情況,如CPU、記憶體、裝置IO、任務切換、執行緒等。
top 動態顯示系統效能資訊,包括負載、程序狀態、CPU 使用率、記憶體使用及交換分割槽的資訊。
iotop LINUX程序實時監控工具,類似於 top 命令的工具,用於實時監控磁碟 I/O 使用情況及程序的資訊。
htop 互動式程序檢視器,提供使用者友好的介面,支援按鍵操作以管理程序。一個文字模式的應用程式(在控制檯或者X終端中),需要ncurses
mpstat 報告 CPU 的統計資訊,顯示每個 CPU 的使用情況,有助於分析 CPU 效能。
netstat 顯示與 IP、TCP、UDP 和 ICMP 協議相關的網路連線和統計資訊。一般用於檢驗本機各埠的網路連線情況。
ps 顯示當前程序的狀態和相關資訊,類似於 Windows 的工作管理員。
strace 跟蹤程式執行過程中產生的系統呼叫及接收到的訊號,用於診斷程式問題。
ltrace 跟蹤程序呼叫的庫函式,幫助分析程式的庫函式使用情況。
uptime 顯示系統當前執行時間和負載資訊,為使用者提供系統負載狀態的一個快照。能夠列印系統總共執行了多長時間和系統的平均負載,uptime命令最後輸出的三個數字的含義分別是1分鐘,5分鐘,15分鐘內系統的平均負荷。
lsof 列出當前系統中開啟的檔案及相關程序,幫助識別檔案使用情況。
perf Linux kernel 自帶的效能分析工具,幫助識別程式效能瓶頸,透過分析 CPU 使用情況及熱點函式。是Linux kernel自帶的系統效能最佳化工具。優勢在於與Linux Kernel的緊密結合,它可以最先應用到加入Kernel的new feature,用於檢視熱點函式,檢視cashe miss的比率,從而幫助開發者來最佳化程式效能。
tcpdump 網路抓包工具,捕獲和分析網路資料包,常用於網路故障排查和監控。
sar 收集和報告系統活動資訊,涵蓋 CPU、記憶體、I/O、網路等效能指標。
blktrace 跟蹤塊裝置 I/O 操作,分析系統的磁碟 I/O 效能及行為。

下面這張圖是 Brendan Gregg 提供的一個效能最佳化命令集。可以看到有很多命令可以監控系統的效能,比如檔案系統相關、呼叫棧相關、網路相關等的命令。
圖片

1.2、測試

圖片
sysbench是一個模組化、跨平臺、多執行緒基準測試工具,可用於以下效能測試:

  1. CPU效能。

  2. 磁碟IO效能。

  3. 排程程式效能。

  4. 記憶體分配及傳輸速度。

  5. POSIX執行緒效能。

  6. 資料庫效能(OLTP基準測試)。

Linux CPU使用率主要是從以下幾個維度進行統計:

指標描述
%usr 普通程序在使用者模式下執行的時間
%sys 程序在核心模式下的執行時間
%nice 被提高優先順序的程序在使用者模式下的執行時間
%idle 空閒時間
%iowait 等待I/O完成的時間
%irp 處理硬中斷請求花費的時間
%soft 處理軟中斷請求花費的時間
%steal 是衡量虛擬機器CPU的指標,是指分配給本虛擬機器的時間片被同一宿主機別的虛擬機器佔用,一般%steal值較高時,說明宿主機的資源使用已達到瓶頸。

一般情況下,CPU大部分的時間片都是消耗在使用者態和核心態上。

sysuser間的比例是相互影響的,%sys比例高意味著被測服務頻繁的進行使用者態和系統態之間的切換,會帶來一定的CPU開銷,這樣分配處理業務的時間片就會較少,造成系統效能的下降。對於IO密集型系統,無論是網路IO還是磁碟IO,一般都會產生大量的中斷,從而導致%sys相對升高,其中磁碟IO密集型系統,對磁碟的讀寫需要佔用大量的CPU,會導致%iowait的值一定比例的升高,所以當出現%iowait較高時,需排查是否存在大量的不合理的日誌操作,或者頻繁的資料載入等情況;

1.3、最佳化

Linux Performance Tuning Tools的示意圖,展示了Linux系統中不同的工具及其對應的元件。
圖片

02

grep 搜尋字元

grep 命令用於在檔案中執行關鍵詞搜尋,並顯示匹配的效果。

基本語法:

grep [選項] 模式 [檔案...]

部分常用選項:

引數作用
-c 僅顯示找到的行數
-i 忽略大小寫
-n 顯示行號
-v 反向選擇,僅列出沒有關鍵詞的行。v 是 invert 的縮寫。
-r 遞迴搜尋檔案目錄
-C n 列印匹配行的前後n行
-E 使用擴充套件正規表示式。
-l 僅顯示包含匹配行的檔名。
-h 不顯示檔名。
-w 僅匹配整個單詞。
-o 僅顯示匹配的模式。
-q 靜默模式,不輸出任何內容。
-A n 顯示匹配行及其後面的 n 行。
-B n 顯示匹配行及其前面的 n 行。
-f 檔名 從檔案中讀取模式。

基本正規表示式:

  • .:匹配任意單個字元。

  • *:匹配前一個字元零次或多次。

  • []:匹配括號內的任意一個字元。

  • [^]:匹配括號內以外的任意一個字元。

  • \: 跳脫字元,用於匹配特殊字元。

  • ^:匹配行首。

  • $:匹配行尾。

  • |:或運算子。

  • ():分組運算子。

擴充套件正規表示式:

  • +:匹配前一個字元一次或多次。

  • ?:匹配前一個字元零次或一次。

  • {}:匹配前一個字元指定次數。

示例:

  1. 在指定檔案查詢,查詢login關鍵字。

    grep  login  ImUser.cpp
  2. 多個檔案中搜尋。

    grep  login  ImUser.cpp MsgConn.cpp
  3. 在多個檔案搜尋的時候,可以使用萬用字元。在以 cpp結尾的檔案中,搜尋包含login 的行

    grep  login  *.cpp
  4. 遞迴搜尋目錄下所有檔案, 搜尋 msg_server目錄下所有檔案,列印出包含 login的行。

    grep login -r msg_server/
  5. 反向查詢,查詢檔案中,不包含 CImUser 的行。

    grep -v CImUser ImUser.cpp
  6. 找出檔案中包含 login的行,並列印出行號。

    grep  -n login  ImUser.cpp
  7. 找出檔案中包含 login的行,列印出行號,並顯示前後3行。

    grep -C 3 -n login  ImUser.cpp
  8. 找出檔案中包含 login的行,列印出行號,並顯示前後3行,並忽略大小寫。

    grep -C 3 -i -n login  ImUser.cpp

注意事項:

  • grep 命令通常用於處理文字檔案,但也支援從標準輸入讀取資料。

  • grep 命令的效率取決於模式的複雜度和檔案的大小。

  • grep 命令可以與其他命令結合使用,例如 管道重定向

其他相關命令:

  • egrep:等價於 grep -E,使用擴充套件正規表示式。

  • fgrep:等價於 grep -F,使用固定字串匹配。

  • ag:更快更強大的搜尋工具。

03

find 查詢檔案

find 命令用於在檔案系統中搜尋檔案和目錄,並對找到的專案執行操作。透過檔名查詢檔案的所在位置,檔名查詢支援模糊匹配。

基本語法:

find [起始目錄] [選項] [表示式]

引數:

  • 起始目錄: 指定搜尋的起始目錄。如果省略,則預設從當前目錄開始搜尋。

  • 選項: 用於控制搜尋行為和輸出結果。

  • 表示式: 用於描述要搜尋的目標檔案或目錄。

主要選項:

選項作用
-name 模式 根據檔名匹配模式搜尋。支援萬用字元 *?
-iname 模式 根據檔名匹配模式搜尋,忽略大小寫。
-type 型別 根據檔案型別搜尋。例如 f 表示檔案,d 表示目錄,l 表示符號連結。
-size +n 搜尋大小大於 n 個塊的檔案。
-size -n 搜尋大小小於 n 個塊的檔案。
-size n 搜尋大小等於 n 個塊的檔案。
-mtime +n 搜尋修改時間距離現在超過 n 天的檔案。
-mtime -n 搜尋修改時間距離現在少於 n 天的檔案。
-mtime n 搜尋修改時間距離現在正好 n 天的檔案。
-atime 根據訪問時間進行搜尋。用法與 -mtime 相同。
-ctime 根據檔案建立時間進行搜尋。用法與 -mtime 相同。
-user 使用者名稱 搜尋屬於特定使用者的檔案。
-group 組名 搜尋屬於特定組的檔案。
-perm 模式 根據許可權模式搜尋檔案。例如 -perm 644 搜尋許可權為 -rw-r--r-- 的檔案。
-exec 命令 {} \; 對找到的檔案執行指定的命令。
-ok 命令 {} \; 對找到的檔案執行指定的命令,並在執行前提示使用者確認。
-print 列印找到的檔案的路徑。
-print0 列印找到的檔案的路徑,並使用空字元作為分隔符。
-depth 先搜尋子目錄再搜尋當前目錄。
-maxdepth n 設定最大搜尋深度。
-mindepth n 設定最小搜尋深度。
! 取反運算子,用於排除某些檔案或目錄。
-o 或運算子,用於組合多個搜尋條件。
-a 與運算子,用於組合多個搜尋條件。
() 括號用於分組搜尋條件。

示例:

  1. 查詢當前目錄下所有以 .txt 結尾的檔案:

    find . -name "*.txt"
  2. 查詢 /home 目錄下所有大於 10M 的檔案:

    find /home -size +10M
  3. 查詢 /tmp 目錄下修改時間距離現在超過 7 天的檔案:

    find /tmp -mtime +7
  4. 查詢當前目錄下所有許可權為 755 的檔案:

    find . -perm 755
  5. 查詢 /var/log 目錄下所有以 .log 結尾的檔案,並刪除它們:

    find /var/log -name "*.log" -delete
  6. 查詢當前目錄下所有目錄,並列印它們的路徑:

    find . -type d -print
  7. 查詢當前目錄下所有以 .txt 結尾的檔案,並把它們複製到 /backup 目錄:

    find . -name "*.txt" -exec cp {} /backup \;
  8. 查詢當前目錄下所有以 .txt 結尾的檔案,並提示使用者是否刪除它們:

    find . -name "*.txt" -ok rm {} \;

04

ls 顯示檔案

ls 命令用於列出目錄的內容。它可以顯示檔案和目錄的名稱、大小、修改時間、許可權等資訊。

基本語法:

ls [選項] [檔案或目錄...]
選項描述類別
-a 顯示所有檔案,包括隱藏檔案(以 . 開頭的檔案)。 列出檔案資訊
-l 以長格式列出檔案資訊,包括檔案許可權、檔案大小、檔案所有者、修改時間等。 列出檔案資訊
-h 以易於閱讀的格式顯示檔案大小,例如 1K、2M、3G 等。 列出檔案資訊
-t 按修改時間排序。 列出檔案資訊
-r 反轉排序順序。 列出檔案資訊
-S 按檔案大小排序。 列出檔案資訊
-i 顯示檔案 inode 號。 列出檔案資訊
-d 顯示目錄本身的資訊,而不是目錄內的檔案資訊。 列出檔案資訊
-R 遞迴列出所有子目錄。 列出檔案資訊
-F 在檔名後新增標記,表示檔案型別。例如 / 表示目錄,* 表示可執行檔案,@ 表示符號連結等。 檔案顯示格式
-b 將不可列印字元顯示為反斜槓跳脫字元。 檔案顯示格式
-c 使用數字字元編碼顯示檔案。 檔案顯示格式
-G 顯示顏色,用於區分不同型別的檔案。 檔案顯示格式
-1 單行顯示檔名,每個檔名佔一行。 其他
-C 多列顯示檔名,根據終端寬度自動調整列數。 其他
-m 用逗號分隔顯示檔名。 其他
-n 使用數字使用者 ID 和組 ID 顯示檔案資訊。 其他
-p 在目錄名後新增 / 其他
-q 將不可列印字元顯示為 ? 其他
-s 顯示檔案大小(以塊為單位)。 其他

示例:

  1. 列出當前目錄下所有檔案:

    ls
  2. 以長格式列出當前目錄下所有檔案:

    ls -l
  3. 列出當前目錄下所有檔案,包括隱藏檔案:

    ls -a
  4. 列出當前目錄下所有檔案,按修改時間排序:

    ls -lt
  5. 遞迴列出 /home/user 目錄下所有檔案:

    ls -R /home/user
  6. 列出當前目錄下所有檔案,並用顏色區分檔案型別:

    ls -G
05

wc 命令

wc 命令用於統計檔案中的行數、字數和位元組數。利用wc指令我們可以計算檔案的Byte數、字數、或是列數,若不指定檔名稱、或是所給予的檔名為"-",則wc指令會從標準輸入裝置讀取資料。

基本語法:

wc [選項] [檔案...]

主要選項:

  • -l或--lines: 統計行數。

  • -w或--words: 統計字數。

  • -c或--bytes或--chars: 統計位元組數。

  • -m: 統計字元數。

  • -L: 統計最長行的長度。

  • -W: 統計單詞數。

示例:

  1. 統計檔案 test.txt 的行數、字數和位元組數:

    wc test.txt
  2. 只統計檔案 test.txt 的行數:

    wc -l test.txt
  3. 統計多個檔案 test.txt 和 data.log 的行數:

    wc -l test.txt data.log
  4. 統計檔案 test.txt 的最長行的長度:

    wc -L test.txt

注意事項:

  • wc 命令預設統計所有三個值(行數、字數和位元組數)。

  • wc 命令可以使用多個選項組合,以實現不同的統計功能。

  • wc 命令的輸出結果可能會根據檔案內容和系統環境有所不同。

其他:

  • wc 命令可以用於統計標準輸入的內容,例如:

    cat test.txt | wc -l
  • wc 命令可以與其他命令結合使用,例如:

    # 統計檔案 `test.txt` 中包含 "error" 字串的行數。
    grep "error" test.txt | wc -l
原文連結:https://mp.weixin.qq.com/s/tk7aUyfvEvCVYhvQX3JnNw

相關文章