Linux进阶必备:系统监控、文本处理与运维排错指令实战
2026/9/16 3:45:36 网站建设 项目流程

1. 从“会敲命令”到“懂Linux”,还差这几条指令的距离

不少朋友学Linux都会经历一个阶段:lscdpwdcpmv这些基础指令已经用得很顺了,文件能建、目录能进、权限能改,觉得自己“差不多会了”。但真到了配环境、跑服务、排查问题的时候,又发现处处卡壳——文件解压乱码不知道怎么处理,磁盘空间莫名其妙被占满,系统里跑着哪些进程完全没概念,更别提写个循环批量处理日志了。

这篇文章就是给处在“基础已会、实战不足”阶段的朋友准备的。我挑了Linux入门路径里第三批最该掌握的指令,按“系统状态查看、文本处理三剑客、压缩打包、用户与权限、网络与进程、Shell脚本基础”这几条线展开,每条指令都结合真实场景讲,不堆参数表,重点说清楚“什么时候用它、为什么用它、用的时候容易踩什么坑”。

适合谁看?正在学Linux准备面试的、刚入职需要天天跟服务器打交道的、想把自己的开发环境从Windows迁到Linux的,都可以对照着查缺补漏。

2. 系统状态类指令:先把机器的“身体指标”摸清楚

2.1 top、free、df、du——性能与磁盘的四个老熟人

先说说最常用的四个查看类指令,很多新手把它们混着用,其实分工很明确:

  • top:看CPU、内存占用,哪个进程吃资源一眼就能定位。进去后按P按CPU排序,按M按内存排序,按q退出。
  • free -h:看内存总量、已用、可用,-h参数会以G/M为单位显示,比默认的KB友好太多。
  • df -h:看磁盘分区使用率,服务器磁盘满没满,这命令说了算。
  • du -sh 目录名:看某个目录总共占了多大空间。想找“谁把磁盘吃满了”,就一层层du下去。

这四个命令的组合用法才是关键。比如接到告警说磁盘使用率超过90%,我的排查习惯是:先df -h确认哪个分区满了,再cd /后用du -sh *挨个看哪些目录体积大,顺着往下找到具体文件。特别注意du -sh *在目录文件特别多的根目录下可能稍慢,但一般都能接受。

2.2 两个容易忽略但极其有用的参数

  • top -u 用户名:只看某个用户的进程。服务器上多用户共用时,别人说“我那边好卡”,你敲这一条就能快速判断是不是他的进程在吃资源。
  • du -sh * | sort -rhdu的结果按体积倒序排,sort -rh中的-r是倒序,-h是识别du输出的G/M单位来排序。这个组合我在定位磁盘占用问题时几乎必用。

注意:free命令在CentOS 6和7里的输出列含义有差异,新版里buff/cache那部分内存其实是可回收的,所以“可用内存”别只看free那一列,要看available。这也是面试里常考的一个点。

2.3 实战:一条命令定位“磁盘莫名其妙被占满”

我遇到过一台开发服务器,df -h显示根分区100%,但du -sh *算下来所有文件加起来远不到总量,折腾了半天才发现是/tmp目录下有个被进程占用但已删除的大文件。这种场景的处理办法:

先用lsof | grep deleted查看已被删除但仍被进程占用的文件,确认后用kill结束对应进程,系统才会真正释放磁盘空间。这算是Linux运维里很经典的坑了,处理过一次之后就长记性了。

另外补充一个相关经验:在WSL环境里删了大文件后,Windows侧的空间也可能不释放。这不是Linux命令本身的问题,而是WSL的虚拟磁盘不会自动收缩。处理办法是在Windows里执行wsl --shutdown,再重新进入,空间就正常了。

3. 文本处理三剑客:grep、sed、awk的黄金组合

3.1 grep:从“找得到”到“找得快”

grep是Linux里使用频率最高的命令之一,但很多人只会grep 关键字 文件这种最基础用法。几个高频参数值得重点掌握:

  • grep -r 关键字 目录:递归搜索目录下所有文件。
  • grep -i 关键字:忽略大小写。
  • grep -n 关键字:显示行号,看日志定位问题时几乎必须加。
  • grep -v 关键字:反向匹配,排除掉包含关键字的行。
  • grep -c 关键字:统计匹配行数。

实际场景中,查看日志时我最常用的是grep -n 关键字 日志文件 | tail -50,直接看最后50条匹配记录。定位报错时还会配合grep -A 5 -B 5来显示匹配行前后各5行,这样能看到上下文,比单看一行报错信息有用得多。

如果搜索的内容包含特殊字符,比如[]*$,记得用grep -F把内容当纯文本处理,或者用\转义。否则可能什么都匹配不到,白白浪费时间。

3.2 sed:流式编辑的威力

sed是文本处理的关键工具。新手经常听到“用sed改文件”,但自己尝试时总搞不明白为什么跟vim改文件不一样。sed是按行读取、按规则处理、输出结果的流式编辑器,适合处理大文件或批量替换。

最常用的三个场景:

  • 替换文本:sed -i 's/旧内容/新内容/g' 文件,其中-i表示直接修改原文件,g表示全局替换。
  • 打印指定行:sed -n '10,20p' 文件,打印第10到20行。
  • 删除指定行:sed -i '5d' 文件,删除第5行。

注意:-i参数很强大,但也危险。如果不加-ised只是把处理结果输出到屏幕,原文件不会变。建议第一次操作时先不加-i试运行,确认结果无误后再加上,否则改错了没有后悔药。我一般还会在替换前先备份一份原文件:cp 文件 文件.bak

3.3 awk:按列处理数据的瑞士军刀

awk是三个工具里学习曲线最陡的,但也是最能提升效率的。它的核心逻辑是“按行读取,按列处理”。默认按空格或Tab键把每行拆成多列,$1代表第一列,$2代表第二列,$0代表整行。

常见场景举例:

  • 查看某进程的PID:ps aux | grep 进程名 | grep -v grep | awk '{print $2}'
  • 按条件筛出列:awk '$3 > 80 {print $1, $3}' 文件,比如打印第三列数值大于80的行里的第一列和第三列。
  • 统计求和:awk '{sum += $1} END {print sum}' 文件,把第一列所有数值加起来。

awk还内置了BEGINEND两个特殊块:BEGIN在读取文件前执行,END在处理完所有行后执行。配合这两个块能写出很多高效的小脚本。

3.4 三剑客组合实战:统计日志里的异常IP

举一个综合例子,假设access.log是Nginx访问日志,每行格式为“IP 时间 请求 状态码”,想统计访问量最高的前10个IP:

awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

这条命令拆解开来就是标准的三剑客组合思路:awk取出第一列IP,sort排序让相同IP相邻,uniq -c统计每个IP出现次数,sort -rn按次数倒序,最后head -10取前10。这个组合在日志分析里极度常用,建议把每个环节是什么作用背下来。

4. 压缩打包与文件传输:tar、zip、unzip的细节处理

4.1 tar:打包和压缩其实是两件事

很多初学者会把“打包”和“压缩”混为一谈。tar本身是把多个文件合并成一个文件(打包),加上-z参数才调用gzip进行压缩。所以看到tar -czvf时,-z是压缩、-c是创建、-v是显示过程、-f是指定文件名。

日常高频组合:

  • 打包并压缩:tar -czvf 名字.tar.gz 目录/
  • 解压:tar -xzvf 名字.tar.gz
  • 只打包不压缩:tar -cvf 名字.tar 目录/
  • 查看压缩包内容不解压:tar -tzvf 名字.tar.gz

4.2 解压乱码问题的处理

中文文件名在Windows下创建的压缩包,传到Linux里解压后经常出现乱码,这是字符编码问题。Windows默认用GBK编码,Linux默认用UTF-8。用unzip解压时可以通过-O GBK参数来指定编码:

unzip -O GBK 文件名.zip

如果是zip文件,还可以用unar这个工具,它能自动识别编码,比手动指定省心很多。但注意-O参数在部分Linux发行版自带的unzip里可能不支持,需要安装unzip的替代版本,具体可以查看你系统包管理器里有没有unzip-iconv这类扩展包。

tar.gz文件理论上不会出现乱码,因为文件名在打包时已经以UTF-8存储了。如果你遇到tar.gz解压乱码,反而要检查是不是终端显示问题,试试把终端的字符编码切到UTF-8。

4.3 zip和unzip的常用参数

  • 压缩目录:zip -r 名字.zip 目录/-r表示递归包含子目录。
  • 解压到指定目录:unzip 名字.zip -d 目标目录
  • 查看压缩包内容:unzip -l 名字.zip
  • 排除特定文件:zip -r 名字.zip 目录/ -x "*.log",把日志文件排除在压缩包外。

4.4 小技巧:用tar快速复制目录

tar还有一个高级用法:在同一台机器上复制目录时,如果目录特别大,用cp -r可能比较慢,可以这样:

tar -C 源目录父路径 -cf - 源目录 | tar -C 目标目录父路径 -xf -

这条命令把前一个tar打包的数据流直接交给后一个tar解包,不落地生成中间文件。在目录很大时,这个方式通常比cp -r快不少。当然了,如果源目录和目标目录在不同磁盘或文件系统上,差异会更明显。

5. 用户与权限管理:新建用户、授权、切换身份

5.1 新建用户的完整步骤

服务器上多人共用,或者要部署一个独立服务时,新建一个专用用户是常规操作。完整流程:

# 新建用户,同时创建家目录和指定shell useradd -m -s /bin/bash 用户名 # 设置密码 passwd 用户名 # 把用户加入sudo组(CentOS系是wheel组,Ubuntu系是sudo组) usermod -aG wheel 用户名

这里解释一下几个参数:-museradd创建用户时同时创建家目录,-s /bin/bash指定默认shell,不指定的话有的系统默认是/bin/sh,交互体验差别很大。usermod -aG中的-a表示追加,-G表示附加组。一定要加-a,否则会把用户从其他组里踢出去。

用户建完后,用su - 用户名可以切换过去。注意susu -的区别:su -会同时切换环境变量到目标用户,su只在当前shell切换身份。日常操作建议使用su -

5.2 文件权限的三组rwx

ls -l输出里那串-rwxr-xr--是最容易绕晕的部分。拆开来看,一共9个位置,分成三组:所有者(user)、所属组(group)、其他人(others),每组三个字符r读、w写、x执行。

快速记忆法:chmod 754 文件这里的数字分别对应三组权限。r=4w=2x=1,三者相加得到组权限值。所以754就是所有者7=4+2+1(读写执行)、组5=4+1(读执行)、其他人4(只读)。

需要注意:对目录来说,x权限是否开启决定了你能不能cd进去。只有r没有x,能列出目录内容但无法进入目录。这个细节经常让人卡壳。

5.3 修改所有者:chown

把文件或目录的所有者变更给另一个用户,用chown。高频用法:

chown 用户名:组名 文件或目录 chown -R 用户名:组名 目录

-R参数表示递归,处理目录下所有内容。部署应用时,经常需要把代码目录的所有者改成运行服务的用户,否则进程没有权限读写日志或配置文件。

6. 网络与进程管理:从定位问题到解决问题

6.1 查端口占用:ss和netstat

服务起不来、端口被占用、想确认服务是否在监听,这些场景都离不开端口查看指令。老牌工具是netstat,新系统更推荐ss,它的输出更快更清晰:

ss -tlnp

参数拆解:-t查看TCP端口,-l只看监听状态的端口,-n不做域名解析直接显示IP,-p显示对应的进程PID和名称。这四条组合在一起,就能把“谁在监听哪个端口”一次看清楚。

如果只想查某个端口被谁占用:

ss -tlnp | grep 8080

对应的netstat写法是:

netstat -tlnp | grep 8080

6.2 查看与结束进程:ps和kill

ps命令最常用的组合是ps aux-e-A显示所有进程,-f显示完整格式。大多数发行版里直接ps aux就能看到所有进程的PID、CPU、内存占用、启动命令等信息。

找到进程后要结束它:

kill PID kill -9 PID

这里的区别很多人不清楚:kill PID默认发送SIGTERM信号,进程收到后可以自行清理资源再退出,是“礼貌地请它退出”;kill -9 PID发送SIGKILL信号,由内核强制结束进程,没有机会做清理。优先用普通killkill -9是在进程无响应时的最后手段。

6.3 如何判断服务是否在运行

很多新手一上来就用ps aux | grep 服务名,但这个判断方式有个陷阱:grep自身也会出现在结果里。更可靠的方法是:

pgrep -f 服务名 pgrep -u 用户名 -f 服务名

pgrep直接返回匹配进程的PID,没有输出则说明没有匹配进程。这样避免grep匹配到自己的尴尬。类似的命令还有pgrep -l-l表示同时显示进程名。

6.4 一条命令拿到指定服务的PID

结合上面讲的pgrepawk,可以写一个通用取PID的用法:

pgrep -f 关键字 | xargs -I {} ps -p {} -o pid,cmd

或者直接:

pgrep -f 关键字

关于xargs多说一句:xargs可以把前一个命令的输出作为参数传给后一个命令,是Linux管道里的“粘合剂”。在处理文件列表、批量删除、批量移动时特别有用。

7. 查找文件:find的高效用法

7.1 按名称、类型、时间查找

find是查找文件的常用工具,比locate灵活,比grep在文件系统层面查找更高效。常用组合:

  • 按文件名查找:find /路径 -name "文件名"
  • 按文件类型查找:find /路径 -type f(普通文件),find /路径 -type d(目录)
  • 按修改时间查找:find /路径 -mtime -7(7天内修改过的文件)
  • 按大小查找:find /路径 -size +100M(大于100MB的文件)

7.2 配合-exec执行操作

find最强大的地方是可以配合-exec对每个查到的结果执行命令。比如删除一天前的临时日志:

find /var/log -name "*.log" -mtime +1 -exec rm -f {} \;

这里的{}是查找到的文件名的占位符,\;表示-exec参数结束。执行前可以先去掉-exec部分预览一下会匹配到哪些文件,确认无误再执行删除。

7.3 查找大文件定位磁盘问题

前面说过用du -sh *逐层排查,其实还有更直接的find写法:

find / -xdev -type f -size +500M -exec ls -lh {} \;

-xdev限制只在当前文件系统内查找,避免进入其他挂载点导致搜索范围过大。-size +500M筛选大于500MB的文件。这个命令在快速定位大文件时非常有效。

8. Shell脚本基础:把零散命令固化成工具

8.1 脚本的基本结构

学指令的最终目的是组合使用,而组合的容器就是Shell脚本。一个最基础的脚本长这样:

#!/bin/bash # 备份指定目录 BACKUP_DIR="/data" DEST_DIR="/backup" DATE=$(date +%Y%m%d) tar -czvf "$DEST_DIR/backup_$DATE.tar.gz" "$BACKUP_DIR"

第一行#!/bin/bash叫shebang,指定用哪个解释器执行这个脚本。$(date +%Y%m%d)是命令替换,把date命令的输出赋值给变量。脚本写完后,执行chmod +x 脚本.sh赋予执行权限,然后./脚本.sh运行。

8.2 变量与引号的坑

Shell脚本里变量的引号问题经常让人抓狂。简单记一个原则:所有变量引用尽量加双引号,比如"$DEST_DIR"。如果目录名或文件名里有空格,不加引号会直接被拆成多段,命令就出错了。

单引号和双引号的区别也要分清:双引号里的$变量会被展开成值,单引号里的$变量只会原样输出。如果需要在字符串里拼接变量加后缀,用双引号:"backup_$DATE.tar.gz"

8.3 循环批量处理:for的典型用法

批量处理文件是脚本最常用的场景。比如把一个目录下所有.txt文件改成.md

for file in /data/*.txt; do mv "$file" "${file%.txt}.md" done

${file%.txt}是Shell的参数扩展,表示去掉变量file末尾的.txt。这种写法比sed替换文件名更可靠。在循环里,务必给变量加引号,否则遇到含空格的文件名就会出错。

8.4 条件判断:if的常见写法

判断文件是否存在的标准写法:

if [ -f "/路径/文件" ]; then echo "文件存在" else echo "文件不存在" fi

注意[]两侧必须有空格,-f判断是否普通文件,-d判断是否目录,-e判断路径是否存在(不区分文件还是目录)。条件判断里常见的坑就是在方括号内部忘了留空格,导致报command not found

9. 常见问题与排查技巧实录

9.1 解压文件乱码

前面讲过的编码问题再总结一下。遇到中文文件名乱码,首选unar自动识别编码,其次用unzip -O GBK指定编码。如果已经解压出现了乱码文件,可以改用convmv工具批量转换文件名编码。务必先备份再操作,convmv本身也支持--notest参数直接修改。

9.2 WSL删除文件后空间未释放

WSL环境删除大文件后,Windows的vhd虚拟磁盘文件并不会自动变小。排查方法:在WSL里执行df -h确认分区使用率是否已下降,如果文件系统里已释放但Windows侧磁盘没释放,需要执行wsl --shutdown后重新进入,让虚拟磁盘向Windows报告实际使用空间。这一步只影响WSL的虚拟磁盘收缩,不会删除任何数据。

9.3 端口被占用,服务起不来

排查顺序:先用ss -tlnp | grep 端口号确认哪个进程占用了端口,拿到PID后用ps -p PID -o pid,cmd看具体是可执行文件还是其他脚本。如果是旧服务实例残留,kill PID先优雅停止,不行再kill -9。如果端口根本没被监听,那就检查服务的配置文件里绑定的IP和端口是否正确。

9.4 远程机器连接不上

这是一道经典面试题。可以先自己按这个顺序排查:先ping目标IP确认网络通不通,再telnet 目标IP 端口确认端口通不通,然后检查本机防火墙和对方防火墙是否放行。如果端口不通但IP通,多半是防火墙或服务没启动;如果服务启动但绑定了127.0.0.1,外部自然连不上,需要把监听地址改成0.0.0.0

如果上面这些都查完还是不通,最后再看SELinux(针对CentOS系)。遇到过几次,服务明明在监听、防火墙也放行了,但就是连不上,最后定位到SELinux拦截了端口访问,用setsebool -P httpd_can_network_connect 1之类的方式放行才解决。

9.5 tar解压单个文件

有时候压缩包很大,只想解压出其中一个文件,可以用:

tar -xzvf 包名.tar.gz 包内路径/文件名

解压前可以先用tar -tzvf 包名.tar.gz列出包内所有文件路径,确认路径后再精准解压。这种操作避免解压整个包,省时间省磁盘。

10. 一条指令的“组合拳”比二十条孤立指令更有价值

再强调一次,Linux学习到了这个阶段,真正拉开差距的不是会多少条命令,而是能把这些指令组合成解决问题的“组合拳”。

分享一个我日常排查问题的习惯。任何异常出现,我先用df -h看磁盘,用free -h看内存,再用top看CPU,这三个命令基本把服务器最核心的健康状态摸清了。进一步定位时,日志文件用grep配合sedawk处理,进程和端口用sspskill处理,批量操作交给find和循环脚本。这一套流程几乎覆盖了90%的Linux日常运维需求。

另外有个心态上的建议:不要死记硬背每条命令的所有参数。把高频参数用熟,剩下的靠man页和--help查。真正重要的是理解每条命令的作用对象和处理逻辑——grep处理的是“行内的文本内容”,find处理的是“文件系统里的文件名”,sed是流式处理,awk是列处理。把这几个维度搞清楚,遇到新场景自然能想到该用什么工具。

这条学习路径往后的扩展方向很明确:掌握这些指令后,可以继续学习Shell脚本的流程控制、管道符的复杂组合、文本处理的正则表达式,再往后就是系统服务配置、网络配置、容器化部署这些工程化主题了。每一步都是踩着前一步的基础往上走的,所以现阶段把指令的“为什么”弄懂,比背下“怎么敲”重要得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询