我刚开始接触Linux那会儿,跟绝大多数人一样,第一件事就是去搜“Linux常用命令大全”。搜出来的文章动辄几百条命令,我照着敲了两天,除了ls和cd,剩下的全忘了。后来在真实服务器上被折磨过几轮才明白:Linux命令从来不是靠背的,它是靠“场景”驱动的。你不需要记住几百条命令,你只需要知道在“要删文件夹”“要新建用户”“要看日志”“要查端口”这些具体场景下,该用什么工具、怎么组合、遇到报错怎么排查。
这篇文章不搞“大全”,也不会把命令列表铺得密密麻麻。我按自己这些年做运维和项目开发的实际经验,把最核心、最能解决实际问题的Linux命令拆成几大块来写,每一块都讲清楚“为什么这么做”和“踩过哪些坑”。无论你是刚入行的小白、准备面试的求职者,还是需要自己折腾服务器的开发者,这篇文章应该都能帮你把命令从“背不下来”变成“顺手就用”。
1. Linux命令学习的正确打开方式:先懂“套路”再记“招数”
1.1 别背命令,先理解命令的“语法公式”
很多人背命令失败,是因为把每条命令当成独立知识点去记,这属于给自己上难度。Linux命令其实有一个通用套路,绝大多数命令都长这样:
code复制命令名 [选项] [参数]
举个例子,ls -l /etc这条命令里,ls是命令名,-l是选项(以短横线开头,用来控制输出格式),/etc是参数(告诉命令操作哪个对象)。这个结构跟“动词 + 副词 + 宾语”的句子语法很像。你只要理解了这句话,遇到一个没见过的命令时,第一反应不应该是“这命令怎么背”,而是“先跑一下命令名 --help,看看它支持什么选项”。
实际工作中你会发现,每个命令的选项其实很有限。真正高频使用的可能就两三个,比如ls最常用的是-l(长格式)、-a(显示隐藏文件)、-lh(人类可读的大小),剩下的选项绝大多数人一年都用不上一次。所以不用怕命令多,核心要掌握的是规律和方法。
1.2 把帮助文档当字典,把man当老师
新手最容易忽略的宝藏是命令自带的帮助文档。不管是ls还是tar,直接敲man ls或ls --help,就能看到这个命令的完整使用说明。我建议你养成一个习惯:拿到一台新服务器、遇到一条没见过的命令,先花30秒看看帮助信息,而不是立刻去网上搜。
man命令打开的是分页文档,操作方式和less一样:按空格翻页,按q退出,按/加关键词搜索。比如你想知道tar怎么不打日志,可以在man tar界面里输入/quiet直接跳过去查。这个习惯一旦养成,你的自主学习能力会上一个台阶,因为Linux的生态里,几乎每个工具都会带完整的文档,这比任何教程都可靠。
1.3 命令到底能干什么:四条“主心骨”
我把Linux命令按使用场景分成四大类,这也是我教新人时用的框架:
- 文件与目录操作:
ls、cd、cp、mv、rm、mkdir、find,解决“文件在哪、怎么建、怎么挪、怎么删”。 - 文本处理与查看:
cat、less、tail、head、grep、awk、sed、vim,解决“文件里写了什么、怎么找、怎么改”。 - 用户与权限管理:
useradd、passwd、chmod、chown、su、sudo,解决“谁能碰这些文件、谁能跑这些命令”。 - 系统与网络管理:
ps、top、free、df、du、ping、telnet、nslookup、systemctl,解决“机器状态怎么样、服务通不通、资源够不够”。
主线只要记住这四条,其他命令基本都是从这些场景里延伸出去的。接下来我按这个框架,把关键命令和实操经验逐个展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件与目录操作:每天敲得最多的命令,坑也最多
2.1 cd和ls:你的“第一视角”
cd是切换目录,这个命令本身很简单,但有几个细节值得注意。cd ~回到当前用户的家目录,cd -回到上一次所在的目录(这个在来回切换两个目录时特别好用),cd ..回到上一级目录。很多新手在脚本里写cd命令时,习惯用相对路径,结果脚本一换目录就报错。我建议在脚本或重要操作里,一律用绝对路径,比如cd /data/logs,这样不管从哪里执行脚本都不会迷路。
ls的坑主要在权限和隐藏文件上。ls -a才能看到以点开头的隐藏文件,比如.bashrc、.ssh,很多配置问题就是因为没看到隐藏文件才排查了半天。ls -lh会用K、M、G这种人类能看懂的单位显示文件大小,而不是一堆字节数字。如果目录里的文件特别多,ls会刷屏,这时候用ls -lh | less分页看。
2.2 rm删除命令:一句话说三遍,别乱删
rm是Linux里最危险且最高频的命令之一,热词里就有“linux删除文件夹命令”,说明大家都关注这个。删除单个文件用rm 文件名,删除整个目录用rm -r 目录名,强制删除不提示用rm -f,最狠的是rm -rf 目录名,这是递归强制删除,从根目录开始会把整个系统删光。
我在这里必须掏心窝子说几句踩坑经验。第一,绝对不要在重要服务器上随手敲rm -rf /或rm -rf /*,网上那些把服务器删空的事故,九成都是这条命令干的。第二,删除前养成先ls确认路径的习惯。比如你想删/data/backup,先ls -ld /data/backup看一下它到底是不是你想要删的那个目录,别手一抖删成了/data。第三,能用mv替代就别用rm。我自己在服务器上处理不确定要不要删的东西时,会先mv 文件名 /tmp/,跑到/tmp下的文件观察几天,确认没问题再彻底删除,这样有个后悔药可吃。
2.3 find查找文件:白纸黑字地找到目标
当文件一多,find就派上用场了。find / -name "nginx.conf"会在根目录下按文件名查找,find /data -type f -size +100M能找出/data下大于100MB的文件,find /data -mtime -3能列出三天内被修改过的文件。
find最常见的坑是权限报错:以普通用户执行find /时,会刷出一堆Permission denied。这时候不用慌,要么用sudo提权,要么把范围缩小到当前用户有权限的目录。另外,find配合-exec可以直接对结果执行命令,比如find /data -name "*.log" -exec rm {} \;,可以批量删除指定类型的日志文件。这个命令比较长,但用熟了效率极高,就是花括号和分号别写错。
2.4 文件复制与移动:cp、mv、scp的分工
cp复制文件,mv移动或重命名文件,这两个在单机内操作很简单,很多人容易忽略的是跨机器传输。这时候要用scp,它是基于SSH加密传输的工具。比如把本地文件传到服务器:
bash复制scp /local/backup.tar.gz root@192.168.1.10:/data/
把服务器上的文件拉回本地:
bash复制scp root@192.168.1.10:/data/app.log /local/
注意,scp走的是SSH的22端口,所以传输前要确保目标机器的SSH服务正常。实际操作里有人会问scp和rsync哪个好。简单说有大量文件或需要增量同步时用rsync(rsync -avz --progress),传单个文件时scp足够用了。
3. 用户与权限管理:新建用户、授权、安全保护
3.1 新建用户的完整流程
热词里“linux新建用户”搜索量很高,这里放一个生产环境下我常用的完整流程。第一步,创建用户:
bash复制useradd -m -s /bin/bash zhangsan
-m表示同时创建家目录(这个参数很重要,不加的话用户登录后没有自己的目录),-s /bin/bash指定用户的登录Shell为bash。第二步,设置密码:
bash复制passwd zhangsan
系统会提示输入两次密码,输入时屏幕上不会显示任何字符,这是正常现象,别以为键盘坏了。第三步,把用户加入sudo组,让它有执行管理命令的权限:
bash复制usermod -aG wheel zhangsan
CentOS/RHEL系列通常是wheel组,Ubuntu/Debian系列通常是sudo组。如果不确定,就执行grep -E "wheel|sudo" /etc/group看一眼。
3.2 文件权限的本质:r、w、x和chmod
Linux文件权限的核心是rwx三个字母加三组身份。r代表读(数字4),w代表写(数字2),x代表执行(数字1),每组权限用三个字母表示,分别是所有者、所属组、其他人。chmod 755就是所有者可读可写可执行(7=4+2+1),组和其他人可读可执行(5=4+1)。这个是最常用的权限设置。
我解释一下为什么755用得最多。比如一个网站的目录,所有者需要写权限来更新文件,其他用户只需要读和执行权限来访问,所以就是755。如果文件需要所有者完全控制、其他人无权限,就用chmod 700或600,比如~/.ssh/id_rsa这种私钥文件,必须是600,权限太宽松SSH会直接拒绝连接。
3.3 修改文件归属:chown和chgrp
chown用来修改文件的所有者和所属组,典型场景是把上传的压缩包交给指定的运行用户。比如把/data/app目录的所有者改成nginx用户:
bash复制chown -R nginx:nginx /data/app
-R是递归,对目录下所有文件生效。如果只是改组,可以用chgrp,但实际工作中chown用得更多,因为它可以同时改两份信息。另外提醒一句,不要随便对系统目录执行chown -R,一旦把/usr这种系统目录的所有者改成普通用户,系统会直接崩。
3.4 普通用户如何提权:su和sudo的选择
su是切换用户,su - root可以切到root用户(注意-会加载root用户的完整环境变量,不加的话环境不对)。sudo是让普通用户临时以root身份执行特定命令,比如sudo systemctl restart nginx。
两者最大的区别是:su需要知道root的密码,sudo只需要输入当前用户的密码。生产环境建议普通用户一律用sudo,不要给太多人root真实密码。sudo的授权配置在/etc/sudoers文件里,用visudo编辑。给某个用户所有权限的写法是:
bash复制zhangsan ALL=(ALL) ALL
给某些命令权限的写法是把最后的ALL换成具体命令路径,比如:
bash复制zhangsan ALL=(ALL) /usr/bin/systemctl
这样用户只能执行systemctl命令,其他管理命令依然没权限,安全性和灵活性兼顾。
4. 文本处理三件套:grep、awk、sed,以及躲不开的vim
4.1 grep:从日志和文件中捞关键信息
grep是做日志排查时用得最多的命令,它按行匹配内容。最常用的几个场景:
bash复制# 在nginx访问日志里找包含“500”的行
grep " 500 " /var/log/nginx/access.log
# 递归查找目录下所有包含“error”的文件
grep -r "error" /data/logs/
# 显示匹配行的行号,方便去编辑器里定位
grep -n "timeout" app.log
# 排除无关内容
grep -v "^#" nginx.conf
-v是反向匹配,也就是“不包含”。-i是忽略大小写。-E是扩展正则,比如要匹配多个关键词就用grep -E "error|fatal"。实际排查线上问题时,我经常先grep出一个时间范围的日志,再用awk提取字段统计,这两兄弟经常配合使用。
4.2 awk:按列提取,做统计报表
awk的定位是按列(字段)处理文本。默认用空格或Tab分隔列,$1代表第一列,$2代表第二列,$0代表整行。举两个高频场景。
第一个,提取nginx日志中的IP并去重统计访问次数:
bash复制awk '{print $1}' access.log | sort | uniq -c | sort -rn
这条命令先用awk把第一列IP打出来,sort排序,uniq -c统计重复次数,再次sort -rn按次数从大到小排列。这条组合命令在排查CC攻击、统计来源IP时几乎是标配。
第二个,提取指定时间段的内容:
bash复制awk '/2024-05-20 10:00/,/2024-05-20 10:30/' app.log
这里用到了awk的区间匹配,从第一个匹配点打印到第二个匹配点。比在几百兆日志里翻页效率高太多了。
4.3 sed:增删改换,批量处理不手软
sed是流编辑器,最核心的场景是替换。比如把配置文件里的旧域名全部换成新域名:
bash复制sed -i 's/old.example.com/new.example.com/g' nginx.conf
s/旧内容/新内容/g就是全局替换,-i表示直接修改文件(不加-i只是把替换结果输出到屏幕,文件不变)。还有一个常用操作是删除行,比如sed -i '/^#/d' nginx.conf是删除所有以#开头的注释行。注意sed的替换逻辑是“正则匹配 + 替换”,基础写法很简单,但涉及特殊字符时,比如域名里有斜杠或点,需要用小技巧。点号在正则里是通配符,要匹配字面意义上的点,需要写成\.。
所以真正替换域名时,我会写成:
bash复制sed -i 's/old\.example\.com/new\.example\.com/g' nginx.conf
不加转义的话,old.example.com也能匹配成功,因为点号能匹配任意字符,但有可能误伤其他行,所以在生产环境改配置前,先不要加-i,跑一遍看输出结果,确认无误后再真正落盘。
4.4 vim只用三分钟就能上手
热词里有“vim命令”,这个编辑器劝退了大量新手。我对vim的建议很务实:不用学那些花哨操作,先把最核心的几下练熟。打开文件是vim 文件名,刚进去是普通模式,此时按i进入插入模式才能打字,写完按Esc回到普通模式,输入:wq保存并退出,输入:q!不保存强制退出。
再补充几个用得极多的:在普通模式下按dd删除当前行,按yy复制当前行,按p粘贴,按/加关键词回车后文件内搜索,按n跳到下一个匹配项,输入:set nu显示行号。这些足够了。真正要提升效率,可以把鼠标操作忘掉,全程用键盘。如果你觉得vim太难,用nano也可以,简单的文本编辑完全够用,但生产环境的主流编辑器依然是vim,面试也常问。
5. 系统与网络管理:看状态、查资源、测连通
5.1 系统状态一眼看清:top、free、df、du
服务器卡了、内存不够了、磁盘满了,这些问题都靠这几个命令来诊断。
top是实时查看系统负载和进程占用率,第一行有系统运行时间、登录用户数和负载均值,load average后面三个数字分别代表1分钟、5分钟、15分钟的平均负载。如果三个数字都超过CPU核心数,说明系统繁忙。在top界面里按P按CPU排序,按M按内存排序,按q退出。更直观一点可以用top -o %MEM,直接按内存占用排列。
free -h看内存使用,free -h会把输出变成人类可读单位。重点关注available这一列,这才是系统实际可用的内存。很多新手看到used很高就急着加内存,其实Linux会尽量把空闲内存用做文件缓存(buff/cache),这部分在应用需要时是可以释放的,所以看available更准确。
df -h看磁盘分区使用率,du -sh *看当前目录下每个文件和文件夹的占用大小。磁盘满是最常见的线上事故原因,我处理过多次“服务突然写不进日志”的故障,一查全是df -h显示/dev/vda1 100%了。这时候用du -sh /data/* | sort -rh | head快速找出占用最大的目录,定位到具体文件后清理。
5.2 进程与服务管理:ps、systemctl、kill的配合
查看进程最常用的是ps -ef,它显示所有进程的完整信息。要和关键词过滤时配合grep:
bash复制ps -ef | grep nginx
但这个写法有个坑:grep自己也会出现在结果里,因为grep nginx这条命令行里包含“nginx”字样。解决办法是用grep -v grep排除,或者用更精确的pgrep -l nginx。
管理服务用systemctl,CentOS 7以后基本都是它了。systemctl start nginx启动,systemctl stop nginx停止,systemctl restart nginx重启,systemctl status nginx查看状态,systemctl enable nginx设置开机自启。修改完配置文件后的标准流程是:先nginx -t测试配置是否合法,再用systemctl restart nginx重启生效。别改完配置直接重启,配置有语法错误会导致服务起不来,线上事故往往就是这么来的。
杀掉进程用kill,kill 进程ID发送默认的TERM信号,让进程正常退出;kill -9 进程ID强制杀掉。能先用kill就用kill,-9属于核弹级别,可能造成文件损坏或数据丢失。
5.3 网络排查三板斧:ping、telnet、nslookup
热词里“telnet命令怎么用”“nslookup命令结果详解”都在问网络排查,这里系统讲一下。网络不通时,我的排查顺序是从底层到上层。
第一步ping测链路通不通。ping 192.168.1.1能通,说明网络层没问题;ping www.example.com能通,说明DNS解析也没问题。注意ping的通与不通受防火墙策略影响,如果对方禁了ICMP协议,ping不通不代表服务不通,所以还需要下一步。
第二步telnet IP 端口测端口通不通。比如要确认服务器上的80端口是否对公网开放:
bash复制telnet 192.168.1.10 80
如果屏幕显示Connected to 192.168.1.10之类的字样,说明端口可达;如果卡住或提示Connection refused,说明端口不通或服务没起。这个命令在排查“网站打不开,到底是服务器挂了还是防火墙挡了”时非常关键。注意,telnet在最小化安装的系统里可能没装,CentOS可以执行yum install -y telnet,Ubuntu执行apt install -y telnet。
第三步nslookup查DNS解析。直接输入nslookup www.example.com,结果里Server是当前使用的DNS服务器,Address是它的IP,Non-authoritative answer下面的Address就是域名解析出来的IP。如果返回can't find,说明域名解析失败,要检查/etc/resolv.conf里的DNS配置。一条有用的技巧是,临时切换DNS验证问题是否出在解析上,可以直接nslookup www.example.com 8.8.8.8,指定用指定DNS服务器来解析。
5.4 查看端口和连接:ss和netstat
查看端口监听状态可以用ss -lntp,这是netstat的升级替代品,输出更清晰,速度更快。-l表示只看监听的端口,-n不反解域名,-t只看TCP,-p显示进程信息。如何知道某个端口被谁占用?执行:
bash复制ss -lntp | grep 8080
结果里的users:(("java",pid=12345,fd=68))就告诉你占用这个端口的是java进程,进程ID是12345。这是排查端口冲突、服务启动失败的经典命令。
6. 常用命令组合与排查案例:把命令串起来解决问题
6.1 一条管道命令处理真实问题:日志统计
单条命令不值钱,值钱的是组合能力。这里分享一个我处理线上故障时经常用的组合。某天业务反馈接口变慢,我想看最近一小时nginx的错误日志集中在什么接口上:
bash复制grep "$(date +%d/%b/%Y:%H:%M)" /var/log/nginx/error.log | awk '{print $7}' | sort | uniq -c | sort -rn | head
这条命令的解析:date +%d/%b/%Y:%H:%M动态生成当前时间格式,grep匹配最近一分钟的日志,awk '{print $7}'提取URL路径,sort排序,uniq -c统计次数,再次按次数排序并取前十。整个过程中命令一个接一个地干活,最后输出的就是“访问最多的慢接口排名”。这就是Linux管道思想的精髓:每个命令只做一件事,通过管道把结果传给下一个命令。
6.2 查看Java进程并杀掉
还有一个高频场景是部署Java应用时,需要找到旧进程并杀掉。我之前经常这样操作:
bash复制ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9
ps -ef | grep java找出Java进程,grep -v grep排除grep自身,awk '{print $2}'提取进程ID,xargs kill -9把每个ID作为参数传给kill命令。不过这么粗暴的写法有误杀风险。安全一点的做法是先用ps -ef | grep java确认进程ID,再单独kill -9 具体ID。如果嫌中间步骤多,还可以用pkill -f "java -jar myapp.jar"按命令行关键字杀掉。
6.3 压缩解压与批量处理
热词里有“zip命令”和“shell的shift命令”,这里先补充压缩解压。打包压缩用tar,最常见的写法是:
bash复制tar -czvf app.tar.gz /data/app/
-c创建归档,-z用gzip压缩,-v显示过程,-f指定文件名。解压用:
bash复制tar -xzvf app.tar.gz -C /data/
-x解压,-C指定解压目录。zip命令主要用于和Windows环境交换文件,压缩用zip -r app.zip /data/app,解压用unzip app.zip。如果系统没装zip,CentOS执行yum install -y unzip zip。
6.4 查看系统版本和硬件信息
排查问题时经常要看系统版本。CentOS/RHEL系列执行cat /etc/redhat-release,Ubuntu执行lsb_release -a,通用的看内核用uname -a。查看CPU信息用lscpu,查看内存插槽和频率用dmidecode -t memory(需要root权限)。
7. 常见报错与排查实录:这些坑你可能也会遇到
7.1 command not found的三种可能
输入命令提示command not found,先别慌,对照下面三条排查。第一,命令真的没安装,比如telnet、zip、lsof在最小化安装时都没有,用对应包管理器装上就行。第二,命令存在但不在当前用户的PATH中,比如某些软件装在/usr/local/mysql/bin下但没有加到PATH,可以用绝对路径执行,或把路径加到/etc/profile。第三,你敲错了命令名,比如把systemctl拼成systemclt,这种属于手误,看一眼提示就明白了。
7.2 Permission denied的常见套路
看到这个报错,八成是权限问题。文件没有读或执行权限,用chmod调整;目录没有写权限,用chown调整所有者,或者临时用sudo。还有一种情况是文件系统以只读方式挂载了,执行mount -o remount,rw /data重新挂载为可读写(需要在停服务的前提下谨慎操作)。另外SELinux也会导致“有权限却访问不了”的诡异现象,CentOS上如果排除了普通权限问题还是报错,可以执行getenforce查看SELinux状态,如果是Enforcing,临时用setenforce 0关闭测试一下。
7.3 环境变量在当前终端不生效
修改了/etc/profile或者~/.bashrc后,当前终端还要执行source /etc/profile或source ~/.bashrc才能立即生效。关闭并重新打开终端也可以。很多人改了配置发现没生效,就是因为没重新加载。
7.4 运行jar包或脚本后一关终端服务就死
这是新手问得最多的一个问题。直接执行java -jar app.jar时,关掉SSH窗口进程就没了。解决办法是用nohup和&:
bash复制nohup java -jar app.jar > app.log 2>&1 &
nohup让进程忽略挂断信号,&让命令在后台运行,> app.log 2>&1把标准输出和错误输出重定向到日志文件。进程不会因为终端关闭而退出。查看后台进程用jobs -l,但如果是新开的SSH窗口,jobs看不到,需要用ps -ef | grep java查找。
7.5 rm删错了怎么办
删错文件后,先说结论:第一时间停掉对所在分区的一切写入操作,然后立刻用文件恢复工具尝试,比如extundelete或testdisk。但恢复成功率很低,尤其没有即时发现、分区又被大量写入的情况下基本没戏。所以我的核心建议永远是“预防为主”:重要文件定期备份,操作前先ls确认,能用mv就不用rm。这些习惯比任何恢复工具都可靠。
8. 从会用到熟练:我的Linux命令学习路线建议
8.1 第一个月:把高频命令练到条件反射
我不建议靠“命令大全”入门。第一个月就集中火力练这十几条:ls、cd、cp、mv、rm、mkdir、find、grep、awk、sed、cat、tail、less、vim、ps、netstat/ss。你可以给自己制造真实的场景,比如去/var/log下翻日志,用grep找关键词,用awk统计;在/tmp下建目录、复制文件、删除文件,把操作练成肌肉记忆。
8.2 第二个月:开始理解系统和服务
这个阶段可以去装一台虚拟机或买一台便宜的云服务器,从零开始部署一个完整环境。比如装Nginx,配置虚拟主机,写一个最简单的Shell脚本定时备份目录。这个过程会用到systemctl、chmod、chown、tar、crontab,所有命令都不再是孤立的,而是为了完成“部署一个网站”这个目标串联起来的。一旦你经历过这个完整流程,对命令的理解会突飞猛进。
8.3 第三个月:挑战面试高频题和应用扩展
热词里有“linux面试题”,面试官最爱问的其实就那么几类:如何查看服务器负载?top怎么用?如何查找大文件?find / -size +100M。如何查看端口占用?ss -lntp。如何把一个用户加到sudo组?usermod -aG wheel 用户名。如何查看系统版本?cat /etc/redhat-release。你能把这个阶段的问题都答上来,说明基本已经脱离新手村了。
再往后,可以试着去了解strace、perf这类调试工具,或者写一些Shell脚本来处理重复性工作。但无论学多深,最核心的还是“命令是死的,场景是活的”,遇到问题多去分析,比多背一百条命令有用得多。
最后分享一个我个人的小习惯:每学一条命令,不只是敲一遍,而是想清楚这三个问题——它能解决什么问题?它和类似命令的区别是什么?我最近的哪个场景用得上它?想清楚了,这条命令才真正是你的。
