【Linux】常用命令
- 【一】tar命令
- 【1】可用參數
- 【2】常用案例
- (1)創建歸檔(打包)
- (2)查看歸檔內容:??
- (3)解包歸檔 (提取):??
- 【二】日志查看命令
- 【1】基礎命令
- 【2】組合技巧
【一】tar命令
【1】可用參數
(1)操作模式 (必須指定一個):
🔥?🔥🔥?-c, --create:?? ?創建一個新的歸檔文件。
?-x, --extract, --get:?? ?解包?(提取)歸檔文件中的內容。
?-t, --list:?? ?列出歸檔文件中的內容(查看包含哪些文件)。
?-r, --append:?? ?追加文件到已存在的歸檔文件末尾。(注意:這不是更新,可能導致重復文件)
?-u, --update:?? 僅追加比歸檔文件中同名文件更新的文件。(謹慎使用,行為可能不符合直覺)
?-A, --catenate, --concatenate:?? ?合并多個 .tar歸檔文件。
(2)指定歸檔文件名:??
🔥?🔥🔥-f [文件名], --file=[文件名]:?? ?指定歸檔文件名。這是極其重要的選項。后面必須緊跟歸檔文件的名稱(或路徑)。例如:
創建:tar -cvf backup.tar /some/dir
解包:tar -xvf backup.tar
查看:tar -tvf backup.tar.gz
(3)壓縮/解壓縮選項 (通常與 -f結合使用):
🔥?🔥🔥?-z, --gzip:?? 使用 ?gzip? 進行壓縮(創建 .tar.gz/.tgz)或解壓縮。
創建:tar -czvf archive.tar.gz files...
解壓:tar -xzvf archive.tar.gz?-j, --bzip2:?? 使用 ?bzip2? 進行壓縮(創建 .tar.bz2/.tbz2)或解壓縮。壓縮率通常比 gzip 高,但速度慢。
創建:tar -cjvf archive.tar.bz2 files...
解壓:tar -xjvf archive.tar.bz2?-J, --xz:?? 使用 ?xz? 進行壓縮(創建 .tar.xz/.txz)。通常提供比 bzip2 更高的壓縮率,但速度更慢。
創建:tar -cJvf archive.tar.xz files...
解壓:tar -xJvf archive.tar.xz?--zstd:?? (較新版本支持) 使用 ?Zstandard (zstd)?? 進行壓縮(創建 .tar.zst)。在壓縮率和速度之間取得較好平衡。
創建:tar --zstd -cvf archive.tar.zst files...
解壓:tar --zstd -xvf archive.tar.zst?-a, --auto-compress:?? 根據歸檔文件名的后綴自動推斷壓縮類型并調用相應的程序(解壓時常用)。
解壓:tar -xavf archive.tar.gz(等價于 tar -xzvf)
解壓:tar -xavf archive.tar.xz(等價于 tar -xJvf)
(4)輸出/交互選項:??
🔥?🔥🔥-v, --verbose:?? ?詳細模式。在處理文件時列出文件名。強烈推薦使用,方便了解進度。?-p, --preserve-permissions, --same-permissions:?? 解包時保留文件的原始權限和所有權信息(需要 root 權限才能完全恢復所有者)。
?--same-owner:?? 解包時嘗試保留文件的所有者(通常需要 root 權限)。?-k, --keep-old-files:?? 解包時不覆蓋已存在的文件。遇到同名文件會跳過并報錯。?--overwrite:?? 解包時覆蓋已存在的文件和目錄(默認行為,但顯式指定有時有用)。?--skip-old-files:?? 解包時跳過已存在的文件(不覆蓋也不報錯)。?🔥?🔥🔥-C [目錄], --directory=[目錄]:?? ?改變目標目錄。
創建:在指定目錄下查找要歸檔的文件(相對路徑基于此目錄)。tar -cvf backup.tar -C /path/to/source .(歸檔 /path/to/source下的所有內容)
解包:將文件提取到指定目錄。tar -xvf backup.tar -C /path/to/target?--strip-components=[N]:?? 解包時去除歸檔文件中路徑的前 N 層目錄。
例如:歸檔文件包含 project/src/main.c,使用 --strip-components=1解壓后,會得到 src/main.c。?-O, --to-stdout:?? 解包時將文件內容輸出到標準輸出 (stdout)?,而不是寫入磁盤文件。常與管道 (|) 結合進行流處理。
tar -xOf archive.tar.gz path/to/file.txt(查看特定文件內容)
tar -xzf archive.tar.gz path/to/file.txt -O | grep "keyword"(搜索歸檔內文件內容)
(5)選擇文件/排除文件:??
?[文件或目錄列表]:?? 在命令末尾指定要歸檔的文件或目錄路徑。支持通配符 (*, ?),但注意 shell 會擴展通配符,最好用引號保護或結合 --files-from。
🔥?🔥🔥tar -cvf docs.tar *.txt(歸檔當前目錄下所有 .txt文件)?--exclude=[模式]:?? ?排除匹配指定模式的文件或目錄。模式可以是路徑或 glob 模式。可多次使用。
tar -cvf backup.tar --exclude='*.log' --exclude='temp/' /home/user?--exclude-from=[文件]:?? 從指定文件中讀取要排除的模式列表(每行一個模式)。
tar -cvf backup.tar --exclude-from=exclude-list.txt /home/user?-T [文件], --files-from=[文件]:?? 從指定文件中讀取要歸檔的文件路徑列表(每行一個路徑)。常用于精確控制歸檔內容。
tar -cvf backup.tar -T file-list.txt
(6)處理鏈接:??
🔥?🔥🔥?-h, --dereference:?? ?跟隨(解引用)符號鏈接。歸檔的是鏈接指向的實際文件/目錄的內容,而不是鏈接本身。
??(默認行為):?? 歸檔符號鏈接本身?(存儲為鏈接類型條目)。
??(默認行為):?? 歸檔硬鏈接本身?(存儲為硬鏈接類型條目,保留鏈接關系)。
?--hard-dereference:?? (較少用) 跟隨硬鏈接,歸檔它們指向的文件內容(破壞硬鏈接關系,存儲為獨立文件)。
(7)其他實用選項:??
?--checkpoint=[N], --checkpoint-action=[動作]:?? 每處理 N 條記錄(默認 10)執行一次檢查點動作(如打印信息 --checkpoint-action=echo)。
?--totals:?? 在處理完成后顯示總字節數。
?--wildcards:?? 在使用 --exclude或 -T時顯式啟用通配符匹配(現代 tar 通常默認啟用)。
?--selinux, --no-selinux:?? 啟用或禁用 SELinux 上下文信息的保存/恢復。
?--acls, --no-acls:?? 啟用或禁用 POSIX ACLs 的保存/恢復。
?--xattrs, --no-xattrs:?? 啟用或禁用擴展屬性 (xattrs) 的保存/恢復。
【2】常用案例
(1)創建歸檔(打包)
(1)基本打包:?? 將 /home/user/docs目錄打包成 docs.tar
tar -cvf docs.tar /home/user/docs
(2)打包并壓縮 (gzip):?? 將 /var/log打包并壓縮成 logs.tar.gz
🔥?🔥🔥tar -czvf logs.tar.gz /var/log
(3)打包并壓縮 (bzip2):?? 將當前目錄打包并壓縮成 project.tar.bz2
tar -cjvf project.tar.bz2 .
(4)打包并壓縮 (xz):?? 將 /usr/local/bin打包并壓縮成 binaries.tar.xz
tar -cJvf binaries.tar.xz /usr/local/bin
(5)打包并壓縮 (zstd):?? 將 /etc打包并壓縮成 config.tar.zstbash
tar --zstd -cvf config.tar.zst /etc
(6)?打包時排除文件:?? 打包 /home/user,排除 .cache目錄和所有 .tmp文件bash
tar -czvf home_backup.tar.gz --exclude='.cache' --exclude='*.tmp' /home/user
?(7)從列表文件打包:?? 根據 important_files.txt中的路徑列表打包bash
tar -czvf important.tar.gz -T important_files.txt
(8)?打包時跟隨符號鏈接:?? 打包 /opt/app,并解引用其中的符號鏈接bash
🔥?🔥🔥tar -czhvf app.tar.gz /opt/app
(9)?打包到特定目錄下的內容:?? 打包 /path/to/source目錄下的所有內容(不包括 source目錄本身)bash
🔥?🔥🔥tar -czvf source_content.tar.gz -C /path/to/source .
(2)查看歸檔內容:??
?(1)列出內容:?? 查看 backup.tar.gz中包含哪些文件bash
tar -tzvf backup.tar.gz
(2)?查看特定文件內容:?? 查看 archive.tar.xz中 path/to/file.conf的內容bash
tar -xJOf archive.tar.xz path/to/file.conf
(3)?搜索歸檔內容:?? 在 logs.tar.gz中搜索包含 “error” 的文件名bash
tar -tzvf logs.tar.gz | grep error
(4)?搜索歸檔文件內容:?? 在 source.tar.bz2中搜索所有 .py文件里包含 “import requests” 的行 (結合 grep)bash
tar -xjOf source.tar.bz2 $(tar -tjf source.tar.bz2 | grep '\.py$') | grep 'import requests'
(3)解包歸檔 (提取):??
(1)?基本解包:?? 解壓 data.tar到當前目錄?bash
tar -xvf data.tar
(2)?解壓并解壓縮 (gzip):?? 解壓 software.tar.gz到當前目錄?bash
🔥?🔥🔥tar -xzvf software.tar.gz
?(3)解壓并解壓縮 (bzip2):?? 解壓 images.tar.bz2到當前目錄?bash
tar -xjvf images.tar.bz2
(4)?解壓并解壓縮 (xz):?? 解壓 archive.tar.xz到當前目錄?bash
tar -xJvf archive.tar.xz
(5)?解壓并解壓縮 (zstd):?? 解壓 backup.tar.zst到當前目錄?bash
tar --zstd -xvf backup.tar.zst
(6)?解壓到指定目錄:?? 解壓 website.tar.gz到 /var/www/htmlbash
🔥?🔥🔥tar -xzvf website.tar.gz -C /var/www/html
(7)?解壓時保留權限:?? 解壓系統備份 root_backup.tar.gz并保留原始權限 (通常需要 root)bash
sudo tar -xzpvf root_backup.tar.gz -C /
(8)?解壓時不覆蓋已有文件:?? 解壓 update.tar,如果文件已存在則跳過bash
tar -xkvf update.tar
(9)?解壓特定文件:?? 從 big_archive.tar.gz中只解壓 dir/subdir/file.txtbash
tar -xzvf big_archive.tar.gz dir/subdir/file.txt
(10)?解壓并去除路徑前綴:?? 解壓 project.tar.gz,去除最外層目錄(假設歸檔內第一層是 project-v1.0/)bash
tar -xzvf project.tar.gz --strip-components=1
【二】日志查看命令
【1】基礎命令
(1)cat- 連接并打印文件內容
?作用?:一次性將整個文件內容輸出到終端。
?適用場景?:查看非常小的日志文件。對于大文件,會刷屏且難以閱讀。
cat /var/log/syslog
(2) less- 分頁查看器 (推薦)
?作用?:分頁顯示文件內容,支持上下滾動、搜索等,不會一次性加載整個文件。
?適用場景?:查看任何大小日志文件的首選工具。
?常用操作?:
空格鍵/ Page Down: 向下翻一頁
b/ Page Up: 向上翻一頁
/關鍵詞: 向下搜索(按 n下一個,N上一個)
?關鍵詞: 向上搜索
g: 跳到文件開頭
G: 跳到文件末尾
q: 退出
🔥?🔥🔥less /var/log/auth.log
# 進入less后,輸入 `/Failed` 來搜索所有失敗登錄嘗試
(3)tail- 查看文件尾部
?作用?:顯示文件的最后一部分內容。
?適用場景?:查看最新的日志條目,尤其是實時跟蹤日志增長。
?常用選項?:
-n <行數>: 顯示最后 N 行(例如 tail -n 50 file.log)
-f/ --follow: ?實時跟蹤日志輸出。這是最重要的選項,用于監控正在寫入的日志。
-F: 類似于 -f,但更強大。它會在文件被輪轉(rotate)或刪除后重新打開新文件繼續跟蹤。(例如 logrotate后會自動跟蹤新產生的日志文件)
?案例?:
# 查看最后20行日志
tail -n 20 /var/log/nginx/access.log# 實時跟蹤系統認證日志(監視登錄行為)
tail -f /var/log/auth.log🔥?🔥🔥# 實時跟蹤系統認證日志(監視登錄行為)
tail -500f /var/log/auth.log# 實時跟蹤日志,即使日志文件被輪轉也能繼續(最佳實踐)
tail -F /var/log/myapp/app.log
(4)head- 查看文件頭部
?作用?:顯示文件的開始一部分內容。
?適用場景?:查看日志文件的開頭,例如確認日志的格式或初始啟動信息。
# 查看日志文件的前10行
head -n 10 /var/log/bootstrap.log
(5)grep- 文本搜索利器
?作用?:使用正則表達式搜索文本,并打印匹配的行。
?適用場景?:在日志中過濾出包含特定關鍵詞、錯誤代碼、IP地址等的行。
?常用選項?:
-i: 忽略大小寫
-v: ?反向選擇,只顯示不匹配的行(排除干擾)
-r/ -R: 遞歸搜索目錄下的所有文件
-n: 顯示匹配行所在的行號
-A <數字>: 顯示匹配行之后的 N 行(After)
-B <數字>: 顯示匹配行之前的 N 行(Before)
-C <數字>: 顯示匹配行前后的 N 行(Context)
?案例?:
# 在syslog中搜索所有包含"error"的行(忽略大小寫)
grep -i error /var/log/syslog# 在Nginx訪問日志中查找來自特定IP(192.168.1.1)的請求
grep '192.168.1.1' /var/log/nginx/access.log🔥?🔥🔥# 搜索包含“error”的行,并顯示其后的3行內容(獲取錯誤上下文)
grep -A 3 -i error /var/log/myapp/app.log# 從多個日志文件中搜索“Timeout”關鍵字
grep -r "Timeout" /var/log/# 排除所有包含“DEBUG”的行(只顯示非調試信息)
grep -v "DEBUG" /var/log/myapp/app.log
【2】組合技巧
(1)實時跟蹤并過濾日志
這是最常用的組合,一邊實時看新日志,一邊過濾出你關心的內容。
# 案例:實時監控Nginx日志,只顯示404錯誤的請求
tail -F /var/log/nginx/access.log | grep ' 404 '🔥?🔥🔥# 使用 grep -A顯示匹配行后的內容
tail -f /path/to/logfile.log | grep --line-buffered -A 10 "your_keyword"# 顯示匹配行前后各 5 行(-C = Context)
tail -f app.log | grep --line-buffered -C 5 "Connection refused"# 組合使用:顯示匹配行前 3 行 + 匹配行 + 后 7 行
tail -f app.log | grep --line-buffered -B 3 -A 7 "Transaction failed"# 案例:實時監控應用日志,同時過濾掉“heartbeat”這種無關緊要的信息
tail -f /var/log/myapp.log | grep -v "heartbeat"# 同時監控多個關鍵詞(OR 邏輯)
tail -f logfile | grep --line-buffered -A 5 -e "Timeout" -e "Deadlock"# 高亮顯示關鍵詞(更易閱讀)
tail -f logfile | grep --line-buffered --color=always -A 3 "Critical"
(2)統計和分析
# 案例:統計Nginx訪問日志中每個IP的訪問次數(找出誰在刷接口)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 20# 分解說明:
# awk '{print $1}' // 提取第一列(默認是IP地址)
# sort // 對IP進行排序,為下一步去重準備
# uniq -c // 計數并去重
# sort -nr // 按數字逆序排序(訪問次數從高到低)
# head -n 20 // 顯示前20個# 案例:查看HTTP狀態碼的分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr# 案例:找出消耗時間最長的請求(假設日志最后一列是請求耗時)
awk '{print $NF " | " $0}' /var/log/nginx/access.log | sort -nr | head -n 10
# $NF 代表最后一列(Number of Field)🔥?🔥🔥# 顯示匹配行及之后10行(無分隔符)
tail -f logfile | awk '/keyword/{c=11} c&&c--'
(3)查看特定時間范圍的日志
如果你的日志時間格式可以被識別(如 [10/Sep/2023:14:30:00]),可以使用 sed、awk或 grep來提取時間段。
# 案例:提取今天上午10點到11點的日志 (假設時間格式是HH:MM:SS)
grep '10:\[0-5][0-9]:[0-5][0-9]' /var/log/myapp.log# 更精確的方法,使用awk(如果時間戳在每行開頭)
awk '/Sep 10 10:00:00/,/Sep 10 11:00:00/' /var/log/syslog
# 注意:這個命令依賴于日志中確實存在這兩個精確時間點的行
(4)結合 cut, awk, sort, uniq進行多維分析
awk是一個強大的文本處理語言,非常適合處理結構化的日志(如 CSV 或空格分隔的日志)。
# 案例:分析Nginx日志,找出訪問量最高的URL(第7列)
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10# 案例:計算平均響應時間(假設最后一列是響應時間)
awk '{sum+=$NF; count++} END {print "Avg:", sum/count, "ms"}' /var/log/nginx/access.log