在日常运维和开发工作中,你是否曾对
ls -l
输出的那一串神秘字符感到困惑?是否在
ps aux
和
ps -ef
之间犹豫不决?又或者,当磁盘空间告急时,除了
df -h
和
du -sh
,你是否知道如何快速定位大文件并清理?Linux 命令是开发者与系统交互的基石,但很多命令的选项繁多,背后的原理更是鲜为人知。仅仅记住命令的“形”而不理解其“神”,在排查复杂问题时往往会力不从心。
本文旨在打破这种困境。我们将从 使用、原理、到实战排查 ,系统性地拆解 Linux 核心命令。不仅告诉你命令怎么用,更深入解释它为什么这样工作,以及在实际生产环境中如何组合运用这些命令来解决真实问题。无论你是刚接触 Linux 的新手,还是希望深化理解的运维工程师,都能从中获得一套清晰、可复用的知识体系。
1. 核心命令的哲学:一切皆文件
在深入具体命令之前,理解 Linux 的设计哲学至关重要。
“一切皆文件”
是 Linux/Unix 系统的核心思想。这意味着硬件设备(如磁盘
/dev/sda
)、进程信息(
/proc/[pid]
)、系统配置(
/etc
)甚至网络连接,在 Linux 中都可以被视为文件来读写操作。
这个理念直接决定了命令的设计:
-
标准输入/输出/错误
:命令默认从“文件”
stdin(键盘)读取输入,向“文件”stdout(屏幕)输出结果,向“文件”stderr(屏幕)输出错误。我们可以用>、>>、<、|等重定向和管道符号来改变这些“文件”的流向。 -
文本流处理
:大多数命令被设计为处理文本流,它们读取文本,进行过滤、转换、排序,再输出文本。这使得命令可以通过管道 (
|) 灵活组合,形成强大的处理流水线。
理解了这一点,我们再看具体命令时,就能明白它们为何如此设计,以及如何将它们串联起来。
2. 环境准备与学习建议
为了获得最佳的学习效果,建议你准备一个可操作的 Linux 环境。
推荐环境:
- 操作系统 :Ubuntu 22.04 LTS / CentOS 8 Stream / Rocky Linux 9。本文示例命令在这些主流发行版上通用。
-
获取方式
:
- 虚拟机 :使用 VirtualBox 或 VMware Workstation Player 安装一个 Linux 虚拟机。这是最安全、隔离的学习方式。
- WSL2 :如果你使用 Windows 10/11,强烈推荐安装 Windows Subsystem for Linux 2 (WSL2),它提供了近乎原生的 Linux 体验。
- 云服务器 :在阿里云、腾讯云等平台购买一台最低配置的 ECS 云服务器,按量付费成本极低。
- 终端工具 :使用支持 SSH 的终端,如 Windows 下的 Windows Terminal + WSL,或跨平台的 Tabby、MobaXterm。
学习建议:
- 动手实践 :不要只看,一定要在终端里敲一遍命令,观察输出。
-
善用帮助
:记住两个最重要的帮助命令
man [command](详细手册)和[command] --help(快速帮助)。 - 理解输出 :命令输出的每一列代表什么?为什么是这个格式?尝试去理解而不仅仅是记住。
3. 文件与目录操作:从
ls
到
find
这是最基础,也最常被低估的命令集。深入理解它们,是高效工作的前提。
3.1
ls
:不仅仅是列出文件
ls
可能是你输入的第一个命令,但它的选项远不止
-l
。
基础用法与原理:
# 1. 经典长格式列表
ls -l
# 输出示例:-rw-r--r-- 1 user group 1234 Mar 28 10:00 file.txt
# 拆解:
# - 第一个字符:文件类型(-普通文件,d目录,l链接,c字符设备,b块设备)
# rw-r--r--:9位权限,分3组(所有者u、所属组g、其他人o),每组rwx(读、写、执行)
# 1:硬链接计数
# user:所有者
# group:所属组
# 1234:文件大小(字节)
# Mar 28 10:00:最后修改时间
# file.txt:文件名
# 2. 显示隐藏文件(以点开头的文件)
ls -a
# 原理:在Unix传统中,以`.`开头的文件被视为“隐藏”的配置文件。
# 3. 人性化显示文件大小(K, M, G)
ls -lh
# 组合使用:以长格式、人性化大小、显示隐藏文件
ls -lah
# 4. 按时间排序(最新修改的在前)
ls -lt
# 按时间逆序(最旧的在前)
ls -ltr
# 5. 递归列出子目录内容
ls -R
高级技巧与原理:
ls
本身不深入文件内容,它读取的是文件的
inode
信息(存储在文件系统中),包括类型、权限、大小、时间戳等。
-i
选项可以显示 inode 号。
# 显示文件的inode编号
ls -li
3.2
find
:强大的文件搜索器
当你知道文件特征但不知道位置时,
find
是你的终极武器。它的原理是递归遍历指定目录,对每个文件应用测试条件。
核心语法:
find [路径] [表达式]
实战示例:
# 1. 在当前目录及子目录中查找所有 .log 文件
find . -name "*.log"
# 2. 在 /var 目录下查找大于 100M 的文件
find /var -type f -size +100M
# -type f:只找普通文件
# -size +100M:大小大于100MB(c-字节,k-KB,M-MB,G-GB)
# 3. 查找 7 天内被修改过的文件
find /home -type f -mtime -7
# -mtime -7:修改时间在7天以内
# -mtime +30:修改时间超过30天
# 4. 查找并删除所有 .tmp 文件(危险!先确认)
find /tmp -name "*.tmp" -type f
# 确认无误后,再执行删除
find /tmp -name "*.tmp" -type f -delete
# **重要安全提示**:对于删除操作,务必先不加 `-delete` 运行一次,确认找到的文件是预期的,然后再执行删除。生产环境慎用!
# 5. 查找文件并执行命令(将找到的 .conf 文件复制到备份目录)
find /etc -name "*.conf" -type f -exec cp {} /backup/conf_backup/ \;
# -exec ... \;:对每个找到的文件执行命令,{} 代表文件名
原理延伸:
find
的表达式是从左到右求值的,并且默认使用
-and
连接。理解
-atime
(访问时间)、
-mtime
(修改时间)、
-ctime
(状态变更时间)的区别对系统清理和审计很重要。
4. 文本处理三剑客:
grep
,
awk
,
sed
这三个命令是 Shell 脚本和日常排查的脊梁,它们都基于 流编辑 和 正则表达式 。
4.1
grep
:全局正则表达式打印
用于在文本中搜索匹配模式的行。
核心用法:
# 1. 基本搜索(在 file.txt 中搜索包含 “error” 的行)
grep "error" file.txt
# 2. 忽略大小写
grep -i "error" file.log
# 3. 显示匹配行的行号
grep -n "panic" system.log
# 4. 递归搜索目录下的所有文件
grep -r "TODO" /home/project/src/
# 5. 使用扩展正则表达式(支持 +, ?, |, () 等,无需转义)
grep -E "error|fail|critical" app.log
# 6. 反向搜索(输出不匹配的行)
grep -v "INFO" app.log | head -20 # 查看非INFO级别的日志
# 7. 显示匹配行及其后2行内容(查看错误上下文)
grep -A 2 "Exception" java.log
原理与性能:
grep
非常高效,因为它使用了优化的字符串匹配算法(如 Boyer-Moore)。在处理大文件时,
grep
通常比在脚本中逐行读取要快得多。
4.2
awk
:模式扫描与处理语言
awk
不仅仅是一个命令,更是一门强大的文本处理编程语言。它擅长处理
结构化文本
(如 CSV、日志、命令输出)。
基本结构:
awk ‘模式 {动作}’ 文件
如果没有模式,则对所有行执行动作;如果没有动作,则打印匹配的行。
实战示例:
# 假设有文件 data.txt 内容为:
# Alice 25 Engineer
# Bob 30 Manager
# Carol 28 Designer
# 1. 打印第一列(默认以空格或制表符分隔)
awk '{print $1}' data.txt
# 输出:Alice Bob Carol
# 2. 打印最后一列
awk '{print $NF}' data.txt # NF 是当前行的字段数
# 3. 打印第一和第三列,并用逗号连接
awk '{print $1 "," $3}' data.txt
# 4. 带有条件的处理:打印年龄大于28的行
awk '$2 > 28 {print $0}' data.txt # $0 代表整行
# 输出:Bob 30 Manager
# 5. 处理系统命令输出:获取所有正在运行的 bash 进程的 PID
ps aux | awk ‘/bash/ {print $2}’
# `/bash/` 是一个模式,匹配包含 “bash” 的行
# 6. 计算总和:统计所有用户的年龄总和
awk '{sum += $2} END {print "Total Age:", sum}' data.txt
# END 模式在所有行处理完后执行一次
# 7. 设置输入分隔符(处理CSV)
awk -F',' '{print $2}' users.csv
原理理解:
awk
将每一行分割成多个字段(默认分隔符是空白字符),字段名分别为
$1
,
$2
, …
$NF
。它内置了变量(如
NR
当前行号,
NF
当前行字段数)和函数,功能极其强大。
4.3
sed
:流编辑器
sed
用于对文本流进行
非交互式
的编辑(查找、替换、删除、插入)。
核心语法:
s/模式/替换/标志
实战示例:
# 1. 简单替换:将文件中的 “old” 替换为 “new”(只替换每行第一个)
sed 's/old/new/' file.txt
# 2. 全局替换(一行中的所有 “old”)
sed 's/old/new/g' file.txt
# 3. 直接编辑原文件(危险,建议先备份)
sed -i.bak 's/foo/bar/g' config.ini
# -i.bak:直接修改原文件,并创建备份文件 config.ini.bak
# 4. 删除匹配行
sed '/^#/d' config.ini # 删除所有以 # 开头的注释行
sed '/^$/d' file.txt # 删除所有空行
# 5. 打印特定行
sed -n '10,20p' large.log # 只打印第10到20行(-n 抑制默认输出,p 命令打印)
# 6. 在指定行后插入文本
sed '/server_name/a\ listen 80;' nginx.conf
# 在匹配 “server_name” 的行后追加一行 “listen 80;”
组合使用案例:分析 Nginx 访问日志 假设我们要从 Nginx 日志中找出访问量最高的 5 个 IP。
# 典型日志格式:$remote_addr - $remote_user [$time_local] "$request" ...
# 1. 提取IP(第一列)
awk '{print $1}' access.log |
# 2. 排序并统计相同IP出现的次数
sort |
# 3. 合并相邻的重复行并计数
uniq -c |
# 4. 按计数降序排序
sort -rn |
# 5. 取前5行
head -5
这个管道 (
|
) 完美诠释了“一切皆文件”和“文本流处理”的哲学,每个命令只做一件小事,组合起来解决复杂问题。
5. 系统监控与进程管理
当系统变慢或服务异常时,你需要一套诊断组合拳。
5.1
ps
:查看进程状态
ps
命令的参数风格主要有两种:
BSD风格
(不加
-
)和
Unix风格
(加
-
)。混合使用可能导致语法错误。
关键用法对比:
# Unix风格(选项前有-)
ps -ef # 查看全格式的所有进程
# -e:所有进程,-f:全格式(UID, PID, PPID, C, STIME, TTY, TIME, CMD)
ps -aux # 注意,这里是 -aux,不是 aux。这是BSD和Unix风格的混合,但被广泛支持。
# a:显示终端所有进程,u:以用户为主的格式,x:显示没有控制终端的进程
# BSD风格(选项前无-)
ps aux # 最常用的命令之一!查看所有进程的详细信息(USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND)
# 输出列详解:
# USER:进程所有者
# PID:进程ID
# %CPU:CPU占用百分比
# %MEM:内存占用百分比
# VSZ:虚拟内存大小(KB)
# RSS:常驻内存集大小(KB,物理内存)
# TTY:关联的终端
# STAT:进程状态(S-睡眠,R-运行,Z-僵尸,D-不可中断睡眠,T-停止,< -高优先级,N-低优先级,s-会话领导者,+ -前台进程)
# START:启动时间
# TIME:累计CPU时间
# COMMAND:命令名/命令行
# 查找特定进程
ps aux | grep nginx
ps -ef | grep java
原理理解:
ps
读取的是
/proc/[pid]
目录下的虚拟文件系统信息。
/proc
是一个内存文件系统,提供了内核数据结构的接口。
5.2
top
/
htop
:动态监控
top
提供实时、动态的系统状态视图。
交互式快捷键(在 top 运行时按):
-
P:按 CPU 使用率排序。 -
M:按内存使用率排序。 -
1:展开显示所有 CPU 核心的使用情况。 -
k:终止一个进程(会提示输入 PID)。 -
q:退出。
htop
是
top
的增强版,支持鼠标操作、颜色高亮、树状视图,更直观。如果系统未安装,可以使用
sudo apt install htop
或
sudo yum install htop
安装。
5.3 监控 CPU 核心使用率
针对网络热词中的“linux 监控cpu核心 每两秒刷新一次命令”,我们可以使用
mpstat
(来自
sysstat
包)。
# 安装 sysstat
# Ubuntu/Debian: sudo apt install sysstat
# CentOS/RHEL: sudo yum install sysstat
# 每2秒报告一次所有CPU核心的统计信息,共报告5次
mpstat -P ALL 2 5
# -P ALL:报告所有CPU核心(0, 1, 2...)
# 2:间隔秒数
# 5:报告次数
输出会显示
%usr
(用户态)、
%sys
(内核态)、
%iowait
(IO等待)、
%idle
(空闲)等关键指标。
%iowait
过高通常意味着磁盘 IO 是瓶颈。
6. 网络与连接诊断
网络问题是线上故障的常客。
6.1
ss
:现代套接字统计工具
ss
是
netstat
的替代品,速度更快,信息更详细。
常用命令:
# 1. 显示所有建立的连接
ss -tulnp
# -t:TCP, -u:UDP, -l:监听中的套接字, -n:以数字形式显示端口和地址, -p:显示进程信息
# 这是排查“端口被谁占用”的利器!
# 2. 查看所有TCP连接
ss -t -a
# 3. 查看所有监听在80端口的进程
ss -tlnp | grep ‘:80’
6.2
ping
与
traceroute
:连通性与路由追踪
# 测试到目标主机的网络连通性和延迟
ping -c 4 baidu.com # -c 指定发送包的数量
# 追踪数据包到达目标经过的路由路径
traceroute baidu.com
# 在部分系统上,命令可能是 `tracepath` 或 `tracert`(Windows)
6.3
curl
:网络传输利器
curl
功能远超下载,可用于测试 API、检查 HTTP 头、上传文件等。
# 1. 简单获取网页内容
curl https://example.com
# 2. 只显示HTTP响应头
curl -I https://example.com
# 3. 发送POST请求(JSON数据)
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com/endpoint
# 4. 测试端口连通性(模拟TCP连接)
curl -v telnet://127.0.0.1:8080 2>&1 | grep -i “connected”
7. 权限与用户管理
Linux 的权限系统是安全的基石。
7.1 理解
ls -l
的权限位
-rwxr-xr--
如何解读?
- 第一位:文件类型。
- 第2-4位:所有者(u)权限。
- 第5-7位:所属组(g)权限。
- 第8-10位:其他人(o)权限。
-
r=4, w=2, x=1。数字表示法
chmod 751即rwxr-x--x。
7.2
chmod
、
chown
、
chgrp
# 更改文件权限
chmod 755 script.sh # 所有者rwx,组和其他人r-x
chmod u+x file.txt # 给所有者增加执行权限
# 更改文件所有者和所属组
chown user:group file.txt
chown user file.txt # 只改所有者
chgrp group file.txt # 只改所属组
7.3
sudo
与
su
-
su [username]:切换用户,需要目标用户的密码。 -
sudo [command]:以 root(或其他用户)权限执行命令,需要当前用户在sudoers列表中,并输入自己的密码。 -
sudo -i或sudo su -:切换到 root 的交互式 shell(环境变量也会切换)。
安全提示
:生产环境中,应避免直接使用 root 用户,而是通过
sudo
授予普通用户必要的最小权限。
8. 磁盘与存储管理
“磁盘空间不足”是经典警报。
8.1
df
:报告文件系统磁盘空间使用量
df -h # -h 人性化显示(K, M, G)
重点关注
Use%
列。如果
/
或
/var
等关键分区使用率超过 80%,就需要警惕。
8.2
du
:估算文件和目录的磁盘使用量
# 查看当前目录总大小
du -sh .
# -s:只显示总计,-h:人性化显示
# 找出当前目录下最大的10个文件或目录
du -sh * | sort -rh | head -10
# 更精确地查找大文件(跨子目录)
find . -type f -exec du -h {} + | sort -rh | head -20
8.3
fdisk
/
lsblk
:磁盘分区管理
# 列出所有块设备(磁盘、分区)
lsblk
# 输出清晰易读的树状结构
# 查看磁盘分区表(需root权限,谨慎操作)
sudo fdisk -l
9. 综合实战:一个完整的故障排查案例
场景
:线上服务器报警,磁盘
/
分区使用率超过 90%。你需要快速定位问题并解决。
排查思路与命令组合:
-
确认问题 :
df -h确认是哪个挂载点空间不足(例如
/或/var)。 -
定位大目录 :
cd / # 切换到根目录,如果是 /var 满则 cd /var du -sh * | sort -rh | head -10找出占用空间最大的前10个目录。
-
深入挖掘大文件 : 假设发现
/var/log很大。cd /var/log find . -type f -size +100M -exec ls -lh {} \;找出大于100MB的日志文件。
-
分析日志内容 (可选): 如果是应用日志,用
tail,grep查看最近是否有大量错误刷屏。tail -n 100 huge_app.log | grep -i error -
安全清理 :
-
对于日志文件,可以使用
truncate或echo ‘’ > file.log清空(确保应用支持)。 -
更安全的方式是使用
logrotate配置日志轮转。 -
对于旧的安装包、缓存文件(如
/var/cache/apt/或/var/cache/yum/),可以使用包管理器的清理命令。# Ubuntu/Debian sudo apt autoremove sudo apt autoclean # CentOS/RHEL sudo yum autoremove sudo yum clean all
-
对于日志文件,可以使用
-
确认清理结果 :
df -h /观察使用率是否下降。
10. 最佳实践与高级技巧
-
命令组合与别名 :将常用复杂命令设为别名,写入
~/.bashrc。alias ll=‘ls -alF’ alias dps=‘docker ps --format “table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}”’ alias findlarge=‘find . -type f -size +100M -exec ls -lh {} \;’ -
使用
history和Ctrl+R:history查看命令历史,Ctrl+R反向搜索历史命令。 -
脚本安全 :在脚本开头使用
set -euo pipefail。-e遇到错误即退出,-u使用未定义变量时报错,-o pipefail使管道中任何一个命令失败则整个管道失败。 -
理解信号 :
kill -9(SIGKILL)是强制终止,进程无法捕获或清理。应先尝试kill -15(SIGTERM),给进程优雅退出的机会。 -
善用后台与作业控制 :
&将命令放入后台,jobs查看后台作业,fg %1将1号作业调至前台,bg %1在后台继续运行。 -
学习
systemctl:在现代 Linux 系统(使用 systemd)中,使用systemctl start/stop/restart/status/enable [service]来管理服务,替代旧的/etc/init.d/脚本。
Linux 命令的海洋浩瀚无垠,但掌握核心命令及其原理,就如同拥有了航海图和罗盘。从“一切皆文件”的哲学出发,通过管道和重定向将简单的命令组合成强大的工具链,是 Linux 高手必备的思维模式。记住,最好的学习方式就是不断实践,在终端里敲下命令,观察输出,思考原理,并尝试用它们解决你遇到的实际问题。当你能够熟练运用
find
、
grep
、
awk
、
sed
来分析和处理数据,用
ps
、
top
、
ss
、
df
来洞察系统状态时,你已经从一个命令的使用者,成长为系统的理解者和掌控者。


1万+

被折叠的 条评论
为什么被折叠?



