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

 

 
posted @ 2025-03-10 18:49  业余砖家  阅读(3143)  评论(0)    收藏  举报