1. 项目概述为什么是这23个命令在Linux的世界里命令是运维工程师与系统对话的语言。无论是排查线上故障、部署服务还是日常巡检效率往往就取决于你对这些“语言”的掌握程度。市面上命令教程浩如烟海但真正能在关键时刻救急、提升日常工作效率的其实就那么几十个。今天我们不谈成百上千的命令大全只聚焦于那些经过无数次实战检验堪称“瑞士军刀”级别的23个核心命令。这些命令覆盖了文件操作、进程管理、网络诊断、系统监控和文本处理等运维日常的方方面面掌握它们你就能解决90%以上的常见问题。无论你是刚入行的新人还是希望梳理知识体系的老手这份清单都值得你反复揣摩和练习。2. 核心命令分类与深度解析2.1 文件与目录操作一切皆文件的基石Linux哲学中“一切皆文件”因此文件操作命令是运维的立身之本。ls,cd,pwd这些入门命令看似简单但其中的细节往往决定了操作的精准度。ls命令的进阶用法大多数人只用ls -l查看详情。但在排查问题时ls -la显示所有文件包括隐藏文件是基本操作。更进一步ls -lht可以按时间倒序并显示人类可读的文件大小在查找最新日志或大文件时极其高效。ls -R递归列出子目录内容在分析复杂目录结构时必不可少。一个常见的坑是直接ls一个包含大量文件的目录可能导致终端卡顿此时使用ls -f不排序直接列出或结合head命令如ls | head -20先看一部分会更安全。find命令精准定位的利器。这是文件查找的终极命令其强大之处在于丰富的表达式。例如查找过去7天内被修改过的所有.log文件find /var/log -name *.log -mtime -7。查找大于100MB的文件并删除慎用find /home -type f -size 100M -exec rm -f {} \;。-exec参数允许对找到的文件执行任意命令这是其自动化能力的核心。但要注意在根目录/下不加限制地运行find会非常消耗资源务必先用-name或-path缩小范围。rsyncvsscp文件同步与传输的选择。scp简单直接用于一次性文件拷贝。而rsync才是运维备份和同步的首选因为它支持增量同步、断点续传并且可以保持文件属性。核心命令如rsync -avz --progress /source/ userremote:/dest/。其中-a是归档模式保持权限等-v详细输出-z压缩传输--progress显示进度。在同步大量小文件时可以加上--partial保留部分传输的文件以支持续传。务必注意源目录尾部的/有/表示同步目录内的内容没有/则表示同步目录本身这常常是导致同步结果不符合预期的原因。2.2 进程管理与系统监控洞察系统状态的窗口系统是否健康服务是否存活资源是否瓶颈全靠这些命令来揭示。ps命令进程快照的艺术。ps aux是最经典的组合查看所有用户的所有进程。但输出信息繁杂我们常结合grep进行过滤如ps aux | grep nginx。更专业的用法是ps -ef它以完整的格式列表显示进程并且显示的父进程IDPPID对于分析进程树非常有用。对于容器的普及ps -auxf可以显示进程树状图方便查看父子关系。如果想查看某个进程的详细环境变量和内存映射ps auxww两个w可以显示完整的命令行对于诊断Java、Python应用参数特别有用。top/htop动态监控的双眼。top是交互式实时监控工具。除了看CPU、内存占用运维需要关注几列%CPU、%MEM、RES实际物理内存、COMMAND。按M按内存排序按P按CPU排序是基本操作。按1可以展开显示所有CPU核心的利用率。htop是top的增强版界面更友好支持鼠标操作、树状视图和颜色高亮。在htop中你可以直接按F4过滤进程按F9发送信号如kill效率远超top。对于服务器我习惯用top -b -n 1 top.log将一次快照输出到文件用于事后分析。vmstat、iostat、mpstat专业性能分析的“三剑客”。这些命令来自sysstat工具包能提供更深入的子系统性能数据。vmstat 2 5每2秒采样一次共采样5次。关注procs下的r运行队列长度如果持续大于CPU核数说明CPU繁忙和b阻塞进程数memory下的si/so每秒交换进/出的内存量如果不为0说明内存不足触发了交换性能会急剧下降io下的bi/bo块设备读写system下的cs上下文切换次数过高说明进程调度频繁。iostat -dx 2查看磁盘I/O状况。-d显示设备报告-x显示扩展统计。关键列%util设备利用率接近100%表示磁盘饱和、awaitI/O请求平均等待时间单位毫秒值越大说明磁盘越慢或越忙、svctm服务时间应接近磁盘物理性能。mpstat -P ALL 2查看每个CPU核心的详细利用率。%idle过低%sys或%iowait过高都指示了问题方向。2.3 网络诊断与操作连通性是一切的前提服务不可用第一步永远是检查网络。netstat与ss网络连接状态洞察。老牌的netstat正在被更快的ss取代但两者都要会。netstat -tunlp用于查看所有监听-l的TCP-t、UDP-u端口并显示进程名-p和数字格式-n。而ss -tunlp功能相同但速度更快尤其在连接数巨大时。查看所有已建立的连接用ss -tan state established。ss的优势在于其丰富的过滤能力例如查看连接到特定端口如80的所有连接ss -tan dst :80。tcpdump网络流量抓包分析。这是诊断复杂网络问题的终极武器。基础用法tcpdump -i eth0 -nn监听eth0网卡-nn不解析主机名和端口名。但通常我们需要过滤tcpdump -i any port 80 -w http.pcap抓取所有80端口的流量并保存为文件方便用Wireshark进行图形化分析。更精细的过滤如抓取特定主机间的HTTP GET请求tcpdump -i eth0 tcp port 80 and (((ip[2:2] - ((ip[0]0xf)2)) - ((tcp[12]0xf0)2)) ! 0)。这个命令看起来复杂它利用了数据包偏移量来检查应用层数据。对于日常运维记住几个关键过滤表达式host 192.168.1.1src host 192.168.1.1dst port 22tcpicmp。抓包时务必注意权限通常需要root和流量大小避免在生产环境抓取过多数据导致磁盘写满。ncnetcat网络界的“瑞士军刀”。它可以用作简单的TCP/UDP客户端、服务器端口扫描甚至文件传输。快速测试远端端口是否开放nc -zv example.com 80。作为临时服务器监听端口nc -l -p 9999然后在另一台机器用nc server_ip 9999即可建立连接双方输入的内容会实时传输。传输文件接收端nc -l -p 9999 file.received发送端nc receiver_ip 9999 file.to.send。这些功能在临时调试、验证防火墙规则时非常方便。2.4 文本处理与数据分析从日志中挖掘黄金运维的大部分时间是在和日志、配置文件等文本打交道高效处理文本是核心能力。grep文本搜索的王者。grep error application.log是最简单的用法。但它的威力在于正则表达式和上下文查看。grep -n -B2 -A2 panic logfile会显示匹配“panic”的行号-n以及其前-B2后-A2各2行这对于理解错误发生的上下文至关重要。递归搜索目录下所有文件grep -r Connection refused /var/log/。使用扩展正则表达式-E可以匹配更复杂的模式如grep -E error|fatal|exception logfile。一个高级技巧是grep -P支持Perl兼容的正则功能更强大但并非所有系统默认支持。在处理大量数据时grep速度很快但要注意模式是否精确避免误匹配。awk文本数据提取与报告生成器。它不仅仅是一个命令更是一门微型编程语言。最基本用法是提取列ps aux | awk {print $1, $11}打印用户名和命令列。awk -F: {print $1} /etc/passwd以冒号为分隔符打印第一列用户名。它的强大在于条件判断和计算统计nginx访问日志中每个IP的访问次数awk {print $1} access.log | sort | uniq -c | sort -nr。这里$1默认以空格分隔代表第一列IP。awk还可以进行数值计算、数组操作等。例如计算文件第二列的总和awk {sum$2} END {print sum} data.txt。sed流编辑器批量修改的利器。常用于文本替换、删除、插入。最常用的是替换操作sed s/foo/bar/g file.txt将文件中所有的foo替换为bar。-i选项可以直接修改原文件务必先备份sed -i.bak s/old/new/g config.conf这里会先创建一个.bak备份文件。删除空白行sed /^$/d file.txt。打印特定行范围sed -n 10,20p file.txt。sed与正则表达式结合可以完成非常复杂的文本变换任务。在处理配置文件或批量重命名时sed脚本能节省大量时间。jqJSON处理的神器。在现代API和配置如Docker、Kubernetes配置普遍使用JSON的今天jq是必须掌握的工具。从复杂的JSON中提取某个字段curl -s api.example.com/data | jq .user.name。格式化输出JSONcat config.json | jq .。更复杂的查询如提取数组中所有对象的某个属性jq .[].id items.json。过滤数据jq .[] | select(.status active) data.json。jq的学习曲线稍陡但一旦掌握处理JSON数据将变得无比轻松。3. 高效组合与实战场景应用单个命令是武器组合使用才能形成战斗力。下面通过几个典型运维场景展示如何将这些命令串联起来。3.1 场景一快速定位服务器负载过高问题初步感知使用htop或top直观查看哪个进程的CPU或内存占用异常。按M或P排序。深入分析CPU如果top显示某个Java进程CPU高使用ps auxww | grep pid查看其完整启动参数确认是否有异常。同时运行vmstat 2 5观察r运行队列和us用户态CPU是否持续高位。再用mpstat -P ALL 2看是否是单个核心跑满可能是单线程应用还是所有核心都高。分析I/O等待如果top显示%waI/O等待高或vmstat的b列有值说明可能是磁盘瓶颈。立即使用iostat -dx 2观察%util和await。如果某个磁盘如/dev/sdb的%util持续在90%以上await很高说明磁盘繁忙。定位具体文件使用iotop需安装查看是哪个进程在进行大量I/O。如果没有iotop可以用pidstat -d 2也来自sysstat查看每个进程的I/O统计。结合lsof -p 高IO进程PID查看该进程打开了哪些文件或者使用find / -xdev -type f -size 100M 2/dev/null | xargs ls -lh | sort -k5,5hr | head -20快速找出系统里的大文件看是否被该进程频繁读写。检查网络如果不是CPU和I/O问题可能是网络阻塞。用ss -tan state established | wc -l查看当前连接数是否异常多。用iftop或nethogs查看实时网络流量和进程带宽占用。实操心得诊断性能问题要有顺序通常CPU、内存、I/O、网络。很多新手一上来就ps aux | grep却忽略了vmstat和iostat提供的系统级瓶颈指标。先看整体vmstat,iostat再定位具体进程top,pidstat这个顺序效率更高。3.2 场景二日志分析与故障排查假设收到报警某应用服务响应缓慢需要从日志中找线索。快速查看最新错误tail -n 100 -f /var/log/application/error.log。-ffollow参数可以实时追踪日志尾部新增内容这是监控日志最常用的方式。搜索特定时间段的错误如果知道大概时间可以用sed或grep截取。例如查看今天10点到11点的日志sed -n /2023-10-27 10:00:00/,/2023-10-27 11:00:00/p application.log。或者用grep配合正则grep 2023-10-27 1[0-1]: application.log。统计错误类型和频率grep -o ERROR.* application.log | cut -d -f2- | sort | uniq -c | sort -nr。这个管道组合先提取所有ERROR行然后cut去掉前面的时间戳等固定字段再排序、去重、计数、按计数倒序排列一眼就能看出哪种错误出现最多。关联分析如果错误日志里有请求ID如request_id: xxxx可以提取一个错误请求的ID然后去访问日志access log中查找该ID的完整请求记录grep xxxx access.log。这能帮你还原错误发生时的用户请求参数、响应时间等信息。使用awk生成简单报告分析Nginx访问日志统计状态码分布awk {print $9} access.log | sort | uniq -c。统计最频繁访问的URLawk {print $7} access.log | sort | uniq -c | sort -nr | head -20。注意事项生产环境的日志文件可能非常大几个GB甚至几十GB。直接使用vim或cat打开大文件会导致内存耗尽。务必使用less、tail、head或结合grep/awk进行流式处理。对于超大的日志可以考虑先使用split命令将其分割成小块再分析。3.3 场景三系统健康检查与巡检脚本日常巡检是运维的常规工作将这些命令固化到脚本中可以极大提升效率和一致性。一个简单的Shell巡检脚本框架可能包含#!/bin/bash # 系统健康检查脚本 HOSTNAME$(hostname) DATE$(date %Y-%m-%d %H:%M:%S) LOG_FILE/var/log/system_health_${HOSTNAME}_$(date %Y%m%d).log { echo 系统健康检查报告 $DATE on $HOSTNAME echo -e \n1. 系统负载与运行时间 uptime echo -e \n2. 内存使用情况 free -h echo -e \n3. 磁盘使用情况 df -hT | grep -v tmpfs echo -e \n4. 最耗CPU的5个进程 ps aux --sort-%cpu | head -6 echo -e \n5. 最耗内存的5个进程 ps aux --sort-%mem | head -6 echo -e \n6. 网络连接数统计ESTABLISHED ss -tan state established | wc -l echo -e \n7. 检查关键服务状态 for service in nginx mysql docker; do systemctl is-active --quiet $service echo $service: Running || echo $service: NOT Running done echo -e \n 检查结束 } | tee -a $LOG_FILE # 可以在此添加邮件发送逻辑将报告发送给管理员 # mail -s 系统健康检查报告 - $HOSTNAME adminexample.com $LOG_FILE这个脚本集成了uptime、free、df、ps、ss、systemctl等多个命令并输出到日志文件。你可以根据需要添加vmstat、iostat的一次性采样或者使用crontab定时运行此脚本实现自动化巡检。4. 命令使用中的常见“坑”与高级技巧4.1 权限与路径之坑rm -rf /的悲剧这是最著名的危险命令。在变量未定义或路径有空格时如rm -rf $SOME_DIR/*如果$SOME_DIR为空则会变成rm -rf /*。防御方法a) 使用rm -rf ./$SOME_DIR增加相对路径前缀。b) 先echo出要删除的命令确认。c) 使用trash-cli等工具将文件移至“回收站”。find命令的-exec陷阱find . -name *.tmp -exec rm {} \;和find . -name *.tmp -exec rm {} 有区别。\;对每个找到的文件执行一次rm而会将所有文件作为一次参数传给rm后者效率更高。但要注意参数数量上限。scp和rsync的路径解析如前面所述目录尾部斜杠/意义重大。另外使用~表示家目录时在远程命令中可能需要转义或使用绝对路径。4.2 数据安全与操作确认与的重定向覆盖echo new file会清空原文件而是追加。在脚本中操作重要配置文件前先备份cp config.conf config.conf.bak.$(date %s)。管道命令的中间错误在管道链cmd1 | cmd2 | cmd3中默认只有最后一个命令的错误会显示。如果想捕获管道中任意命令的错误需要设置set -o pipefail在Bash中。例如set -o pipefail; grep error logfile | head -5如果grep没找到匹配返回非0整个管道会返回非0便于脚本判断。使用alias提升安全性与效率在~/.bashrc中为危险命令设置别名是很好的习惯。alias rmrm -i # 删除前确认 alias cpcp -i alias mvmv -i alias llls -alhF # 自定义一个强大的ls alias grepgrep --colorauto # 高亮匹配4.3 性能与效率技巧处理大量文件时避免使用for file in $(ls *.log); do ...因为如果文件名包含空格或特殊字符会出错。应使用for file in *.log; do ...或find . -name *.log -exec ... \;。grep搜索大文件如果只需要看是否包含某个模式而不需要所有匹配行使用grep -q pattern file。-q参数quiet使grep在找到第一个匹配后立即退出不输出任何内容仅通过返回码表示结果这在脚本判断中非常高效。利用xargs并行处理find . -type f -name *.log | xargs -P 4 -I {} gzip {}。-P 4表示同时启动4个进程并行执行gzip可以极大压缩处理大量文件的时间。命令替换$()vs 反引号现代脚本推荐使用$(command)而不是反引号因为它更清晰且支持嵌套。例如echo Today is $(date)。掌握这23个命令及其组合并理解其背后的原理和陷阱你的Linux运维功力将会迈上一个坚实的台阶。记住命令是死的场景是活的。最好的学习方式就是在实际工作中不断遇到问题然后思考如何用这些工具组合拳去解决它。每一次成功的排障都会让你对这些命令的理解更深一分。