1. 为什么你需要一份“活”的命令手册
每次看到“Linux常用命令大全”这种标题,我都能想象到新手朋友们的期待:一份终极清单,背下来就能横行Linux世界。但现实是,你收藏的PDF、网页书签,很可能在下次需要时,依然找不到那个模糊记忆中的命令。问题不在于命令不够“全”,而在于它们脱离了上下文,变成了一堆冰冷的符号。
我用了十几年Linux,从桌面到服务器,从运维到开发。我的体会是,高效使用命令的关键,不在于记忆的数量,而在于建立一套“场景-命令”的思维映射。当遇到问题时,你能迅速定位到可能相关的命令家族,然后通过--help或man去精确使用它。这份指南的目的,就是帮你搭建这个思维框架。它不是一份静态的列表,而是一张根据任务场景组织的导航图。我们会围绕文件操作、文本处理、系统洞察、网络管理等核心场景,深入每个命令的“为什么”和“怎么用”,并穿插那些只有踩过坑才知道的细节。
最后更新时间“2024年1月”是个锚点,意味着我们会关注那些历经时间考验的核心命令,以及一些在新环境中(比如WSL2、现代发行版)表现更优的用法。让我们忘记“大全”,开始构建属于你的、可生长的命令工具箱。
2. 立足之本:文件与目录操作精要
文件系统是Linux的舞台,所有操作都由此开始。这部分命令看似基础,但细微之处往往藏着效率提升的关键和排障的线索。
2.1 导航与查看:不止是cd和ls
pwd(Print Working Directory) 告诉你身在何处。这听起来简单,但在复杂的目录跳转后,尤其在脚本中,明确当前路径至关重要。
cd(Change Directory) 是回家的路。cd ~或直接cd回用户主目录,cd -在上两个目录间快速切换,这个技巧在对比两个目录内容时极其高效。
ls(List) 是眼睛。但你真的会用它吗?
ls -la这是经典组合:-l长格式显示详细信息(权限、所有者、大小、时间),-a显示所有文件(包括以.开头的隐藏文件)。然而,还有更多:
ls -lh:-h与-l结合,将文件大小以人类可读的形式(K, M, G)显示,告别计算字节的烦恼。ls -ltr:-t按时间排序,-r反向排序。组合起来-ltr就是按修改时间倒序排列,最新文件在最后。排查“哪个文件最近被改动过?”时,一目了然。ls -d */:只列出子目录本身,而不展开目录内容。这在只想看当前目录下有哪些文件夹时非常干净。
注意:
ls的颜色输出依赖于ls的别名(通常是ls --color=auto)。如果在脚本中或通过某些非交互式方式调用,颜色可能不显示。判断文件类型更可靠的方式是看ls -l结果行的第一个字符(-普通文件,d目录,l链接等)。
2.2 创建、删除与移动:权力与风险
touch的主要用途是创建空文件或更新文件的时间戳(访问时间和修改时间)。touch file.txt如果文件不存在则创建,存在则将其修改时间更新为当前时间。这在某些构建工具(如Make)依赖文件时间戳判断是否需要重新编译时很有用。
mkdir(Make Directory) 创建目录。-p参数是精髓所在,它允许你创建多级嵌套目录,且如果中间目录已存在也不会报错。
mkdir -p project/{src,doc,test}/backup这个命令一次性创建了project目录,并在其下创建src,doc,test三个子目录,同时在这三个子目录下都创建了backup目录。大括号扩展是Shell的利器。
rm(Remove) 和rmdir:rmdir只能删除空目录。而rm功能强大也危险。
rm -r:递归删除,用于删除目录及其内容。rm -f:强制删除,忽略不存在的文件和不提示确认。rm -rf /:永远不要尝试的命令。它会强制递归删除根目录下的所有内容。即使在玩笑中也要避免。- 安全习惯:在执行
rm -r前,先使用ls确认目标路径是否正确。对于重要目录,可以先mv到临时位置(如~/.trash)而不是直接rm。
cp(Copy) 和mv(Move):
cp -r:递归复制目录。cp -a或cp -p:-a是归档模式,相当于-dR --preserve=all,它保留文件的所有属性(权限、时间戳、所有权等),并且在复制符号链接时保持链接本身。这是备份或迁移数据时的首选。mv在同一个文件系统内是重命名操作,速度快;跨文件系统则相当于“复制+删除原文件”。- 覆盖提示:默认情况下,
cp和mv会静默覆盖已存在的目标文件。使用-i(interactive) 参数可以在覆盖前提示确认,对于重要操作可以设置别名,如alias cp='cp -i'。
2.3 链接:理解硬链接与软链接的本质
ln(Link) 创建链接。这是理解Linux文件系统的重要概念。
- 硬链接 (
ln source target):为目标文件创建一个新的目录项(inode号相同),指向磁盘上相同的数据块。删除任何一个“链接”,只要还有其他链接存在,数据就不会丢失。硬链接不能跨文件系统,也不能链接到目录。 - 软链接/符号链接 (
ln -s source target):创建一个特殊的文件,其内容是指向源文件路径的文本。类似于Windows的快捷方式。可以跨文件系统,可以链接到目录。如果源文件被删除,软链接将变成“悬空链接”(dangling link),访问会报错。
如何查看一个文件的链接数?使用ls -l,第二列的数字就是硬链接计数。普通文件创建时计数为1,每创建一个硬链接,计数加1。目录的链接计数至少为2(.和父目录中的该目录项)。
3. 文本处理三剑客:grep, sed, awk
如果说文件操作是肢体,那么文本处理就是Linux的神经中枢。日志分析、数据提取、配置修改都离不开它们。grep、sed、awk这三个工具组合起来,几乎可以解决所有文本处理问题。
3.1 grep:模式搜索的利刃
grep(Global Regular Expression Print) 用于在文件中搜索匹配模式的行。
基础用法:
grep 'pattern' file.txt常用参数:
-i:忽略大小写。-v:反向选择,打印不匹配的行。-n:显示匹配行的行号。-c:只显示匹配的行数。-r或-R:递归搜索目录下的所有文件。-l:只打印包含匹配项的文件名,而不是具体行。-E:使用扩展正则表达式(ERE),功能更强大,等同于egrep。-F:将模式视为固定字符串,而非正则表达式,等同于fgrep,在搜索包含大量正则元字符的字符串时更安全快捷。
正则表达式要点:
- 基本正则表达式(BRE):
.匹配任意单个字符,*匹配前一个字符0次或多次,^行首,$行尾,[abc]匹配括号内任意一个字符。 - 扩展正则表达式(ERE):使用
-E后,还可以使用+(1次或多次),?(0次或1次),|(或),()(分组)。例如,grep -E 'error|fail|critical' log.txt搜索包含任一关键词的行。
- 基本正则表达式(BRE):
上下文查看:
-A num(After),-B num(Before),-C num(Context) 分别显示匹配行之后、之前、前后各num行。这在看日志时非常有用,能获取错误发生的上下文。grep -C 5 'OutOfMemoryError' application.log
3.2 sed:流编辑器,批量修改的艺术
sed(Stream Editor) 以行为单位,对文本进行过滤和转换。它特别适合执行批量替换、删除、插入等操作。
- 基本替换:
sed 's/pattern/replacement/flags' files表示替换(substitute)。- 默认只替换每行中第一个匹配项。添加
gflag 进行全局替换:sed 's/foo/bar/g' file。 - 分隔符
/可以替换为其他字符,如果模式或替换字符串中包含/,这很有用:sed 's|/usr/local|/opt|g' file。
- 原地编辑:
-i参数直接修改源文件。务必谨慎!建议先不加-i测试命令,确认无误后,使用sed -i.bak 's/foo/bar/g' file,这会在修改前先创建一个带.bak后缀的备份文件。 - 删除行:
sed '/pattern/d' file删除匹配模式的行。例如,删除空行:sed '/^$/d' file。 - 地址定界:可以指定行号或范围进行操作。
sed '10d' file删除第10行。sed '10,20s/foo/bar/g' file只在第10到20行进行替换。sed '/start/,/end/d' file删除从匹配start的行到匹配end的行之间的所有行。
sed功能极其强大,甚至可以实现简单的编程逻辑(利用保持空间和模式空间)。但对于更复杂的多行文本处理,awk通常是更好的选择。
3.3 awk:不仅仅是文本处理,更是数据报告工具
awk其实是一门编程语言,以字段(列)为单位处理文本数据,尤其擅长处理表格型数据(如CSV、由空格/制表符分隔的日志)。
- 基本结构:
awk 'pattern {action}' file- 对于文件的每一行,如果匹配
pattern,则执行action。 - 如果省略
pattern,则对所有行执行action。 - 如果省略
{action},则默认动作是打印匹配的行。
- 对于文件的每一行,如果匹配
- 内置变量:
$0:整行内容。$1, $2, ... $NF:第1、2、...、最后一个字段。NF(Number of Fields):当前行的字段总数。NR(Number of Records):当前处理的行号(累计)。FS(Field Separator):输入字段分隔符,默认为空格/制表符。可以在BEGIN块或通过-F参数设置,如awk -F',' '{print $2}' data.csv。OFS(Output Field Separator):输出字段分隔符,默认为空格。
- 经典示例:
- 打印文件的第一列和最后一列:
awk '{print $1, $NF}' file - 打印行号大于10的行:
awk 'NR > 10' file - 对某一列求和(假设第二列是数字):
awk '{sum += $2} END {print sum}' file - 根据条件过滤并格式化输出:
awk '$3 > 100 {printf "User: %s, Score: %d\n", $1, $3}' data.txt - 修改分隔符并处理:
awk -F':' '{print "Username:", $1, "UID:", $3}' /etc/passwd
- 打印文件的第一列和最后一列:
awk的BEGIN和END块非常有用,BEGIN在处理任何行之前执行,常用于初始化变量、打印表头;END在处理完所有行之后执行,常用于打印汇总信息。
实操心得:面对复杂的文本处理任务,我通常的思考链是:先用
grep缩小范围,再用sed做简单的行内替换或删除,最后用awk进行精细的字段提取、计算和格式化。管道 (|) 将它们完美连接,例如:cat log.txt | grep 'ERROR' | sed 's/.*\[//;s/\].*//' | awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}'这个命令链可以从日志中提取所有ERROR行,解析出其中的IP地址(假设在方括号内),然后统计每个IP出现的错误次数。
4. 系统洞察与进程管理:看清正在发生什么
一个稳定的系统是服务的基础。掌握系统状态查看和进程管理命令,是运维和开发的必备技能。
4.1 系统资源监控:top, htop, free, df, du
top:动态实时查看系统资源使用情况和进程信息。进入后,按P按CPU使用率排序,M按内存使用率排序,1显示所有CPU核心的详情,q退出。但top的交互和展示对新手不太友好。
htop:top的增强版,界面更直观,支持鼠标操作,颜色区分,垂直和水平滚动查看完整的命令行和树状进程结构。如果你的系统没有,强烈建议安装 (apt install htop/yum install htop)。在htop中,你可以方便地杀死进程(F9)、更改进程优先级(F7/F8)、过滤进程(F4)等。
free -h:查看内存使用情况。-h参数人性化显示单位。关键看available列,它表示系统可用内存(包含可回收的缓存和缓冲区),比free列更能反映真实可用内存。如果available长期很低,可能需要关注内存泄漏或增加内存。
df -h:查看磁盘空间使用情况。-h人性化显示。关注Use%列,避免磁盘写满。对于网络文件系统(NFS)或特殊文件系统,df可能响应慢,可以使用df -h --local只显示本地文件系统。
du -sh *:查看当前目录下各文件和目录的磁盘使用空间。-s只显示总计,-h人性化显示。du -sh .显示当前目录总大小。查找大文件常用命令:du -ah /path | sort -rh | head -20,它会列出指定路径下最大的20个文件/目录。
4.2 进程的创建、查看与控制:ps, pstree, kill, pkill, nohup
ps(Process Status):查看进程快照。最常用的组合是ps aux或ps -ef。
ps aux:BSD风格,显示所有用户的所有进程,信息丰富(USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND)。ps -ef:UNIX System V风格,显示完整格式的进程列表。STAT状态码解读:R(运行/可运行),S(可中断睡眠,通常等待事件),D(不可中断睡眠,通常等待IO),T(停止),Z(僵尸进程)。- 结合
grep过滤:ps aux | grep nginx。
pstree:以树状图显示进程及其派生关系,直观展示父子进程关系,对于理解进程组和会话非常有用。
kill:向进程发送信号。kill -9 PID是发送SIGKILL信号强制终止进程,进程无法捕获或忽略此信号,可能导致资源未清理。应先尝试kill -15 PID(SIGTERM),允许进程进行清理工作。kill -l列出所有信号。
pkill和killall:通过进程名发送信号,而不是PID。例如pkill -9 nginx。使用时要格外小心,确保名称唯一,否则可能误杀。
nohup和&:使进程在后台运行,并且忽略挂断信号(SIGHUP),即使终端关闭,进程也不会退出。典型用法:nohup command > output.log 2>&1 &。这会将命令放入后台运行,并将标准输出和标准错误都重定向到output.log文件。
4.3 系统信息与服务管理
uname -a:打印所有系统信息(内核名称、主机名、内核版本、发行版本等)。
uptime:显示系统运行时间、当前用户数和过去1、5、15分钟的平均负载。平均负载理想值应小于CPU核心数。
systemctl:现代Linux发行版(使用Systemd)的服务管理核心命令。
systemctl status service_name:查看服务状态。systemctl start/stop/restart/reload service_name:启动、停止、重启、重载配置(不中断服务)。systemctl enable/disable service_name:设置开机自启/禁用。systemctl daemon-reload:修改了服务配置文件(.service文件)后,需要执行此命令重新加载Systemd配置。journalctl -u service_name -f:查看指定服务的日志并实时跟踪(-f类似tail -f)。
5. 网络诊断与数据操作:从连通性到传输
在网络世界中,排查问题和移动数据是家常便饭。
5.1 网络诊断:ping, traceroute, netstat, ss, curl
ping:测试网络连通性和延迟。-c指定发送包次数,如ping -c 4 google.com。持续ping可以观察网络稳定性。
traceroute(或tracepath,mtr):追踪数据包到达目标主机经过的路由路径,用于定位网络故障点。
netstat:传统的网络统计工具,功能强大但部分选项在新系统中已被标记为废弃。常用组合:
netstat -tulnp:查看所有监听端口(-l),并显示TCP/UDP(-t/-u),以数字形式显示地址和端口(-n),并显示关联的进程名和PID(-p,需要sudo权限)。netstat -ant:查看所有TCP连接状态。
ss(Socket Statistics):netstat的现代替代品,速度更快,信息更详细。语法类似:
ss -tulnp:功能同netstat -tulnp。ss -ant state established:查看所有已建立的TCP连接。
curl:强大的命令行数据传输工具,支持多种协议(HTTP, HTTPS, FTP等)。它远不止于下载文件。
- 测试API:
curl -X GET https://api.example.com/data - 提交表单数据:
curl -X POST -d 'key1=value1&key2=value2' http://example.com/form - 设置请求头:
curl -H 'Content-Type: application/json' -H 'Authorization: Bearer token' ... - 下载文件并指定保存名:
curl -o filename.zip http://example.com/file.zip - 跟随重定向:
-L - 显示详细通信过程:
-v - 在脚本中,经常用
curl -s(静默模式) 配合-w(写自定义输出) 或-o /dev/null来测试服务可用性或性能。
5.2 安全复制与同步:scp, rsync
scp(Secure Copy):基于SSH的文件传输命令,语法类似cp。
- 从本地复制到远程:
scp local_file user@remote_host:/remote/directory - 从远程复制到本地:
scp user@remote_host:/remote/file /local/directory - 递归复制目录:
scp -r local_dir user@remote_host:/remote/path - 使用特定端口:
scp -P 2222 ...
rsync:更强大的文件同步工具,支持增量同步(只传输变化的部分)、保留文件属性、压缩传输等,是备份和镜像的利器。
- 基本同步:
rsync -avz /source/ user@remote_host:/destination/-a:归档模式,保留所有属性,递归同步。-v:详细输出。-z:传输时压缩。
- 注意源路径的斜杠:
/source/表示同步目录内的内容到目标目录下。/source表示同步目录本身到目标目录下。 - 删除目标端多余文件(使目标与源完全一致):
rsync -avz --delete /source/ /destination/。使用--delete前务必确认源目录是正确的! - 远程同步:
rsync -avz /local/path/ user@remote_host:/remote/path/ - 模拟运行(干跑):
rsync -avz --dry-run /source/ /destination/会显示将要执行的操作而不实际执行,非常安全。
5.3 压缩与解压:tar, gzip, bzip2, xz
Linux下最常见的打包压缩工具是tar,它本身只打包(归档),常与压缩程序(gzip,bzip2,xz)结合使用。
打包与压缩:
.tar.gz或.tgz:tar -czvf archive.tar.gz /path/to/dir.tar.bz2:tar -cjvf archive.tar.bz2 /path/to/dir.tar.xz:tar -cJvf archive.tar.xz /path/to/dir- 参数解释:
-c创建,-z用gzip压缩,-j用bzip2压缩,-J用xz压缩,-v显示过程,-f指定文件名(必须紧跟文件名)。
解压:
.tar.gz:tar -xzvf archive.tar.gz.tar.bz2:tar -xjvf archive.tar.bz2.tar.xz:tar -xJvf archive.tar.xz- 参数解释:
-x解压。解压到指定目录:tar -xzvf archive.tar.gz -C /target/directory
仅查看内容:
tar -tzvf archive.tar.gz
压缩算法选择心得:
gzip速度最快,压缩率一般;bzip2压缩率更高,但速度慢;xz通常压缩率最高,但压缩和解压速度最慢,内存占用也大。对于日常备份或分发,tar.gz是通用性最好的选择。如果需要极致压缩(如发布静态文件),可以考虑tar.xz。
6. 权限、用户与查找:系统的守门员与侦探
6.1 文件权限与所有权:chmod, chown, umask
Linux的权限系统是安全基石。ls -l看到的-rwxr-xr--这样的字符串,代表了文件类型和权限。
- 权限符号:
r(读=4),w(写=2),x(执行=1)。三组分别对应:文件所有者(u)、所属组(g)、其他用户(o)。 chmod(Change Mode):修改权限。- 符号模式:
chmod u+x file(给所有者增加执行权限),chmod go-w file(移除组和其他用户的写权限),chmod a+r file(给所有用户增加读权限)。 - 数字模式(八进制):
chmod 755 file。计算:所有者rwx=4+2+1=7,组r-x=4+0+1=5,其他r-x=4+0+1=5。755常用于可执行脚本或程序目录。 - 递归修改目录及其内容:
chmod -R 755 directory。
- 符号模式:
chown(Change Owner):修改文件所有者和所属组。chown user:group filechown user file(只改所有者)chown :group file(只改组)- 递归:
chown -R user:group directory
umask:默认权限掩码。它决定了新创建文件和目录的默认权限。计算方式:目录默认权限777 - umask,文件默认权限666 - umask(文件通常没有默认执行权限)。查看当前umask:umask。通常为0022,表示新建目录权限为755,文件权限为644。
6.2 用户与组管理:useradd, usermod, passwd
这些命令通常需要root权限。
useradd:创建新用户。-m创建家目录,-s /bin/bash指定登录shell。sudo useradd -m -s /bin/bash aliceusermod:修改用户属性。例如,将用户加入附加组:sudo usermod -aG sudo alice(-aG表示追加到组,不覆盖原有组)。passwd:修改用户密码。sudo passwd alice为alice设置密码,普通用户直接输入passwd修改自己的密码。
6.3 查找一切:find, locate, which, whereis
find:最强大也最常用的文件查找命令,实时搜索,功能复杂。
- 基本语法:
find <path> <expression> - 按名称查找:
find /home -name "*.txt" - 按类型查找:
find /var/log -type f(文件),find . -type d(目录)。 - 按时间查找:
-mtime n:文件内容修改时间在 n*24 小时前。-mtime +7:修改时间在7天前。-mtime -1:修改时间在1天内。-atime(访问时间),-ctime(状态改变时间) 用法类似。
- 按大小查找:
find / -size +100M查找大于100MB的文件。 - 结合执行动作:
find . -name "*.tmp" -delete:找到并删除。find . -type f -exec chmod 644 {} \;:对找到的每个文件执行chmod 644。{}是占位符,\;是命令结束符。- 更安全高效的替代:使用
-exec的+形式,或结合xargs:find . -name "*.log" -print0 | xargs -0 rm。-print0和xargs -0处理包含空格或特殊字符的文件名更安全。
locate:基于数据库的快速查找,速度极快,但数据库需要定期更新 (sudo updatedb)。它不搜索实时文件系统,所以刚创建的文件可能找不到。locate filename。
which:在$PATH环境变量指定的目录中,查找某个命令的可执行文件位置。which python。
whereis:查找命令的二进制文件、源代码和手册页的位置。whereis ls。
7. 终端生存与效率提升:Shell 技巧与环境
7.1 输入输出重定向与管道:>, >>, 2>, &>, |
这是Shell编程的基石。
command > file:将标准输出重定向到文件,覆盖。command >> file:将标准输出重定向到文件,追加。command 2> file:将标准错误重定向到文件,覆盖。command 2>&1:将标准错误重定向到标准输出。command &> file或command > file 2>&1:将标准输出和标准错误都重定向到文件。command1 | command2:管道,将command1的标准输出作为command2的标准输入。
一个常见用法是将错误信息丢弃并记录正常输出:command > output.log 2>/dev/null。/dev/null是一个特殊的设备文件,写入它的任何数据都会被丢弃。
7.2 后台作业与任务控制:&, jobs, fg, bg, Ctrl+Z
command &:在后台运行命令。jobs:查看当前Shell的后台作业列表。fg %n:将后台作业n切换到前台运行。bg %n:将暂停的后台作业n继续在后台运行。Ctrl+Z:暂停当前前台作业,并将其放入后台(状态为Stopped)。然后可以用bg让其继续运行,或用fg调回前台。
7.3 历史、别名与环境变量:history, alias, export
history:查看命令历史。!n执行历史记录中第n条命令,!!执行上一条命令,!string执行最近一条以string开头的命令。alias:创建命令别名。例如alias ll='ls -la',alias grep='grep --color=auto'。别名定义通常放在~/.bashrc或~/.bash_aliases中使其永久生效。export:设置环境变量,对当前Shell及其子进程生效。例如export PATH=$PATH:/usr/local/bin。永久生效需要写入Shell的配置文件(如~/.bashrc)。source或.:执行脚本文件,但在当前Shell环境中执行,而不是新建子Shell。常用于使配置文件修改立即生效:source ~/.bashrc。
7.4 文件内容查看:cat, less, head, tail
cat:连接文件并打印到标准输出。查看短小文件内容,或合并文件:cat file1 file2 > combined。less:分页查看文件内容,支持向前向后翻页、搜索(/向前,?向后)。比more更强大,是查看长文件的首选。head -n 20 file:查看文件开头20行。tail -n 30 file:查看文件末尾30行。tail -f file:实时跟踪文件末尾新增的内容,查看日志的神器。-F参数在文件被轮转(如logrotate)后能自动跟踪新文件。
命令的世界浩瀚无垠,但核心思想是相通的:理解工具的设计哲学,掌握核心参数,并在真实的场景中反复运用。最好的学习方式不是背诵,而是给自己设定小任务,比如“统计日志中每种错误码的出现次数”、“找出系统中占用空间最大的10个文件并打包备份”、“写一个脚本自动部署我的应用”。在解决这些实际问题的过程中,这些命令自然会成为你肌肉记忆的一部分。记住,man command和command --help永远是你最权威、最及时的老师。