说实话,很多刚接触Linux的人,第一反应是“命令太多了,根本记不住”,然后去网上找各种“Linux常用命令大全”,背两天就放弃了。我自己带过不少新人,也踩过很多坑,今天这篇不做那种面面俱到的命令罗列,而是把Linux基本命令按真实工作场景重新梳理一遍:先搞懂它们背后的设计逻辑,再对照实战场景去用,你会发现需要“背”的东西其实没那么多。
这篇内容适合三类人:刚入门Linux想系统打基础的学生、工作中偶尔要在服务器上操作的非运维开发、以及准备Linux面试想快速查漏补缺的求职者。不管是文件操作、文本处理、权限管理还是网络排查,我会把关键命令、常见参数和实际工作中真正会遇到的坑一起讲清楚。
1. 学习命令前,先把这套底层逻辑刻进脑子
很多人学命令慢,不是因为笨,而是因为没搞懂Linux的底层设计逻辑。Linux世界里所有操作都围绕一个核心思想——“一切皆文件”。你敲下的每一条命令,本质都是在文件系统上做事情。
1.1 “一切皆文件”到底是什么意思
普通文件是文件,目录是文件,硬盘、U盘是文件,键盘、显示器是文件,甚至进程间通信的管道、网络连接,在Linux里也被抽象成了文件。这意味着什么呢?意味着你用来读写普通文件的那套工具,同样可以用来读写设备、统计网络状态、查看进程信息。
举个例子:你在Windows里想看CPU信息,得打开任务管理器;在Linux里,cat /proc/cpuinfo 就能把CPU详细信息直接打印到终端。 /proc 目录本身不是一个真实的硬盘目录,它是由内核动态生成的“文件系统”,里面全是运行时信息。理解了这一点,你就理解了为什么Linux的命令看起来那么“简单粗暴”——因为设计哲学就是:不做特殊化处理,一切按文件对待。
这个思维转变很重要。你用 ls -l 查看一个普通文件的大小、权限、属主,跟你查看一个设备文件、一个socket文件,逻辑完全一样。后面学到 find、grep、重定向 的时候,你会发现它们之所以强大,就是因为这个“一切皆文件”的底层设计。
1.2 相对路径与绝对路径:别在cd命令上浪费时间
很多新手在目录切换上花了大量时间,cd来cd去,最后自己也迷路了。这里有个建议:能用绝对路径说清楚的位置,就不要用相对路径来回cd。
- 绝对路径:从根目录
/开始写,比如/var/log/nginx/access.log,任何时刻执行都定位到同一个地方。 - 相对路径:从当前目录开始定位,比如
../data/backup.tar.gz,表示上一级目录的data子目录。
工作中我见过太多人把 cd /home/user/project 当成肌肉记忆,一条命令一个cd,效率很低。更聪明的做法是用绝对路径直接操作文件,或者用 find、grep 配合路径定位,而不是先cd过去再操作。当然,cd ~ 回到当前用户家目录、cd - 回到上一次所在目录这两个快捷用法建议记住,写脚本和日常操作都很实用。
1.3 管道和重定向:Linux命令的“组合技”
如果说单条命令是积木,那管道和重定向就是让积木拼起来的接口。这也是Linux命令比图形界面强大的地方——你可以把几个简单命令组合起来,完成一个看起来非常复杂的任务。
>重定向输出到文件,会覆盖文件原有内容>>重定向输出到文件,追加到文件末尾|管道,把前一个命令的输出,作为后一个命令的输入
比如你想看当前目录下有哪些文件占的空间最大:
bash复制ls -l | sort -k5 -n | tail -5
这条命令把 ls -l 的输出,交给 sort 按第五列(文件大小)做数字排序,再交给 tail 取最后5行。这就是管道的威力——三个简单命令组合出“查看最大文件”的效果。后面讲文本处理时,你会发现管道几乎是所有复杂操作的基础。
1.4 学会自己查命令:man和--help是你的救命稻草
任何人的记忆力都靠不住,重要的是会查。Linux命令大多自带文档:
bash复制man ls
ls --help
man 是手册页,内容全面但不适合快速查找;--help 通常会给精简的参数说明,日常够用。我自己的习惯是:第一次用某个不熟悉的命令,先 --help 扫一眼常用参数;遇到复杂用法再 man 查详细说明。
这里有个小技巧:在 man 页面里,按 / 输入关键词可以直接搜索,比如想查 ls 的 -l 参数,直接输入 /-l 然后回车,会高亮所有含有 -l 的段落,按 n 跳到下一个匹配项。查完按 q 退出。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件与目录操作:高频操作里的细节与坑
文件操作是Linux日常使用频率最高的命令组,也是新手最容易出问题的地方。这一节我把最常用的命令拆开讲,重点不是参数背诵,而是每个命令在真实场景里的使用逻辑。
2.1 先搞清楚自己在哪:pwd、ls、cd
pwd:打印当前工作目录的绝对路径。很多人不以为然,但当你SSH到一台服务器上,面对一串没有任何提示的$符号时,第一个该敲的就是它。ls:列出当前目录内容。常用参数:-l显示详细信息(权限、属主、大小、修改时间),-a显示隐藏文件,-h让文件大小以人可读的方式显示(K、M、G)。
实际中我几乎每次都用 ls -lh 或 ll(很多系统做了alias),因为光秃秃的 ls 看不到权限信息,排查问题时还得再补一次。
bash复制ll
ls -lha
一个小细节:ls -l 第一列是一串类似 drwxr-xr-x 的字符,第一个字符表示文件类型:d 目录、- 普通文件、l 符号链接。后面9个字符是权限位,具体怎么读,第4节会专门讲。
2.2 创建、复制、移动:mkdir、touch、cp、mv
mkdir -p /a/b/c:-p参数会递归创建不存在的父目录,这个参数非常常用。没有它,创建多级目录要一层层mkdir,有了它一条命令搞定。touch file.txt:创建空文件。另一个用途是更新已有文件的时间戳。cp -r source_dir target_dir:复制目录必须加-r,否则会报错omitting directory;复制文件时cp不会提示目标是否已存在,直接覆盖,这点要小心。mv old.txt new.txt:移动文件,但同名目录下其实就是“重命名”。需要注意,mv跨文件系统时会先复制再删除,耗时比同文件系统下长得多。
这里说一个高频坑:cp 默认不会复制隐藏文件。你想把一个目录完整拷贝走,光用 cp -r 会把隐藏文件漏掉。正确做法是用 cp -a,-a 等于 -dpR,保留权限、属主、时间戳和符号链接,同时包含隐藏文件。迁移环境或者备份配置目录时,我基本都是 cp -a 而不是 cp -r。
2.3 删除文件:rm的几个危险时刻
rm 是Linux命令里最需要敬畏的命令之一,因为Linux没有回收站。特别要注意:
bash复制rm -rf /some/path
-r 递归删除目录内所有内容,-f 强制删除且不提示。这两个参数组合起来,杀伤力极大。我见过不止一次新人把变量写空之后,执行 rm -rf $DIR/*,结果 $DIR 没赋值,命令变成 rm -rf /*,差点把系统删了。
防呆建议:
- 执行删除前先
ls确认路径。 - 尽量少用
rm -rf,能先移动到临时目录就不直接删:mv /data/old_dir /tmp/old_dir_bak - 重要目录别用root操作。
2.4 查找文件:find和它的常用组合
find 命令的常规用法是“按条件找文件”:
bash复制find /var/log -name "*.log" -mtime +7
这条命令在 /var/log 下找所有名字以 .log 结尾、且修改时间超过7天的文件。-name 支持通配符,-mtime 按修改时间过滤,-size 按大小过滤(如 -size +100M)。
更实用的是 find 搭配 -exec 或多个命令结合:
bash复制find /tmp -name "*.tmp" -exec rm -f {} \;
这条命令找出 /tmp 下所有 .tmp 文件并删掉,{} 代表每一个匹配到的文件,\; 表示 -exec 结束。这句在日常清理临时文件时非常好用。不过,凡是涉及 -exec rm 的操作,建议先去掉 -exec 部分只跑 find,确认输出的文件列表没有意外,再补上删除动作。
3. 文本查看与处理:grep、sed、awk实战
日志分析、配置文件修改、数据提取,这些日常运维工作绕不开文本处理。Linux三大文本处理命令 grep、sed、awk,是区分“会用Linux”和“玩得转Linux”的分水岭。这一节我按“查看→过滤→替换→按列处理”的顺序来讲。
3.1 怎么把文件内容读出来:cat、less、tail
cat file:直接输出整个文件。文件小时没问题,文件大时别用,刷屏并浪费内存。less file:分页查看,支持上下翻页、搜索,适合查看大文件和日志。进入后按/搜索,按q退出,按G跳到末尾。tail -f:实时跟踪文件输出,看日志时最常用。加-n 100可以从第100行开始看,比如tail -n 100 -f /var/log/nginx/access.log。
实际工作中,tail -f 基本是看日志的标配。比如服务出问题了,你先 tail -f 打开日志,再在另一个终端重启服务或复现操作,日志会实时滚动,问题现场一目了然。
3.2 grep过滤:从日志中快速找到关键信息
grep 的作用是“过滤”,不是“搜索”。它从文件或标准输入中找出匹配规则的行,打印出来。
bash复制grep "ERROR" /var/log/app.log
grep -i "error" /var/log/app.log # 忽略大小写
grep -r "timeout" /etc/nginx/ # 递归搜索目录下所有文件
grep -n "192.168.1.1" /var/log/access.log # 显示行号
这里说一个容易忽略的细节:grep 匹配的是“包含这个字符串的行”,而不是“这个单词”。搜 error 会把 error123、error_timeout 也搜出来。如果你想精确匹配整个词,用 -w 参数。如果搜的内容包含正则特殊字符(点、星号、方括号等),要么用 grep -F 做纯字符串匹配,要么在前面加 \ 转义,否则结果会莫名其妙。
我自己最常用的组合是 grep -E,即扩展正则表达式。例如从日志中找出所有级别为 ERROR 或 WARN 的行:
bash复制grep -E "ERROR|WARN" /var/log/app.log
3.3 sed替换:修改配置文件不用打开编辑器
sed 是流编辑器,擅长对文本做替换、删除、插入操作。最常用的模式是替换:
bash复制sed -i 's/old_string/new_string/g' file.txt
这里 s 是替换命令,g 表示全局替换(每一行所有匹配都替换,不加 g 只替换每行第一个),-i 表示直接修改原文件。注意:如果不加 -i,sed 只是把处理结果输出到终端,原文件不变。调试时建议先不加 -i 跑一遍,确认输出正确,再加 -i 执行。
举一个实际场景:批量修改nginx配置里的域名。
bash复制sed -i 's/old.example.com/new.example.com/g' /etc/nginx/sites-enabled/*
还有按行删除,比如删除配置文件里的注释行和空行:
bash复制sed -i '/^#/d; /^$/d' /etc/nginx/nginx.conf
有人会问:热词里提到“linux sed 打印出来有乱码”,这多半是文件编码问题。如果文件是GBK编码,用UTF-8终端直接 sed 查看或替换中文,就会显示乱码。这种情况先用 file 命令确认编码,再考虑 iconv 转码,不要盲目操作。
3.4 awk按列处理:日志分析的第一课
awk 的核心思想是把每一行按分隔符拆成多个字段,然后对字段做处理。默认分隔符是空格或Tab。
bash复制awk '{print $1, $4}' /var/log/nginx/access.log
这条命令打印access.log每一行的第1个字段(通常是客户端IP)和第4个字段(通常是时间)。日志格式不同,字段位置就不同,先用 head -1 看明白格式再动手。
awk 还支持条件过滤和统计:
bash复制awk '$9 == 404 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
这条命令组合起来的意思是:从日志中找出所有状态码为404的行,打印IP字段,排序后统计每个IP出现次数,按次数倒序排列,取前10名。一次就能找出“谁在大量制造404请求”。这就是管道加awk的日常用法。
新手学awk,不需要背复杂语法,掌握 print、条件判断 if、以及 BEGIN{} END{} 两个特殊块就够用了:
bash复制awk '{sum += $1} END {print "sum:", sum}' numbers.txt
这段代码把每一行的第1列数值累加到 sum 变量,最后打印总和。日志统计、数据汇总这类工作,完全够用。
4. 权限、用户与进程:报错之后的完整排查链路
Permission denied 是Linux新手最容易遇到的报错之一。很多人一看到这个就直接 chmod 777,这是最危险的习惯。这一节我把用户、权限、进程串成一条完整的排查链路,让你遇到报错能自己定位。
4.1 用户与组:新建用户到底做了什么
管理用户涉及三个常用命令:
bash复制useradd newuser
passwd newuser
usermod -aG sudo newuser
useradd newuser 只是创建了一个用户账户,并没有设置登录密码。passwd newuser 才设置密码。usermod -aG sudo newuser 是把用户加入sudo组,赋予管理员权限。这里的 -aG 参数很重要,-a 表示追加(append),-G 表示指定附加组,不加 -a 会把用户从原来的附加组里剔除,这是一个非常隐蔽的坑。
实际场景里,很多人安装完Linux后想创建一个日常使用的新用户,如果只执行 useradd tom 而不设置密码,用 su tom 切换时会发现怎么都切不过去,就是因为密码还没设。另外,useradd -m 才会同时创建该用户的家目录 /home/tom,不带 -m 创建的用户没有家目录,很多程序会因此报错。
4.2 文件权限位:rwx到底怎么读
Linux每个文件都有“属主(u)、属组(g)、其他人(o)”三类身份,每类身份有读(r=4)、写(w=2)、执行(x=1)三种权限。用 ls -l 查看时,权限位长这样:
text复制-rw-r--r-- 1 root root 1024 Mar 10 10:00 file.txt
- 第1位
-是文件类型 - 第2到4位
rw-是属主权限(root可读写,不可执行) - 第5到7位
r--是属组权限(组内用户只读) - 第8到10位
r--是其他人权限(只读)
数字表示法是把每类权限的数值相加:rw- 是 4+2=6,r-- 是4。所以 644 表示属主读写、属组和其他人只读。这是普通文件的常见权限。目录的 755 表示属主全部权限、其他人可读可执行(可进入目录)。
修改权限用 chmod,修改属主用 chown:
bash复制chmod 755 script.sh
chown admin:admin /data/project
这里强烈建议:不要在生产环境用 chmod 777。777 意味着任何用户都能读写执行这个文件,对于网站配置文件、密钥文件、数据库文件来说等于裸奔。如果只是想让服务能写日志,把属主改成服务用户,或者给目录授 775 就够了。遇到 Permission denied,先 ls -l 看清楚当前用户和文件属主/属组的关系,再决定怎么改,而不是一把梭777。
4.3 进程管理:找到那个占用CPU或端口的进程
进程管理常用三个命令:
bash复制ps -ef | grep java # 查看java相关进程
top # 实时查看CPU、内存占用
kill -9 PID # 强制结束进程
ps -ef 输出所有进程,列很多,一般配合 grep 过滤。top 进入交互界面后按 P 按CPU排序、按 M 按内存排序、按 q 退出。
kill -9 是强制杀进程,正常情况下先尝试 kill PID(默认发TERM信号,让进程优雅退出),不行再 kill -9。加了 -9 的进程没有机会清理资源,可能留下临时文件或损坏数据,所以能不用就别用。
用 top 发现某个进程CPU爆满,但又不知道它是什么程序,可以用 ls -l /proc/PID/exe 查看该进程对应的可执行文件路径。例如:
bash复制ls -l /proc/12345/exe
输出会告诉你PID 12345 这个进程到底跑的是哪个目录下的哪个程序,这个技巧在排查可疑进程时特别有效。
4.4 端口占用排查:9090端口被谁占用了
热词里有“linux的9090端口什么再用”,这个问题非常典型。要排查端口占用,一套命令走完:
bash复制netstat -tlnp | grep 9090
或者新版系统用 ss:
bash复制ss -tlnp | grep 9090
-t 显示TCP端口,-l 只显示监听状态,-n 不反解域名(更快),-p 显示占用进程的PID和名字。输出的最后一段会告诉你哪个进程占用了9090端口。
如果没装 netstat 或 ss,更直接的是 lsof:
bash复制lsof -i:9090
这会列出所有跟9090端口相关的进程和连接。找到PID后再用 ps -p PID -f 查看完整命令行,就知道是谁在监听这个端口了。
5. 网络操作与文件传输:服务器之间的协作
单机操作只是Linux的一部分,服务器之间传文件、查网络、测接口是更日常的工作。这一节讲几个高频网络命令,重点说参数含义和容易翻车的细节。
5.1 scp:跨服务器传文件的基本操作
scp 基于SSH协议传文件,用法和 cp 有点像,但涉及远程主机时需要写清楚“哪台机器、哪个路径”。
bash复制scp local_file.txt user@192.168.1.100:/home/user/
这表示把本机的 local_file.txt 传到远程主机 /home/user/ 目录。反过来,从远程下载:
bash复制scp user@192.168.1.100:/var/log/app.log /tmp/
需要注意:
- 如果SSH端口不是默认22,要加
-P 端口号(大写P,scp和ssh的参数一致)。 - 传目录加
-r。 - 输入密码时终端不显示任何内容,这不是卡住,直接敲完回车就行。
- 经常有人把本机和远程地址写反,传完之后发现文件不见了。稳妥起见,执行前把命令里
:前后两个路径都念一遍:从哪来、到哪去。
scp 适合小文件临时传输。如果经常做增量同步、断点续传,用 rsync 更合适:
bash复制rsync -avz /data/backup/ user@192.168.1.100:/data/backup/
-a 归档模式保留权限和时间戳,-v 显示过程,-z 传输时压缩。rsync 最大的好处是只传差异部分,大数据量下比 scp 快得多,而且中断后重新执行会从断点继续。
5.2 连通性与接口测试:ping和curl
ping 用来测试网络连通性,属于ICMP协议。如果 ping 不通,先确认目标主机IP是否写错、防火墙是否屏蔽ICMP、是否跨网段。但要注意,ping 通不代表服务正常,ping 不通也可能是对方禁ping,不代表服务挂了。
真正要验证服务是否正常,用 curl:
bash复制curl -I http://localhost:8080/health
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://api.example.com/submit
-I 只请求响应头,适合快速看HTTP状态码;-X 指定请求方法;-d 传数据。排查接口问题时,curl 基本是标配,尤其在服务器上没有浏览器的情况下,用它模拟GET/POST请求是唯一直接的办法。
热词里的“linux curl”,实际工作里最常见的场景是:
bash复制curl -I https://www.baidu.com
如果返回 HTTP/2 200,说明网络链路没问题。如果卡住或超时,再看DNS配置、路由和防火墙。
5.3 查看网络连接和路由:netstat、ss、ip
除了端口监听状态,日常还会遇到“某个服务连不上数据库”这类问题。这时先确认网络层是不是通的:
bash复制ip addr show
ip route show
ip addr 查看本机所有网卡IP,ip route 查看路由表。这是现代Linux系统替代 ifconfig、route 的新命令,很多新装系统已经没有 ifconfig 了。
如果要查看当前机器的所有TCP连接状态,ss -s 可以汇总统计:
bash复制ss -s
输出会显示当前系统有多少TCP连接、多少处于ESTABLISHED、多少处于TIME_WAIT。TIME_WAIT过多通常是短连接频繁导致,配合内核参数优化,但这是后话,新手先学会用 ss -s 看整体状态就够了。
6. 软件安装与系统信息:从零搭环境的基础操作
最后聊一下在Linux上装软件、查系统状态的事。很多人第一次拿到一台干净的服务器,第一件事就是装环境,而安装命令因系统发行版而异,这一节我把两种主流包管理器都列出来。
6.1 软件包管理:yum、apt、dnf怎么选
Linux发行版分两大系:Debian系(Ubuntu、Debian)用 apt,Red Hat系(CentOS、Rocky Linux、AlmaLinux)用 yum 或 dnf。新系统基本都转向 dnf 了,但 yum 命令还是兼容的。
bash复制# Debian系
apt update
apt install -y nginx
# Red Hat系
yum install -y nginx
dnf install -y nginx
apt update 是刷新软件源索引,装了新软件源之后必须执行这一步,不然装包时会提示找不到软件。-y 参数表示自动确认,不加的话会交互式询问“是否继续”,脚本里必须加,否则会卡住。
搜索软件包:
bash复制apt search docker
yum search docker
卸载软件:
bash复制apt remove nginx
yum remove nginx
需要注意,remove 只卸载软件本身,配置文件不一定清掉。想彻底清理加 purge(apt系)或 remove --purge。很多时候你卸载重装一个服务,发现配置还在,就是因为没有清理配置文件。
6.2 服务管理:systemctl的日常操作
现在的Linux系统都用 systemd 管理服务,操作统一走 systemctl:
bash复制systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl status nginx
systemctl enable nginx # 开机自启
其中 enable 很关键。很多人装完nginx,手动 systemctl start nginx 启动后没执行 enable,一重启服务器服务就没了,还以为是软件坏了。正确姿势是安装完直接 systemctl enable --now nginx,--now 表示立即启动并设置开机自启,一条命令搞定两件事。
查看服务日志也是日常:
bash复制journalctl -u nginx -f
-u 指定服务单元,-f 实时跟踪。你可以把它理解成“服务的专属日志流”,比直接翻 /var/log/nginx/ 下的文件更集中,而且systemd管理的服务日志都被journald收集了。
6.3 磁盘与内存:df、du、free怎么用
服务器跑着跑着磁盘满了,是最常见的问题之一。排查三步走:
第一步看整体磁盘使用情况:
bash复制df -h
-h 以人可读的大小显示。输出里 /dev/vda1 这类设备挂载在 / 上,使用率到100%就会出现各种诡异问题。
第二步找大目录:
bash复制du -sh /var/log/*
du 统计目录占用空间,-s 只显示汇总,-h 人可读。注意 du 对超大目录统计很慢,可以先定位到嫌疑最大的目录再执行。想一层层往下找,可以 du -h --max-depth=1 / | sort -hr | head -10,直接列出根目录下占用最大的前十名。
第三步看内存:
bash复制free -h
输出里 total 是总内存,used 是已用,available 才是真正可用的内存。很多人盯着 used 看,发现几乎占满就慌了。实际上Linux把空闲内存拿来做了文件缓存(buff/cache),这部分内存需要时会自动释放给应用。判断内存够不够用,看 available 而不是 used,这个知识点特别容易误解。
6.4 内核版本与系统信息:一张快速体检表
拿到一台新机器,第一件事通常是确认系统版本和内核:
bash复制cat /etc/os-release
uname -r
/etc/os-release 会显示发行版名称和版本号,uname -r 显示内核版本。如果你要下载某个软件、驱动,先确认内核版本和发行版,不然很容易装错包。
查看CPU和内存信息:
bash复制lscpu
cat /proc/meminfo | head -5
lscpu 会显示CPU核数、型号、架构,排查性能问题或申请软件License时常用。/proc/meminfo 是内存详细信息的虚拟文件,free 命令的数据来源就是它。
最后提一个每个运维都会遇到的问题:磁盘满了但 df -h 显示还有空间,服务却报“No space left on device”。这种情况多半是inode耗尽了,用 df -i 查看inode使用率。如果inode满了,说明小文件太多,需要清理邮件队列、session文件或临时目录。这个坑很少出现在教程里,但实际环境里遇到一次就印象深刻。
我把这6个部分串起来看,其实就是一条从“了解系统”到“日常操作”再到“排查问题”的完整路径。命令本身不难,难的是理解每个命令在什么场景下用、为什么这样用。我自己也是从背命令、踩坑、翻文档一步步过来的,上面这些内容与其说是教程,不如说是一份整理过的实战笔记。如果你能一边敲一边想“这个命令背后是在操作哪个文件、什么进程”,进步会比单纯背快得多。
