这次我们来看 Linux 核心命令。对于开发者、运维工程师或任何需要在 Linux 环境下工作的人来说,命令行的熟练度直接决定了工作效率。这篇文章不打算罗列几百个命令的清单,而是聚焦于那些真正核心、高频使用的命令,并从“怎么用”深入到“为什么这么用”,帮你构建起从操作到原理的知识体系。
无论你是刚接触 Linux 的新手,还是在排查线上问题的老手,掌握这些命令及其背后的逻辑,都能让你在面对未知问题时,快速定位、高效解决。本文将围绕文件操作、系统状态、网络、进程管理和文本处理等核心场景,通过具体示例和原理剖析,一次讲清。
1. 核心能力速览:Linux 命令学习的价值与路径
在深入具体命令之前,我们先明确学习 Linux 核心命令的目标和路径。这并非一个需要特定硬件或显存的“项目”,而是一项基础且持久的能力建设。
| 能力项 | 说明与目标 |
|---|---|
| 核心价值 | 实现对 Linux 系统的完全掌控,包括资源监控、故障排查、自动化运维和性能调优。 |
| 学习门槛 | 极低。只需一台安装 Linux 的物理机、虚拟机或云服务器,甚至 Windows 下的 WSL 即可开始。 |
| “启动”方式 | 打开终端 (Terminal) 或通过 SSH 连接,即进入命令行环境。 |
| “接口”能力 | 命令本身即接口。可通过 Shell 脚本进行组合和自动化,形成强大的“批量任务”处理能力。 |
| “性能”观察 | 核心命令(如top,vmstat,iostat)本身就是监控系统性能(CPU、内存、磁盘 I/O、网络)的工具。 |
| 适合场景 | 日常文件管理、服务器运维、日志分析、环境部署、故障诊断、安全审计、自动化脚本编写等。 |
学习路径建议:先掌握单个命令的常用参数和输出解读,再学习通过管道 (|)、重定向 (>,>>) 组合命令,最终形成解决复杂问题的脚本或命令链。
2. 环境准备:你的第一个 Linux 终端
开始实践前,你需要一个 Linux 环境。选择很多,门槛很低:
- 本地物理机/虚拟机:安装 Ubuntu、CentOS、Debian 等主流发行版。
- 云服务器:购买任意云服务商的 Linux 实例,通过 SSH 连接。
- Windows 用户:使用 Windows Subsystem for Linux (WSL),在 Windows 商店安装 Ubuntu 等发行版。
- Mac 用户:直接使用系统自带的终端(Terminal),其命令与 Linux 高度兼容。
验证环境是否就绪,打开终端,输入以下命令:
# 查看系统内核信息 uname -a # 查看系统发行版信息 (适用于基于RedHat或Debian的系统) cat /etc/os-release # 或 lsb_release -a如果能看到类似Linux、Ubuntu、CentOS等字样,说明你的 Linux 命令行环境已经准备就绪。
3. 文件与目录操作:一切皆文件的基石
Linux 哲学中“一切皆文件”,因此文件操作命令是使用频率最高的。
3.1 导航与查看:pwd,cd,ls
pwd(Print Working Directory):原理:Shell 环境变量PWD存储了当前目录的绝对路径,此命令将其打印出来。pwd # 输出示例:/home/username/projectscd(Change Directory):原理:改变 Shell 的进程工作目录。~代表用户家目录,-代表上一个工作目录,..代表上级目录。cd /etc # 切换到 /etc 目录 cd ~ # 切换到当前用户的家目录 cd - # 切换回上一个所在的目录 cd .. # 切换到上级目录ls(List):原理:读取目录项(inode 和文件名)并格式化输出。-l显示详细信息(权限、所有者、大小、时间),-a显示隐藏文件(以.开头),-h以人类可读格式显示文件大小。ls # 简单列表 ls -la # 详细列表,包含隐藏文件 ls -lh /var/log # 以易读格式列出 /var/log 下的文件
3.2 操作与删除:cp,mv,rm,mkdir,rmdir
cp(Copy):原理:创建源文件的数据副本,并写入到目标路径的新 inode 中。-r参数用于递归复制目录。cp file1.txt file2.txt # 复制文件 cp -r dir1/ dir2/ # 递归复制目录 cp -v source/* dest/ # 复制并显示过程 (-v)mv(Move):原理:在同一个文件系统内,移动操作通常只是修改目录项,指向同一个 inode,速度极快。跨文件系统移动则相当于“复制+删除”。mv oldname.txt newname.txt # 重命名 mv file.txt /tmp/ # 移动到 /tmp 目录rm(Remove):危险命令!原理:删除目录项链接。当文件的链接数为 0 且无进程打开时,其磁盘空间才会被标记为可重用。-r递归删除,-f强制删除。rm file.txt # 删除文件 rm -rf dirname/ # **谨慎!** 强制递归删除目录及其下所有内容最佳实践:先使用
ls确认要删除的内容,或使用rm -i交互式删除。mkdir(Make Directory):创建目录。-p参数可以创建多级目录,如果父目录不存在则一并创建。mkdir new_folder mkdir -p project/{src,doc,test} # 创建 project 及子目录 src, doc, testrmdir(Remove Directory):删除空目录。rmdir empty_folder
4. 系统状态探查:从/proc文件系统说起
Linux 通过虚拟文件系统/proc和/sys暴露内核和进程信息。许多系统状态命令的数据源就来自于此。
4.1 硬件信息查询
根据网络搜索材料,我们可以深入理解如何查看 CPU 和内存信息:
查看 CPU 信息:
/proc/cpuinfo文件包含了每个逻辑 CPU 的详细信息。# 1. 查看物理CPU个数(physical id 去重计数) cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l # 2. 查看每个物理CPU的核心数(cpu cores) cat /proc/cpuinfo | grep "cpu cores" | uniq # 3. 查看逻辑CPU的总数(processor 计数) cat /proc/cpuinfo | grep "processor" | wc -l # 4. 查看CPU型号 cat /proc/cpuinfo | grep "model name" | uniq # 使用 lscpu 命令(更友好,信息聚合) lscpu原理:
physical id标识物理 CPU 插槽,cpu cores是每个物理 CPU 的核心数,processor是操作系统看到的逻辑 CPU(核心数 × 超线程数)。lscpu命令直接解析/proc/cpuinfo并格式化输出。查看内存信息:
/proc/meminfo文件包含了系统内存的详细使用情况。cat /proc/meminfo | head -20 # 查看前20行,包含 MemTotal, MemFree, Buffers, Cached 等 # 使用 free 命令(更常用) free -h # 以人类可读格式显示内存使用情况原理:
free命令的数据即来自/proc/meminfo。重点理解available字段,它表示估算的、可用于启动新应用程序的内存(≈MemFree + Buffers + Cached的一部分)。查看系统内核与版本:
uname -a # 查看所有系统信息(内核名称、主机名、内核版本、架构等) cat /proc/version # 查看内核版本和编译器信息 cat /etc/os-release # 查看操作系统发行版信息(推荐) hostnamectl # 查看主机名和系统信息
4.2 进程管理:ps,top,kill
ps(Process Status):原理:读取/proc/[pid]/下的进程信息文件。常用组合ps aux或ps -ef查看所有进程。ps aux # BSD风格,查看所有用户所有进程的详细信息 ps -ef # UNIX风格,查看所有进程 ps aux | grep nginx # 查找 nginx 相关进程输出解读:
USER(所有者),PID(进程ID),%CPU(CPU占用),%MEM(内存占用),VSZ(虚拟内存大小),RSS(常驻内存集),TTY(终端),STAT(状态,如 S-睡眠,R-运行),START(启动时间),TIME(累计CPU时间),COMMAND(命令)。top/htop:原理:动态、交互式地读取/proc信息,实时刷新。htop是top的增强版,支持颜色、鼠标操作和更直观的视图。top # 启动动态进程查看器 # 在 top 界面中,按 `P` 按 CPU 排序,按 `M` 按内存排序,按 `1` 显示所有 CPU 核心,按 `q` 退出。 htop # 如果已安装,使用 htop(更推荐)关键信息区:第一行(负载平均值
load average),第二行(任务和CPU状态),第三行(内存状态)。负载平均值1.05, 0.70, 0.30分别代表过去 1、5、15 分钟的系统平均负载(可运行和不可中断状态的平均进程数)。kill:原理:向指定进程发送信号(Signal)。默认发送SIGTERM(15),请求进程终止;SIGKILL(9)强制立即终止。kill 1234 # 发送 SIGTERM 给 PID 为 1234 的进程 kill -9 1234 # 发送 SIGKILL 强制杀死进程 killall nginx # 杀死所有名为 nginx 的进程 pkill -f “python app.py” # 根据完整命令名杀死进程
5. 网络诊断:连接与监听
网络问题是运维中的常客,以下几个命令是排查网络问题的利器。
5.1 连接与端口:ping,telnet/nc,netstat/ss
ping:原理:发送 ICMP Echo Request 报文到目标主机,并等待 ICMP Echo Reply,用于测试网络层连通性和延迟。ping -c 4 baidu.com # 向 baidu.com 发送 4 个包后停止telnet或nc(netcat):原理:建立 TCP 连接,用于测试传输层(TCP/UDP)端口是否开放和服务是否响应。telnet 192.168.1.1 80 # 测试 192.168.1.1 的 80 端口(HTTP)是否开放 # 如果提示 `telnet: command not found`, 可以使用 `nc` nc -zv 192.168.1.1 80 # 测试端口连通性 (-z 扫描, -v 详细信息) nc -zv 192.168.1.1 22 80 443 # 测试多个端口netstat与ss:原理:读取/proc/net/tcp,/proc/net/udp等文件,显示网络连接、路由表、接口统计等信息。ss(Socket Statistics) 是netstat的现代替代品,速度更快,输出更清晰。# 查看所有监听端口 netstat -tlnp ss -tlnp # 推荐使用 ss,功能类似,性能更好 # 查看所有已建立的 TCP 连接 netstat -tn ss -tn # 查看进程监听的端口(需要 sudo) sudo netstat -tlnp | grep :80 sudo ss -tlnp | grep :80输出解读:
State(状态,如 LISTEN-监听,ESTABLISHED-已建立),Local Address:Port(本地地址和端口),Foreign Address:Port(远端地址和端口),PID/Program name(进程ID和名称)。
5.2 域名解析:nslookup/dig
nslookup/dig:原理:向配置的 DNS 服务器发送 DNS 查询请求,获取域名对应的 IP 地址(A记录)或其他记录。nslookup baidu.com dig baidu.com # 输出更详细,是专业调试工具 dig baidu.com A # 显式查询 A 记录 dig @8.8.8.8 baidu.com # 指定使用 Google DNS (8.8.8.8) 查询
6. 文本处理三剑客:grep,sed,awk
这是 Shell 编程和日志分析的灵魂,组合使用能解决大部分文本过滤和提取问题。
6.1grep:全局正则表达式搜索
原理:在文件或标准输入中逐行匹配模式(字符串或正则表达式),输出匹配的行。
# 基本搜索 grep “error” /var/log/syslog # 在 syslog 中查找包含 “error” 的行 grep -i “error” file.log # -i 忽略大小写 grep -r “TODO” ./src/ # -r 递归搜索目录 grep -v “success” output.txt # -v 反向选择,输出不匹配的行 grep -E “[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+” access.log # -E 使用扩展正则,匹配 IP 地址 grep -c “pattern” file # -c 统计匹配的行数6.2sed:流编辑器
原理:非交互式地按行处理文本,执行替换、删除、插入等操作。它通常用于对文本进行批量修改。
# 替换文本(最常用) sed ‘s/old/new/g’ file.txt # 将文件中所有的 old 替换为 new sed ‘s/^/# /’ file.txt # 在每行行首添加注释符 (#) sed -i.bak ‘s/foo/bar/g’ file.txt # -i 直接修改原文件,并创建备份 file.txt.bak # 删除行 sed ‘/^$/d’ file.txt # 删除所有空行 sed ‘1,5d’ file.txt # 删除第1到第5行 # 打印特定行 sed -n ‘10,20p’ file.txt # 只打印第10到第20行6.3awk:强大的文本分析工具
原理:将输入行视为由分隔符(默认空格)分隔的字段,并允许你编写脚本来处理这些字段。它本身是一门编程语言。
# 基本打印 awk ‘{print $1}’ file.txt # 打印每行的第一个字段 awk -F‘:’ ‘{print $1}’ /etc/passwd # -F 指定分隔符为冒号,打印用户名 # 条件过滤 awk ‘$3 > 100 {print $0}’ data.txt # 打印第三列大于100的所有行 awk ‘/error/ {print NR “:” $0}’ log.txt # 打印包含 “error” 的行及其行号(NR) # 统计计算 awk ‘{sum += $1} END {print sum}’ numbers.txt # 计算第一列的总和 awk ‘{count[$1]++} END {for (ip in count) print ip, count[ip]}’ access.log | sort -nr -k2 # 统计 IP 访问次数并排序7. 权限与用户管理:chmod,chown,sudo
Linux 的安全基石是多用户和权限系统。
chmod(Change Mode):原理:修改文件或目录的访问权限。权限分为三组:所有者(u)、所属组(g)、其他用户(o)。用r(4-读)、w(2-写)、x(1-执行) 表示。# 符号模式 chmod u+x script.sh # 给所有者添加执行权限 chmod go-w file.txt # 移除组和其他用户的写权限 chmod a+r file.txt # 给所有用户添加读权限 # 数字模式(更常用) chmod 755 script.sh # rwxr-xr-x (所有者:读写执行,组和其他:读执行) chmod 644 config.json # rw-r--r-- (所有者:读写,组和其他:只读)755解析:7(4+2+1)=rwx,5(4+1)=r-x,5(4+1)=r-x。chown(Change Owner):原理:改变文件的所有者和/或所属组。chown user1 file.txt # 将 file.txt 的所有者改为 user1 chown user1:group1 file.txt # 将所有者改为 user1,所属组改为 group1 chown -R user1:group1 ./dir/ # -R 递归修改目录下所有文件sudo(SuperUser DO):原理:允许授权用户以超级用户(root)或其他用户的身份执行命令。配置文件为/etc/sudoers(使用visudo命令编辑)。sudo apt update # 以 root 权限更新软件包列表 sudo systemctl restart nginx # 以 root 权限重启 nginx 服务 sudo -u www-data whoami # 以 www-data 用户的身份执行 whoami 命令
8. 磁盘与存储管理:df,du,mount
df(Disk Free):原理:读取文件系统超级块信息,报告文件系统的磁盘空间使用情况。df -h # -h 人类可读格式,查看所有挂载点使用情况 df -h /home # 查看特定挂载点 /home 的使用情况关键列:
Filesystem(设备),Size(总大小),Used(已用),Avail(可用),Use%(使用百分比),Mounted on(挂载点)。du(Disk Usage):原理:递归统计目录中所有文件的大小,并汇总。du -sh /var/log # -s 总计,-h 人类可读,查看 /var/log 目录总大小 du -h --max-depth=1 /home # 查看 /home 下第一级子目录的大小 du -ah /tmp | sort -rh | head -20 # 列出 /tmp 下最大的20个文件/目录mount/umount:原理:将存储设备(分区、ISO镜像、网络共享等)关联到文件系统目录树(挂载点)。mount # 查看当前所有挂载信息 sudo mount /dev/sdb1 /mnt/data # 将设备 /dev/sdb1 挂载到 /mnt/data sudo umount /mnt/data # 卸载 /mnt/data 上的文件系统
9. 输入输出重定向与管道:Shell 的粘合剂
这是组合命令、实现复杂功能的精髓。
>和>>:重定向输出。>覆盖,>>追加。ls -la > filelist.txt # 将 ls 输出覆盖写入 filelist.txt echo “new line” >> filelist.txt # 将字符串追加到 filelist.txt 末尾2>和&>:重定向错误输出。2>只重定向错误,&>重定向所有输出(标准输出和错误输出)。command_that_might_fail > output.log 2> error.log # 标准输出和错误输出分离 command_that_might_fail &> all_output.log # 所有输出合并到同一个文件<:重定向输入。sort < unsorted_list.txt # 从文件读取内容作为 sort 命令的输入|(管道):原理:将前一个命令的标准输出作为后一个命令的标准输入。# 组合命令的经典示例 ps aux | grep nginx # 查找 nginx 进程 cat access.log | awk ‘{print $1}’ | sort | uniq -c | sort -nr | head -10 # 统计访问日志前10的IP dmesg | tail -50 # 查看内核日志最后50行 find . -name “*.log” -type f | xargs grep -l “ERROR” # 在当前目录查找包含 ERROR 的 .log 文件
10. 常见问题与排查方法
在实际使用中,你可能会遇到以下典型问题。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
命令找不到 (command not found) | 1. 命令未安装。 2. 命令路径不在 $PATH环境变量中。 | which command_name或type command_name | 1. 使用包管理器安装 (apt install,yum install)。2. 使用绝对路径执行 (如 /usr/sbin/ifconfig)。 |
权限被拒绝 (Permission denied) | 1. 对文件/目录没有读/写/执行权限。 2. 操作需要 root 权限。 | ls -l file查看权限,id查看当前用户。 | 1. 使用chmod修改权限。2. 在命令前加 sudo(需有 sudo 权限)。 |
磁盘空间不足 (No space left on device) | 1. 分区使用率 100%。 2. inode 耗尽。 | df -h查看空间,df -i查看 inode 使用。 | 1. 清理大文件 (du -sh *定位)。2. 删除无用文件或扩容磁盘。 |
进程占用端口 (Address already in use) | 已有进程监听该端口。 | sudo ss -tlnp | grep :端口号或sudo lsof -i :端口号 | 1. 停止占用进程 (kill PID)。2. 修改服务配置使用其他端口。 |
无法连接远程主机 (Connection refused或Timeout) | 1. 服务未启动或端口未监听。 2. 防火墙阻止。 3. 网络路由问题。 | 1. 本地检查:sudo ss -tlnp | grep :端口。2. 远程测试: telnet IP 端口。3. 检查防火墙: sudo ufw status或sudo iptables -L。4. 检查路由: traceroute IP或mtr IP。 | 1. 启动对应服务。 2. 配置防火墙放行端口。 3. 检查网络配置和路由。 |
| 文件删除后空间未释放 | 有进程正在占用该文件。 | lsof | grep deleted查找已删除但仍被进程打开的文件。 | 重启或停止占用该文件的进程。 |
Shell 脚本执行报错 (syntax error) | 脚本格式错误(如 Windows 换行符^M)。 | cat -A script.sh查看不可见字符。 | 使用dos2unix script.sh转换格式,或sed -i ‘s/\r$//’ script.sh。 |
11. 最佳实践与使用建议
- 善用
--help和man:遇到不熟悉的命令,第一时间command --help查看简要帮助,或man command查看详细手册。 - 使用 Tab 键补全:在输入命令、路径、文件名时,按 Tab 键可以自动补全,提高效率并减少拼写错误。
- 命令历史与搜索:按
上/下箭头翻阅历史命令,按Ctrl+R可以反向搜索历史命令。 - 将常用操作脚本化:对于重复性的任务组合,将其写入 Shell 脚本 (
*.sh),并赋予执行权限 (chmod +x),实现自动化。 - 理解输出,而非死记命令:重点理解
ps aux、df -h、netstat -tlnp等命令输出中每一列的含义,这比记住命令本身更重要。 - 安全第一:
- 对
rm -rf /保持绝对敬畏,尤其是在sudo环境下。 - 执行未知来源的脚本前,先
cat或less查看其内容。 - 谨慎处理权限,遵循最小权限原则。
- 对
- 利用好日志:系统日志 (
/var/log/syslog,/var/log/messages)、应用日志是排查问题的金矿。结合grep,tail -f,less等工具实时查看和分析。 - 学习组合技:单个命令威力有限,通过管道 (
|)、重定向 (>,>>)、命令替换 ($(command)) 和后台运行 (&,nohup) 将它们组合起来,才能解决复杂问题。
掌握 Linux 核心命令,本质上是掌握了一种与计算机系统直接、高效对话的方式。从简单的文件操作到复杂的系统状态分析,这些命令构成了运维、开发和日常问题排查的基础工具箱。建议你边学边练,在自己的 Linux 环境中反复操作,并尝试用它们去解决实际遇到的小问题。当你能够熟练地将grep、awk、sed与管道组合起来,从海量日志中提取出关键信息时,你会真正体会到命令行的强大与优雅。