Linux常用命令实战:文件操作、日志排查与系统监控一次讲透
很多人一进职场发现身边同事敲 Linux 命令就像弹钢琴自己还在拿鼠标点文件夹那种落差感我太熟悉了。其实 Linux 命令没那么玄乎它就是一套跟操作系统对话的固定句式你只要掌握最常用的那几十条日常工作里 90% 的操作都能搞定。写这篇东西的初衷很简单——把我在项目里真正用过的、踩过坑的、每天都要敲的 Linux 基础指令整理成一份可以直接上手的东西给刚接触服务器、或者正在为“记不住命令”头疼的朋友一次讲透。不管你是用 Linux 做开发、部署服务、处理日志还是偶尔需要登上服务器看一眼状态这篇文章都适用。我不会带你背命令手册而是从“为什么要这样做”出发把每个常用指令背后的逻辑讲明白再给出最稳妥的用法。看完你能达到什么效果呢拿到一台陌生的 Linux 机器你至少敢敲命令行能自己切换目录、操作文件、查日志、找进程、看资源占用应对日常工作的绝大部分需求。1. 先建立几个关键认知再开始敲命令1.1 命令行不是古董是效率工具很多人第一次打开终端心里发怵黑底白字连个按钮都没有像回到了几十年前。但实际用下来你会发现命令行比图形界面高效得多。图形界面每一步操作都要移动鼠标、点击菜单中间还隔着一层渲染和动画命令行呢一条指令敲下去直接出结果尤其在批量操作几百个文件、筛选几万行日志这类场景图形界面根本没办法跟命令行比。我在某个数据处理的模拟项目里需要把几百个日志文件里所有包含“ERROR”的行提取出来用文件管理器一个个翻简直不敢想象但是grep -r ERROR ./logs/ error.txt一行命令几秒钟全部搞定。这就是命令行的真实价值把重复劳动变成一句话。1.2 搞清楚 Shell、路径和通配符这三个基础概念Shell就是你敲命令进去的那个解释器它把你输入的命令翻译成操作系统能执行的动作。最常见的 Shell 是 Bash还有后面慢慢流行起来的 Zsh。你不需要纠结用哪个它们语法几乎一致。路径分绝对路径和相对路径。绝对路径从根目录/开始写比如/home/user/project它不管你在哪都能准确找到目标。相对路径则依赖你当前所在位置./表示当前目录../表示上一级目录。我见过很多新手混淆这两个概念最实用的判断标准就是你要去的目录层级比较深直接上绝对路径只是在当前位置附近操作用相对路径更省事。通配符是命令行的“模糊匹配神器”。*代表任意多个任意字符?代表一个任意字符[abc]表示匹配 a、b、c 中的任意一个。举个例子你想要把某个目录下所有.log结尾的文件打包直接写*.log就全部匹配上了不用一个一个列文件名。2. 文件与目录操作的黄金指令2.1 先学会确认自己在哪里pwd、ls、cd这三条命令是我工作中敲得最频繁的组合它们解决的就是“我在哪”“这有什么”“我要去哪”三个最基本的问题。pwdprint working directory打印当前工作目录告诉你现在身处哪个绝对路径。为什么需要它因为你在相对路径操作时搞不清当前在哪很容易把文件写到意想不到的地方。我碰到过一次某同学以为自己在项目目录里结果pwd一看跑到了/tmp文件全写到临时目录去了一重启全没了。lslist列出当前目录下的文件和子目录。别只会用裸的ls工作里最有用的组合是ls -l以长格式显示包含权限、所有者、大小、修改时间。相当于给文件列表加了详细信息。ls -a显示所有文件包括以.开头的隐藏文件。很多配置文件是隐藏的比如.bashrc。ls -lh在长格式基础上把文件大小显示成人类易读的 K、M、G而不是字节。ls -lt按修改时间排序最新的在前。查最近改动了哪些文件特别好用。cdchange directory切换目录。几个特殊写法要记住cd ~回到当前用户的家目录等同于cd /home/用户名。cd -回到上一次所在目录在两个目录之间来回切换非常好使。cd ..回到上一级目录cd ../..就是往上跳两级。我有段时间天天在/home/user/project/src和/home/user/project/config两个目录间来回跑就是用cd /home/user/project/src和cd -反复跳省了不少敲键盘的时间。2.2 创建和复制文件touch、mkdir、cp、mvtouch的作用一是创建空文件二是更新已有文件的时间戳。创建空文件的场景很常见比如你需要快速建一个占位文件、创建配置文件前先建一个空模板。再有就是配合一些需要“文件存在”才能执行的操作。还有一个容易忽略的用法当文件已存在时执行touch会把它最后修改时间和访问时间都更新成当前时间数据处理脚本有时用这个来触发联动逻辑。mkdirmake directory创建目录。最实用的参数是-p它会递归创建多级目录。比如你要创建project/src/utils这个三层结构一条mkdir -p project/src/utils就全建好了不会因为project不存在而报错。这个参数可以说是新手最容易忽略但又最该记住的。cpcopy复制文件或目录。基础用法是cp 源文件 目标路径。工作里更常用的是cp -r 目录A 目标目录递归复制整个目录不加-r复制目录会直接报错。cp -i 源文件 目标文件目标已存在时提示确认防止把已有文件覆盖了。cp -a归档模式复制保留权限、时间戳等一切属性备份配置文件的理想选择。mvmove移动文件或者重命名。很多人以为 mv 只能移动实际上它是移动和重命名合二为一的命令同目录下操作就是重命名跨目录操作就是移动。日常里最常用的就是mv oldname.txt newname.txt改文件名以及mv file.txt /path/to/newdir/把文件挪走。同样建议常加-i参数覆盖前先确认。2.3 删除操作rm 的禁忌与正确姿势rmremove是删除文件或目录的命令。这是 Linux 里最危险命令的有力竞争者没有之一。为什么会危险因为命令行删除不经过回收站删了就是没了很多文件连恢复工具都救不回来。安全规则三条删除文件用rm 文件删除目录必须加-r递归比如rm -r dirname。强烈建议加-i参数每次删除前确认。永远不要执行rm -rf /这是把从根目录开始的所有东西全部强制递归删除是彻头彻尾的灾难性操作。我亲眼见过某同学在测试环境手滑执行了类似命令瞬间整台机器起不来数据全没了。正确的做法是删除前先ls看清楚目录下有什么或者用find确认范围再谨慎动手。如果真的不确定宁可先mv到一个临时目录放着确认没问题再删。3. 查看文件内容的三层境界3.1 快速预览cat、head、tail、lesscatconcatenate会把整个文件内容全部输出到屏幕。适合查看小文件比如几个配置文件、一些简单的脚本内容。但它有个很实际的问题文件一大内容刷屏而过你根本看不完。所以大文件千万别上来就cat。head默认显示文件前 10 行tail默认显示后 10 行。head -n 50 file.log查看前 50 行tail -n 50 file.log查看最后 50 行。这两个命令看起来简单却是排查日志最重要的起点——程序崩溃时错误信息往往在最后几行。tail -f是工作中我个人最喜欢的一条命令f表示 follow跟踪文件有新内容写入时它会自动继续输出。排查服务日志时先启动这个命令再复现问题日志一行行滚出来问题点一眼就能定位。调试完成后按CtrlC退出。less是看大文件的最佳选择它不会一次性把整个文件灌进内存而是分页加载。进去后用上下方向键逐行滚动、用空格翻页、用/搜索关键词、按q退出。我之前在某个日志分析任务里处理过一个几百 MB 的日志文件用cat根本没法看换less后瞬间流畅。说白了文件一大你就应该条件反射用less。3.2 文本搜索三剑客grep、sed、awkgrepglobal regular expression print按模式搜索文本行是排查日志、筛选信息的第一神器。最常用的组合grep 关键词 文件在指定文件里找包含关键词的行。grep -i keyword 文件忽略大小写。grep -n 关键词 文件显示行号方便直接定位到文件中的该行。grep -r 关键词 目录递归搜索目录下所有文件代码里找函数定义、日志目录里找报错必备。grep -v 过滤词 文件反向匹配即输出不包含过滤词的行。常用于过滤掉调试信息、空行。grep -c 关键词 文件统计匹配行数不逐行显示快速判断某些错误出现的频次。我处理服务异常时最常用的组合是grep -n ERROR\|Exception app.log | head -50把报错行带行号拎出来再顺着行号去上下文看原因。sedstream editor是一个流编辑器擅长对文本做替换、删除、打印等操作。核心用法是sed s/旧内容/新内容/g 文件。其中s表示替换substituteg表示全局替换global不写g只替换每行第一处匹配。注意一个关键点sed 默认不修改原始文件它把处理结果输出到屏幕。如果你要让修改生效到文件里需要加-i参数比如sed -i s/127.0.0.1/0.0.0.0/g config.conf。第一次用-i时务必小心改错了就麻烦了建议先在无-i的状态下跑一遍查看输出是否正确。awk是文本处理里的重型武器它把每一行按字段切分默认以空格作为分隔符然后按字段做处理。日常工作最常用的场景是提取某几列。比如有个文本每行格式是“用户名 IP 登录时间”你想只看 IP 那一列就可以awk {print $2} file.txt第二个字段就是 IP。如果想用逗号做分隔就写成awk -F, {print $1} data.csv。awk 能力远不止这些但对大多数日常场景掌握列提取这一招就能解决很多问题。这三条命令单独用已经很有价值更厉害的是它们配合管道可以组合出很强大的数据处理链路这个我会在后面章节展开讲。4. 权限、用户与进程管理绕不开的服务器日常4.1 看懂权限位ls -l 输出里的那串字符执行ls -l后每行第一个位置是一串类似-rw-r--r--的字符。10 个字符里第一个-表示这是普通文件d表示目录l表示符号链接。后面 9 个字符分成三组每组 3 个依次对应文件所有者user、所在组group、其他人other的权限。每组里r表示读w表示写x表示执行。举个例子-rw-r--r--的含义是文件所有者可读可写所在组和其他人只可读所有人都不能执行。这个字符表示法和后面要讲的数字表示法是可以互相转换的你需要两种都能看懂。4.2 chmod修改权限chmodchange mode修改文件或目录的权限。常见方式有两种。符号方式好理解chmod ux 文件给所有者加执行权限chmod g-w 文件去掉组用户的写权限chmod or 文件把其他人的权限设为只读用a代表所有人chmod ax script.sh就是所有人都可以执行。数字方式更常用。每组权限用数字表示r等于 4w等于 2x等于 1无权限是 0。对每个身份的三项权限求和就是该身份的数字。比如所有者要读写执行是 4217组用户要读写是 426其他人只读是 4。合起来就是chmod 764 文件。这是一套非常常用的权限配置文件主人能改能跑小伙伴能看能改路人只能看。目录权限有个特别容易踩坑的点对目录来说r权限只是允许你列出目录里有什么x权限才决定你能不能进入这个目录。如果目录没有x权限即使r权限存在你也无法通过cd进入很多查权限问题的人会卡在这一点上。4.3 进程查看与结束ps、top、kill服务出问题时第一件事永远是看进程。psprocess status查看当前进程快照。工作里最常用的命令是ps -ef它显示 PID进程号、父进程 PID、CPU 占用、启动时间、执行命令等详细信息。配合grep就能快速定位某个服务进程比如ps -ef | grep nginx立刻看到 nginx 跑没跑、PID 是多少。top是动态实时监控进入后默认按 CPU 占用率排序显示所有进程的资源消耗和系统整体负载。按P键按 CPU 排序按M键按内存排序按q退出。我觉得最有价值的信息在顶部的前几行系统平均负载load average、CPU 使用率分布、内存总量和可用量。这三个数据基本能判断机器是 CPU 吃紧还是内存不足。kill用于结束进程。根据 PID 杀掉进程kill -9 PID是强制结束kill PID是正常结束尽量先用普通 kill 让进程自我清理。除了按 PID 杀还有pkill 进程名按名字结束比如pkill -f node server.js。kill -9这个概念在业界也成了一个梗——进程无法正常退出时的终极手段。但要注意kill -9不会给进程清理临时文件、保存状态的机会非必要不用。4.4 用户与提权whoami、sudowhoami查看当前用户身份。为什么重要因为权限问题排查的第一步就是确认你以什么身份在操作。我见过有人明明是普通用户执行需要 root 权限的指令一直失败还在那反复调参数结果whoami一看根本不是 root。sudosuperuser do让你以管理员权限执行命令比如sudo systemctl restart nginx。配置好权限后很多需要 root 权限的操作都要靠它。需要注意的是sudo不是让你随便乱用能不用尽量不用毕竟权限越大破坏力也越大。涉及系统级配置修改执行前要额外谨慎。5. 网络与系统状态程序员最容易忽略但最常用5.1 查看端口和网络连接ss、ping、curl端口是服务器排障的一个高频焦点服务起没起来、端口到底监听没有、能不能连通这些问题的第一步往往就是查端口。ss是查看网络连接的现代工具取代了老旧的netstat。最常用的命令是ss -tlnp-t指 TCP 连接-l指监听中的端口-n用数字显示地址和端口而不是解析成域名-p显示占用这个端口的进程。想看 8080 端口是否有服务监听直接ss -tlnp | grep 8080一目了然。ping用来测试与目标主机之间的网络连通性ping -c 4 目标IP表示发送 4 个探测包后自动停止。不加-c的话它会一直 ping 下去你得手动用CtrlC中断。如果 ping 不通要考虑网线、防火墙、路由等一连串因素如果 ping 通但服务连不上问题多半在服务本身或防火墙的端口权限上。curl是命令行下的网络请求工具开发调试接口频率极高的命令。最常用的是curl 网址直接发起 GET 请求curl -X POST -d {key:value} http://地址/接口发起 POST 请求并带上数据。调试接口时我经常加参数-i看响应头-v看完整请求和响应过程-o把响应保存到文件。有一段时间接口频繁超时就是靠curl -v一步步看在哪里慢、哪里断的。5.2 看磁盘与系统信息df、du、free、uname磁盘满了是运维和开发经常遇到的问题服务不写入、日志不更新、数据库报错排查到最后往往是磁盘满了。df -h查看磁盘整体使用情况-h把容量显示成易读的 G、M 单位。输出里关注使用率接近 100% 就要找出大文件进行清理了。du看目录或文件占用的磁盘空间。du -sh 目录显示某个目录总共占用多大s表示汇总summaryh表示易读格式。du -h --max-depth1 目录可以列出该目录下各子目录的空间占用。磁盘满时我会从根目录开始逐层往下用du扫定位到最占空间的大头。free -h查看内存使用情况重点看两行Mem 行的 total、used、available以及 Swap 行。available 表示实际可分配的内存如果它持续很低就该考虑加内存或者优化进程了。uname -a查看系统内核和架构信息。跨平台部署时这东西特别重要你要确认目标机器是 x86_64 还是 ARM 架构同一个软件包选错了架构就能安装失败。再配合cat /etc/os-release看发行版版本信息基本能判断这台机器是什么环境、该安装哪个版本的软件。6. 管道与重定向把命令串成流水线6.1 管道符的神奇力量管道符|的作用是把前一个命令的输出作为后一个命令的输入。它把多个命令串成一条流水线这是 Linux 命令行最强大的设计之一。比如我要在一个大日志里找出所有包含“ERROR”的行并且按时间排序可以用grep ERROR app.log | sortgrep 把错误行筛出来sort 排序后输出。更实际的一个例子是统计当前系统上一共有多少个与 nginx 相关的进程可以ps -ef | grep nginx | grep -v grep | wc -l。这段链式的管道命令的意思是列出所有进程筛出含 nginx 的行再排除掉 grep 自身的那一行最后用wc -l计数。拆开来每一步都很简单串起来就成了一个非常强大的组合拳。管道组合的逻辑很像积木每个命令是一个标准模块你只需要想清楚每一步要干什么把它们按顺序接起来。工作里遇到复杂的数据处理需求我很少写完整的脚本经常就是一条管道命令直接出结果。6.2 重定向把结果写到文件或丢弃重定向符号负责控制命令的输出流向。把标准输出写入文件覆盖原有内容追加到文件末尾不覆盖2重定向错误输出。实际工作中我最常用的场景是把命令结果保存下来慢慢分析比如ps -ef processes.txt或者把程序正常输出和错误输出分开处理日志文件 21表示把错误输出也合并到标准输出这样日志不会丢。常见的开机启动脚本里经常能看到nohup 命令 app.log 21 这种写法意思是后台运行程序把所有输出写入 app.log错误也一起写入。这里的是把进程放到后台执行。第一次用这个组合时我会习惯性地先确认输出文件路径写对了否则日志写到哪去了都不知道后面排查问题会很痛苦。6.3 一个完整案例查日志定位问题我把前面讲过的命令串起来带你看一个真实的排查过程。假设有个 Web 服务运行不正常用户反映接口经常 5 秒以上不响应。拿到一台服务器我会这样操作ps -ef | grep java确认服务进程还活着。ss -tlnp | grep 8080确认端口在监听。free -h看一眼内存是否够用。df -h确认磁盘没满。tail -n 200 app.log看日志尾部有没有明显的报错。如果疑似某段时间有问题grep -n 2025-01-15 10: app.log | less精确查看那个时间窗口。顺手统计一下高频错误grep -o 错误码[0-9]* app.log | sort | uniq -c | sort -rn把出现次数最多的错误码排在最前面。这几条命令没有一条是复杂的但它们组合起来效率极高。排查问题的通用思路就是这样先确认进程、再确认端口、再看资源、最后看日志逐层缩小范围。7. 常见问题与排查技巧速查表我把这些年摸爬滚打遇见过的高频问题放在这里按症状、排查思路、解决手段整理成表格遇到同类情况可以直接对照。症状排查命令常见原因解决思路命令提示找不到which 命令名软件未安装或不在 PATH 里安装后重新登录或检查 PATH 配置权限被拒绝ls -l 文件权限位不对或不是所有者chmod 加权限或切换用户磁盘占用高df -h、du -sh日志文件或缓存过大清理日志、定位大文件处理服务端口起不来ss -tlnp、ps -ef端口被占用或配置错了杀掉占用进程或改配置端口日志文件刷屏grep -v大量调试信息干扰用反向过滤去掉无关内容命令执行卡住top系统负载过高或等待输入确认资源占用必要时 CtrlC 中断配置文件改错cp -a 配置 配置.bak改错后无法还原修改配置前先备份目录进不去ls -ld 目录缺少执行权限chmod 增加 x 权限有几个细节值得专门提醒。日志文件增长过快导致磁盘打满算是比较常见的事故。一个实用的习惯是每次部署前先看一眼df -h心里有数再动手。还有一个通用规范修改任何重要配置文件前先cp 文件 文件.bak做一个备份成本几乎为零但能救你很多次。再提醒一次通配符的误删风险。rm *.log本想删除所有日志文件如果当前目录里恰好有重要的.log文件也会一并消失。处理这种操作前先ls *.log看一眼匹配到的文件列表再执行删除这是成本最低的安全措施。8. 写给自己也写给新手的几条心里话Linux 命令学起来有种感觉记命令不难难的是形成一套解决问题的思路。命令本身就像工具箱里的螺丝刀、扳手你要知道的不只是每个工具叫什么而是遇到什么场景该拿哪个工具。我见过不少人背了一堆命令真到解决问题时还是不知道从哪下手根源就在思路没建立起来。我的建议是别强求把所有命令和参数都记住记住最常用的几十个剩下遇到时再man 命令名查阅帮助文档。看得多了、敲得多了很多命令就会变成肌肉记忆。操作前多想一步“这条命令会不会造成不可逆的后果”尤其是 rm 和 chmod 这种谨慎永远是对的。最后再分享一个提升效率的小习惯把日常固定要执行的那几条命令整理成一个脚本文件放到一个固定目录里需要用的时候直接执行既省得敲字也避免遗漏。比如一键查看系统状态的脚本把df -h、free -h、uptime、ps -ef加上适当的分隔行打包在一起。实际用下来这个习惯帮我省下了很多重复操作的时间。希望这篇整理能对你的日常 Linux 操作有点实际帮助别怕敲错所有老手都是从敲错开始的。