Linux和Shell的經典面試題
一、Linux 基礎
1. 常用命令
(1)、如何查看系統當前運行的進程?
答案:ps aux 或 top/htop
(2)、grep 和 find 的區別是什么?
grep 用于文本內容搜索,find 用于文件名/屬性搜索
(3)、如何查看一個文件的最后10行?如何實時監控文件內容變化?
tail -n 10 filename
tail -f filename
(4)、sed和awk 的主要用途是什么?舉例說明。
1)、sed 用于流式文本替換/編輯
①、文本替換:基于正則表達式快速替換文本。
②、行級操作:刪除、插入、追加特定行。
③、流式編輯:逐行處理輸入流,無需直接修改原文件(除非使用 -i 參數)。
示例:
替換文本(將文件中的 "apple" 替換為 "orange"):
sed 's/apple/orange/g' file.txt # 輸出替換結果到屏幕
sed -i 's/apple/orange/g' file.txt # 直接修改原文件
刪除空行:
sed '/^$/d' file.txt # 刪除所有空行
插入文本(在第 3 行前插入一行 "Hello"):
sed '3i Hello' file.txt
僅處理匹配行(刪除包含 "error" 的行):
sed '/error/d' file.txt
2)、awk 處理結構化文本。
①、結構化文本處理:按列(字段)處理數據,默認以空格/TAB 分隔。
②、數據計算:支持數學運算、統計、格式化輸出。
③、模式匹配:根據條件過濾和處理行。
示例:
提取特定列(輸出第 1 列和第 3 列):
awk '{print \$1, \$3}' file.txt
條件過濾(輸出第 2 列大于 100 的行):
awk '$2 > 100 {print $0}' file.txt
計算總和(統計第 3 列的總和):
awk '{sum += $3} END {print sum}' file.txt
自定義分隔符(以逗號分隔的 CSV 文件處理):
awk -F ',' '{print $2}' data.csv
復雜邏輯(同時匹配多個條件并格式化輸出):
awk '/error/ && $4 == "2023" {print "Error at line", NR, ":", $0}' log.txt
核心區別:
工具 定位 適用場景 核心能力
sed 行級流編輯器 簡單替換、刪除、插入文本 正則替換、行操作
awk 列級文本分析器 復雜結構化數據處理、統計、計算 字段處理、條件過濾、編程邏輯。
總結:
簡單替換/刪除:優先使用 sed(如 s/old/new/g)。
列處理/復雜邏輯:優先使用 awk(如統計、條件過濾、多列操作)。
兩者均可通過管道 (|) 與其他命令組合,實現靈活的文本處理流水線。
2. 文件與權限
(1)、如何修改文件權限為 755?如何遞歸修改目錄權限?
chmod 755 filename,
chmod -R 755 dirname
(2)、解釋 chmod +x 和 chmod 755 的區別。
+x 僅添加執行權限
755 設置所有者的rwx,其他用戶的rx
(3)、什么是軟鏈接(Symbolic Link)和硬鏈接(Hard Link)?區別是什么?
軟鏈接是文件指針,可跨文件系統。 使用ln -s命令創建,例如:ln -s /path/to/source /path/to/symlink
硬鏈接是同一inode的別名,不可跨文件系統。使用ln命令創建,例如:ln /path/to/source /path/to/hardlink
3. 系統管理
(1)、查看運行進程??
ps、top可查看進程狀態?。
(2)、如何查看系統負載?如何定位CPU或內存瓶頸?
uptime、top、vmstat、free -h
CPU瓶頸定位:
(1)、uptime、 top 查看 Load average ,3個值分別表示CPU在1分鐘,5分鐘和15分鐘內的運行隊列的大小。若負載值高于 CPU 核心數,說明系統過載。
(2)、通過top命令查看
a) User Time:65%~70%
b) System Time:30%~35%
c) Idle:0%~5%
如果us,sy高于這個指標可以判斷CPU有瓶頸。
內存瓶頸定位:
(1)、free -h:查看總內存、已用內存、緩存(cache/buffer)。
(2)、top:按內存排序(Shift + M)。
(3)、vmstat 1:關注 si(swap in)、so(swap out)。
(3)、如何查看磁盤使用情況?如何找出大文件?
df -h
du -sh * | sort -rh
(4)、什么是僵尸進程(Zombie Process)?如何清理?
已終止但未被父進程回收的進程,需終止其父進程。
1)如何定位是否存在僵尸進程?
通過top命令查看有多少個處于 “ 僵尸(zombie)” 狀態。如果前面的數字不為0,說明存在僵尸進程。
2)清理僵尸進程的步驟:
首先,通過在終端中 使用 ps 命令 我們列舉僵尸進程,得到它們的進程 ID:
ps ux | awk '{if($8=="Z+") print}'
ps ux 命令輸出的第 8 列顯示了進程狀態。上述命令只會打印所有處在 Z+ 狀態(表示僵尸狀態)的進程。
確認了進程 ID 后,我們可以得到它的父進程 ID:
ps -o ppid= -p <child_id>
你也可以將上述兩個命令結合在一起,直接得到僵尸進程的 PID 及其父進程的 PID:
ps -A -ostat,pid,ppid | grep -e '[zZ]'
現在你得到了父進程 ID,使用命令行和得到的 ID 號 終于可以殺死進程了:
kill -9 <parent_process_ID>
(5)、后臺任務管理??
& 將任務放到后臺,jobs 查看后臺任務,fg 和 bg 切換前后臺?。
(6)、設置定時任務的命令? ?
cron 用于周期性任務調度,配置文件位于 /etc/crontab?。
minute hour day_of_month month day_of_week <command>
每一列代表一個時間單位,從左到右分別是分鐘、小時、日期、月份和星期幾,最后一個是命令本身。
crontab相關命令:
?查看?:使用crontab -l命令。
?編輯?:使用crontab -e命令。完成編輯后,保存并退出編輯器,crontab會自動加載新的配置。
?刪除?:使用crontab -r命令。如果需要確認提示,可以加上-i選項。
4. 網絡相關
(1)、如何查看 IP 地址? ?
使用 ifconfig、ip addr 或 hostname -I?。
(2)、如何查看磁盤空間??
df 查看磁盤使用情況,du 查看目錄空間占用?。
(3)、如何查看系統監聽的端口?
netstat -tulnp 或 ss -tulnp
(4)、如何測試與遠程主機的網絡連通性?如何抓取HTTP請求?
ping/telnet,tcpdump 或 curl/wget
(5)、解釋 iptables 的作用,如何開放80端口?
iptables是Linux系統自帶的防火墻工具。
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
二、Shell 腳本
1. 基礎語法
(1)、如何定義和使用變量?單引號 '' 和雙引號 "" 的區別?
Shell 變量無需聲明,直接賦值(如 var=value),通過 $var 引用?。
單引號不解析變量,雙引號解析變量。
(2)、如何傳遞參數給腳本?解釋\$0、\$1、\$#、\$@"的含義。
$0 腳本名,$1 第一個參數,$# 參數個數,$@ 所有參數列表 $? 表示上一條命令的退出狀態,$$ 為當前進程 PID。
(3)、如何在腳本中將執行的bash命令的結果賦值給變量?
使用反引號 ` 或 $() 獲取命令輸出結果(如 date=$(date +%F))?
(4)、如何比較字符串和數字?舉例說明。
字符串用 =,數字用 -eq/-ne,如 [ "$a" = "hello" ],[ $num -gt 10 ]
2. 流程控制
(1)、條件語句?
if [ condition ]; then ... elif ... else ... fi,注意條件表達式中的空格?。
(2)、循環結構?
for 循環遍歷列表(如 for i in {1..5}; do ... done),while 循環基于條件判斷?。
(3)、函數定義與調用?
使用 function_name() { ... } 定義函數,通過 function_name args 調用?。
(4)、寫一個循環遍歷目錄下所有文件的腳本片段。
(for file in /path/*; do ... done)
(5)、如何判斷一個文件是否存在?如何判斷目錄是否存在?
(if [ -f file ],if [ -d dir ])
(6)、用 case 語句實現多條件分支的示例。
case "變量" in 值1) 指令1... ;; 值2) 指令2... ;; *) 指令3... esac
3. 文本處理
sed 與 awk?
sed 's/old/new/g' file 替換文本,awk '{print $1}' 提取指定列?。
grep 過濾內容?
grep "pattern" file 搜索匹配行,-i 忽略大小寫,-v 反向匹配?。
(1)、如何提取日志文件中的錯誤行并統計次數?
grep "ERROR" logfile | wc -l
或
awk '/ERROR/{count++} END{print count}' logfile
(2)、使用 sed 替換文件中的字符串并保存。
sed -i 's/old/new/g' filename
(3)、如何按列處理文本數據?舉例使用 awk 輸出第二列。
awk '{print $2}' filename
4. 調試與錯誤處理
(1)、如何調試Shell腳本?如何打印執行過程?
bash -x script.sh 或在腳本中添加 set -x
set -x 開啟調試模式,set +x 關閉;
(2)、set -e 和 set -o pipefail 的作用是什么?
set -e 遇到錯誤退出,set -o pipefail 確保管道中任意命令失敗則整體失敗
(3)、如何捕獲信號(如 Ctrl+C)并執行清理操作?
使用 trap 'cleanup' SIGINT
(4)、如何將命令的執行結果輸出到文件?
使用重定向操作符?將執行結果輸出到文件。
> 覆蓋輸出,>> 追加輸出,2>&1 將錯誤輸出合并到標準輸出?。
三、進階問題
(1)、文件描述符
解釋 0(stdin)、1(stdout)、2(stderr)的作用,如何將錯誤輸出重定向到文件?
command 2> error.log
(2)、進程間通信
舉例說明命名管道(Named Pipe)的使用場景。
(3)、性能優化
如何找出系統中占用CPU最高的進程?
top 按 P
或
ps aux --sort=-%cpu | head -n 2
四、實際場景題
案例1:如何統計Nginx日志中每個IP的訪問量?
awk '{print $1}' access.log | sort | uniq -c | sort -nr?
使用 grep 過濾錯誤日志,awk 統計錯誤類型頻次,sort 和 uniq 去重排序?。
案例2:寫一個腳本,監控某服務是否存活,若失敗則重啟。
結合 pgrep 或 systemctl is-active 檢測,while 循環 + sleep
案例3:如何快速清空一個大文件(不刪除文件)?
truncate -s 0 filename 或 > filename
本文來自博客園,作者:業余磚家,轉載請注明原文鏈接:http://www.rzrgm.cn/yeyuzhuanjia/p/18763376

浙公網安備 33010602011771號