常见的shell命令面试题及实战解析
在IT行业,尤其是运维、开发和测试岗位的面试中,shell命令几乎是必考内容。很多公司通过实际操作题来考察候选人对Linux系统的基本掌握程度。下面整理了一些高频出现的shell命令面试题,并结合真实场景给出解答。
1. 查找并删除7天前的日志文件
这是运维岗位常见的一道题。比如,你的服务器每天生成日志,为了节省空间,需要定期清理旧文件。面试官可能会问:如何找出/var/log下7天前的.log文件并删除?
find /var/log -name "*.log" -mtime +7 -exec rm -f {} \;这里用到了find命令的几个关键参数:-name匹配文件名,-mtime +7表示修改时间超过7天,-exec用于执行后续命令。也可以用管道配合xargs:
find /var/log -name "*.log" -mtime +7 | xargs rm -f2. 统计访问量最多的IP地址
假设你有一份Nginx的访问日志access.log,面试官让你列出访问次数最多的前5个IP。这在排查恶意请求时很实用。
可以这样写:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -5这条命令链的意思是:读取日志,提取第一列(通常是IP),排序后去重统计,再按数字逆序排列,最后取前5条。awk是处理文本的利器,$1代表每行第一个字段。
3. 如何快速查看一个大文件的最后100行?
有时候日志文件特别大,用vim打开会卡死。这时候应该用tail命令:
tail -n 100 large_file.log如果还想实时监控新增内容,比如看正在写入的日志,就加上-f参数:
tail -f application.log这个在排查线上问题时非常常用,开发人员经常连上服务器盯着日志看。
4. 提取文本中某个字段的内容
比如有一个CSV文件data.csv,用逗号分隔,要求取出第三列的所有数据。
cut -d',' -f3 data.csv或者用awk:
awk -F',' '{print $3}' data.csv这两种方式都可以,-F指定分隔符,$3表示第三列。如果是制表符分隔,可以用$'\t'作为分隔符。
5. 判断一个进程是否在运行
写脚本时经常需要检查某个服务有没有启动,比如Redis。
ps aux | grep redis-server | grep -v grep如果输出不为空,说明进程存在。也可以封装成条件判断:
if ps aux | grep -q "[r]edis-server"; then
echo "Redis is running"
else
echo "Redis not found"
fi这里用了grep的静默模式-q,[r]edis-server这种写法是为了避免grep自己匹配到关键字。
6. 批量重命名文件
比如把所有.txt后缀的文件改成.bak。可以用shell脚本循环处理:
for file in *.txt; do
mv "$file" "${file%.txt}.bak"
done${file%.txt}是shell的参数扩展,意思是去掉变量file结尾的.txt部分。这种技巧在自动化任务中很实用。
7. 统计代码行数
面试官可能让你写个命令统计项目中所有.js文件的代码总行数。
find . -name "*.js" -type f | xargs wc -l或者更精确一点,排除空行和注释行:
find . -name "*.js" -type f | xargs cat | grep -v "^\s*$" | grep -v "^\s*//" | wc -l虽然实际工作中不会每次都手动敲这些命令,但理解它们的工作原理能让你在出问题时更快定位。