1. 项目概述为什么是这27个命令在技术面试尤其是运维、开发、SRE等岗位的面试中Linux命令行能力是绕不开的考察点。面试官抛出“说说你常用的Linux命令”或针对某个场景问“你会用什么命令处理”时答案的深度和广度直接反映了你的实战经验。网上命令大全动辄上百条但真正高频、能体现你解决问题思路的往往集中在二三十个核心命令及其组合上。我结合自己十多年带团队和面试候选人的经验梳理了这27个最常被问及、也最能体现工程师功底的Linux命令。这不仅仅是命令列表更是理解其背后原理、使用场景和组合技巧的钥匙。无论你是准备面试的新手还是想巩固基础的资深工程师掌握这些命令的“所以然”都能让你在命令行世界里更加游刃有余。2. 核心命令深度解析与场景应用2.1 文件与目录操作基石命令这部分命令是Linux的“行走坐卧”使用频率最高但细节也最多。ls- 列出目录内容这可能是你输入的第一个命令但它的选项决定了你是新手还是老手。-l长格式展示权限、所有者、大小、时间等详细信息-a显示所有文件包括以.开头的隐藏文件-h与-l结合使用将文件大小以K、M、G等人类可读格式显示。面试中常问如何按文件大小倒序排列答案是ls -lhS-S按大小排序通常结合-r反转顺序。如何查看文件的inode号用ls -i。理解ls的输出是理解Linux文件系统权限和属性的第一步。cd- 切换目录看似简单但路径的写法有讲究。cd ~或cd直接回家目录cd -在上一个目录和当前目录间快速切换这在两个目录间来回操作时非常高效。cd ..返回上级目录。需要注意的是在脚本中使用绝对路径比相对路径更可靠可以避免因当前工作目录不确定而导致的错误。pwd- 打印当前工作目录用于确认你当前在文件系统的哪个位置。尤其是在使用符号链接或经过多次跳转后pwd -P可以显示物理实际路径而非链接路径。这是一个很好的习惯能避免操作到错误的位置。mkdir/rmdir- 创建/删除目录mkdir -p是必须掌握的神器它可以递归创建多级目录。例如mkdir -p project/{src,test,doc}会一次性创建project目录并在其下创建src、test、doc三个子目录。这种大括号扩展的用法非常高效。rmdir只能删除空目录实用性不如rm -r。cp/mv/rm- 复制、移动/重命名、删除这是文件操作的“三剑客”。cp-r递归复制目录-p保留文件属性权限、时间戳-a相当于-dpr用于归档复制是备份时的常用选项。面试可能会问如何将一个目录下的所有.txt文件复制到另一个目录cp sourcedir/*.txt destdir/。mv除了移动它也是重命名文件的唯一标准命令。如果目标文件已存在默认会覆盖且无提示。在重要操作前最好先确认。rm危险命令之首。-r递归删除-f强制删除。rm -rf /是著名的“删库跑路”命令绝对不要尝试。安全的习惯是先ls确认要删除的内容再用rm或者使用rm -i交互式删除但更推荐将重要文件放入回收站工具如trash-cli而非直接rm。find- 查找文件这是文件搜索的瑞士军刀功能极其强大。面试必考。基本语法find 路径 表达式。按名称查找find /home -name *.log按类型查找find . -type f普通文件-type d目录按时间查找-mtime -77天内修改过的-atime 30访问时间超过30天按大小查找find /var -size 100M大于100MB组合条件-a与-o或!非。例如查找当前目录下7天内修改过且大于10M的日志文件find . -name *.log -mtime -7 -size 10M执行动作-exec参数是精髓。例如删除所有7天前的.tmp文件find /tmp -name *.tmp -mtime 7 -exec rm {} \;。这里的{}是占位符代表找到的文件\;是命令结束符。更高效的做法是使用-delete动作但并非所有系统都支持或结合xargsfind /tmp -name *.tmp -mtime 7 | xargs rmxargs- 参数传递大师它从标准输入接收数据流并将其转换成特定命令的参数。常与find、grep -l等命令结合使用。为什么需要它因为很多命令如rm、cp不支持直接从管道接收参数。例如find . -name *.log | xargs rm。xargs默认以空白字符分割输入但如果文件名含有空格就会出错。这时需要用-0选项并与find -print0配对使用find . -name *.log -print0 | xargs -0 rm这是处理任意文件名的安全做法。-I {}选项允许你指定一个替换字符串更灵活find . -name *.bak | xargs -I {} mv {} {}.old。2.2 文件内容查看与处理cat/tac/nl- 连接与显示cat查看整个小文件内容、合并多个文件cat file1 file2 merged、创建文件cat newfile然后输入内容CtrlD结束。tac反向显示文件最后一行先显示。nl显示时加上行号比cat -n功能更多可以指定行号格式。more/less- 分页查看查看大文件必备。more只能向下翻页less更强大支持上下翻页、搜索/关键词、跳转G到文件尾g到文件头。less是查看日志文件的首选。head/tail- 查看首尾head -n 20 file查看前20行。tail -n 50 file查看后50行。tail -f file是运维神器实时追踪文件末尾新增的内容-F在文件被轮转或删除后重新打开更健壮常用于监控日志。grep- 文本搜索之王另一个面试高频核心。基本用法grep “pattern” file。常用选项-i忽略大小写。-v反向选择显示不匹配的行。-n显示行号。-c只显示匹配的行数。-r或-R递归搜索目录下的所有文件。-l只打印匹配的文件名不打印具体行。-E使用扩展正则表达式等同于egrep功能更强大。正则表达式是关键.匹配任意单个字符*匹配前一个字符0次或多次^匹配行首$匹配行尾[]字符集合\转义。例如查找包含“error”或“ERROR”的行grep -i “error” log.txt。查找以数字开头的行grep “^[0-9]” file。上下文查看-A 5显示匹配行后5行-B 5显示前5行-C 5显示前后各5行这在分析日志时非常有用。awk- 文本处理与报告生成语言功能强大的编程语言常用于提取字段、计算、格式化输出。基本结构awk ‘pattern {action}’ file。默认以空格或制表符分割字段$1,$2... 代表第1、2...个字段$0代表整行。经典示例打印/etc/passwd文件的第一列用户名和第三列用户IDawk -F: ‘{print $1, $3}’ /etc/passwd。-F:指定冒号为字段分隔符。内置变量NR当前记录号行号NF当前行的字段数。打印文件的行数awk ‘END {print NR}’ file。打印每行的最后一个字段awk ‘{print $NF}’ file。计算统计某个服务的日志条数grep “service_name” logfile | awk ‘{count} END {print count}’。条件判断输出第二列大于100的行awk ‘$2 100 {print}’ data.txt。sed- 流编辑器用于对文本流进行非交互式编辑查找替换、删除、插入。面试常考替换操作。基本替换sed ‘s/old/new/g’ file。s表示替换g表示全局一行中所有匹配。默认只输出到屏幕不修改原文件。要直接修改文件需加-i选项使用前务必备份sed -i.bak ‘s/foo/bar/g’ file会先备份一个file.bak再修改原文件。删除行sed ‘/^#/d’ file删除所有以#开头的注释行。sed ‘3,5d’ file删除第3到第5行。插入与追加sed ‘2i\inserted line’ file在第2行前插入sed ‘2a\appended line’ file在第2行后追加。2.3 权限与属性管理chmod- 修改文件权限Linux权限体系rwx的基础。可以用数字755或符号ux表示法。数字法chmod 755 script.sh。7(rwx)4215(r-x)401。755代表属主可读可写可执行属组和其他用户可读可执行。符号法chmod ux,g-w,or file。u属主g属组o其他a所有。增加-移除设置。chmod ax file给所有人增加执行权限。递归修改目录下所有文件chmod -R 755 directory/。chown- 修改文件所有者和属组chown user:group file。递归修改用-R。常用于部署应用后将网站目录的所有权从root改为Web服务用户如www-data或nginx。stat- 显示文件状态信息比ls -l更详细可以查看文件的inode号、链接数、权限、大小、三个时间戳访问Atime、修改Mtime、状态改变Ctime。对于排查“文件是否被修改过”等问题非常有用。2.4 系统状态与进程管理ps- 报告当前进程快照查看进程状态。选项风格多样常用的有ps auxBSD风格查看所有用户的所有进程信息全面USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND。STAT状态码如S睡眠R运行Z僵尸需要理解。ps -efUNIX System V风格同样查看所有进程。常与grep联用ps aux | grep nginx。top/htop- 动态进程监控top是交互式实时监控系统资源CPU、内存、负载和进程的工具。按P按CPU排序M按内存排序1显示所有CPU核心的详情。htop是其增强版界面更友好支持鼠标操作直观显示CPU使用率条形图更受欢迎。kill/pkill/killall- 发送信号给进程kill通过PID终止进程。kill -9 PID发送SIGKILL信号强制终止无法被进程捕获或忽略是最后手段。应先尝试kill -15 PIDSIGTERM允许进程进行清理工作。pkill通过进程名终止。pkill -f “process_name”。killall通过进程名终止所有同名进程。killall nginx。df/du- 磁盘空间检查df -h查看文件系统磁盘空间使用情况挂载点、总大小、已用、可用、使用率。-h人类可读格式。重点关注/和/home等分区使用率是否过高。du -sh *查看当前目录下每个文件和目录的磁盘使用情况。-s总计-h人类可读。常用于定位哪个目录占用了大量空间。du -sh /var/log/。free- 内存使用情况free -h查看物理内存和交换空间的使用情况。关键看available列它表示可用于启动新应用的内存估计值比free列更准确。2.5 网络与通信ping- 测试网络连通性发送ICMP回显请求包。ping -c 4 google.com发送4个包后停止。持续ping可用于监控网络稳定性。netstat/ss- 网络连接、路由表、接口统计netstat功能强大但较老sssocket statistics是其更快速、更现代的替代品来自iproute2包。查看所有监听端口ss -tuln或netstat -tuln。-tTCP-uUDP-l监听-n数字形式显示地址和端口。查看已建立的连接ss -t。查看进程使用的端口ss -tulnp或netstat -tulnp需要sudo权限查看PID/Program name。curl/wget- 网络数据传输curl更侧重于在命令行中传输数据支持大量协议HTTP, HTTPS, FTP, SCP等功能极强。常用于测试APIcurl -X GET https://api.example.com/resource-H添加请求头-d发送POST数据。下载文件curl -O URL保留远程文件名。wget更侧重于下载文件支持递归下载、断点续传。wget -c URL断点续传wget -r URL递归下载。2.6 压缩与归档tar- 归档工具将多个文件或目录打包成一个文件归档常与压缩工具联用。创建归档tar -cvf archive.tar /path/to/dirc创建v详细输出f指定文件名查看内容tar -tvf archive.tar解压tar -xvf archive.tarx解压结合压缩.tar.gz或.tgz:tar -czvf archive.tar.gz /path/to/dir(z代表gzip).tar.bz2:tar -cjvf archive.tar.bz2 /path/to/dir(j代表bzip2).tar.xz:tar -cJvf archive.tar.xz /path/to/dir(J代表xz)解压时将压缩后缀对应的z/j/J换成x即可如tar -xzvf archive.tar.gz。一个万能解压习惯是先用file命令查看文件类型再用对应参数解压。gzip/bzip2/xz- 压缩工具通常与tar配合使用。单独使用时它们会压缩单个文件并默认删除原文件生成.gz,.bz2,.xz后缀。解压用gunzip,bunzip2,unxz。一般来说压缩率xz bzip2 gzip但压缩速度反之。3. 面试场景下的组合拳与高阶技巧面试官不仅想知道你认识命令更想知道你如何用它们解决问题。以下是一些经典场景和命令组合。3.1 场景一日志分析与故障排查问题“如何从1G的Nginx访问日志中找出访问量最高的10个IP地址”这是一个经典的awksortuniqhead组合。awk ‘{print $1}’ access.log | sort | uniq -c | sort -nr | head -10awk ‘{print $1}’假设日志格式中客户端IP在第一列将其提取出来。sort对IP进行排序这是uniq -c统计的前提。uniq -c统计每个连续重复行的出现次数输出“次数 IP”。sort -nr按次数第一列数字逆序排序-n数字排序-r反转。head -10取前10行。问题“实时监控日志文件一旦出现‘ERROR’或‘Exception’关键字就高亮显示并发出警报”这里用到tail -f和grep的组合并利用grep的颜色高亮和echo或系统通知。tail -F /var/log/app/application.log | grep --colorauto -E “(ERROR|Exception)”tail -F持续追踪文件即使文件被轮转如logrotate也能重新打开。grep -E使用扩展正则匹配“ERROR”或“Exception”。--colorauto在终端高亮显示匹配词。如果需要更复杂的警报如发送邮件、Slack消息可以结合while read line; do ... done循环处理每一行。3.2 场景二系统资源监控与定位问题“发现服务器负载很高如何快速定位是哪个进程消耗CPU或内存最多”首先用top或htop直观查看。在top中按PCPU排序或M内存排序看排在第一位的进程。如果想用一行命令快速找出CPU消耗前5的进程ps aux --sort-%cpu | head -6--sort-%cpu按CPU降序head -6取前6行第一行是标题。同理内存消耗前5ps aux --sort-%mem | head -6。更精细地如果想查看某个进程如Java内部线程的CPU使用情况可以用top -H -p PID。问题“磁盘空间告警如何快速找出是哪个目录或文件占用了最大空间”首先df -h确认是哪个分区满了比如/home。然后进入该分区根目录或怀疑的目录使用du命令逐层深入du -sh * | sort -rh | head -10这条命令列出当前目录下所有子项的大小按人类可读格式然后逆序排序显示最大的10个。锁定某个大目录后继续进入该目录重复上述命令直到定位到具体的大文件。对于特别深的目录树可以用find直接找大文件find /home -type f -size 100M -exec ls -lh {} \; | sort -k5 -rh。这条命令查找/home下大于100M的文件并以易读格式列出按文件大小逆序排序。3.3 场景三批量操作与自动化问题“需要将当前目录下所有.html文件中的‘旧域名.com’替换为‘新域名.com’”使用sed配合find和xargs或-exec。# 方法1使用 find -exec find . -name “*.html” -exec sed -i.bak ‘s/旧域名\.com/新域名.com/g’ {} \; # 方法2使用 find xargs (更高效尤其文件多时) find . -name “*.html” -print0 | xargs -0 sed -i.bak ‘s/旧域名\.com/新域名.com/g’-i.bak直接修改原文件并创建.bak备份文件这是生产环境的安全操作习惯。注意对域名中的点.进行转义\.因为在正则中.是特殊字符。问题“需要给一个目录下所有.sh脚本文件添加可执行权限”find . -name “*.sh” -exec chmod x {} \; # 或 chmod x *.sh # 如果只在当前目录且没有子目录4. 面试中关于命令原理的深度追问除了会用面试官还可能深入考察命令背后的原理。你需要理解而不仅仅是记忆。1.grep、awk、sed的区别与选用原则grep纯粹的文本搜索工具功能单一但高效。适合“找不找得到”这类问题。sed流编辑器擅长对文本行进行编辑替换、删除、插入。适合“如何修改文本”这类问题尤其是基于模式的替换。awk本质上是一门编程语言擅长基于字段的处理、计算和报告生成。当文本有清晰的分隔符如CSV、日志需要按列提取、计算、比较时awk是首选。简单来说搜索用grep替换用sed取列计算用awk。复杂任务可以管道组合它们。2.kill -9为什么危险信号机制是什么Linux通过信号与进程通信。kill命令发送信号。SIGTERM (15)默认信号。通知进程“该结束了”进程可以捕获这个信号执行清理工作如关闭文件、释放资源后再退出。这是优雅的终止方式。SIGKILL (9)强制终止信号。进程无法捕获或忽略内核会直接终止进程不给任何清理机会。这可能导致数据丢失正在写的文件不完整。资源泄漏内存、文件描述符未释放。状态不一致如数据库事务中断。最佳实践先尝试kill PID或kill -15 PID等待几秒。如果进程无响应再使用kill -9 PID。3. 硬链接ln与软链接ln -s的本质区别硬链接本质是同一个inode的多个目录条目文件名。删除一个硬链接只要inode的链接数不为0数据就不会被删除。不能跨文件系统不能链接目录。软链接符号链接是一个独立的文件内容存储的是目标文件的路径。类似于Windows的快捷方式。删除源文件软链接就失效“断链”。可以跨文件系统可以链接目录。如何查看ls -li第一列是inode号。硬链接的inode号相同软链接的inode号不同且权限位第一个字符是l。4.find -exec与xargs的区别find -exec对find找到的每一个文件都启动一次后面指定的命令如rm。如果找到10000个文件就启动10000次rm进程。效率低但语法简单安全性高能处理特殊字符。xargs将find找到的一批文件名作为参数一次传递给后面的命令。默认情况下它会根据系统限制将足够多的参数组合成一次命令调用大大减少了进程启动次数效率高。但默认的空格分隔对含空格的文件名不友好需配合-print0和-0使用。选择文件数量少或命令简单时用-exec文件数量巨大时用xargs提升性能并务必使用-print0 | xargs -0保证安全。5. 实操心得与避坑指南心得1操作前先确认尤其是删除和覆盖对于rm、mv、cp以及sed -i、find -delete这类会修改或删除数据的命令养成“先看后做”的习惯。例如计划执行rm *.log前先运行ls *.log确认匹配的文件列表是否正确。对于find -exec可以先去掉-exec部分只运行find命令看看会找到哪些文件。心得2使用别名alias保护自己在你的~/.bashrc或~/.bash_aliases中加入alias rm‘rm -i‘ # 删除前询问 alias cp‘cp -i‘ # 覆盖前询问 alias mv‘mv -i‘ alias ll‘ls -lhF‘ # 带颜色、人类可读、显示文件类型符号-iinteractive选项会在危险操作前提示你确认。对于rm更推荐使用trash-cli这类回收站工具。心得3善用命令历史history和反向搜索CtrlRhistory查看命令历史!编号执行历史中对应编号的命令。在终端按CtrlR然后输入关键词可以反向搜索历史命令非常高效。连续按CtrlR可以循环搜索。心得4理解输出重定向和管道覆盖重定向追加重定向。21将标准错误文件描述符2重定向到标准输出文件描述符1。例如command output.log 21将标准输出和错误都重定向到同一个文件。管道|是将前一个命令的标准输出作为后一个命令的标准输入。但标准错误不会通过管道传递。如果需要处理错误需用21先将错误合并到输出。心得5脚本中总是使用完整路径在自动化脚本中不要依赖$PATH环境变量。使用命令的完整路径如/bin/rm,/usr/bin/find或者至少在脚本开头设置好PATH变量。这可以避免因环境不同导致的“命令未找到”错误。掌握这27个命令及其背后的原理、组合和避坑技巧足以让你应对绝大多数Linux面试场景和日常运维开发工作。真正的熟练来自于持续的实践和思考试着在你自己可控的环境里多敲多练把这些命令变成你肌肉记忆的一部分。当面试官再问起时你就能从容不迫不仅说出命令更能讲出场景、原理和最佳实践这才是资深工程师的体现。