前言 Linux 作为服务器端的主流操作系统,是每位开发者必备的技能。无论你从事前端、后端还是运维工作,都不可避免地要和 Linux 命令行打交道。本文以常用命令 + 实战场景 的方式,帮你快速上手。
为什么要学命令行?
🖥️ 生产服务器通常没有图形界面 ,只能通过终端操作
⚡ 命令行操作比图形界面更高效
🤖 便于编写脚本实现自动化
📦 很多开发工具(Git、Docker、Node.js 等)天然适合命令行使用
一、基础概念 Shell 是什么? Shell 是用户与 Linux 内核之间的命令解释器 。你输入命令 → Shell 翻译 → 内核执行。
常见的 Shell:
bash (最常用,本文默认)
zsh (功能更丰富,macOS 默认)
sh (最基础的 Shell)
命令基本格式
示例:
1 2 ls -l /home tar -xzvf file.tar.gz
二、文件与目录管理(最常用)⭐ 2.1 pwd — 显示当前目录
场景 :你进了一个很深的目录,想知道自己到底在哪。
2.2 ls — 列出目录内容 1 2 3 4 5 6 7 8 ls ls /var/log ls -l ls -a ls -lh ls -lt ls -ltr ls -S
场景:查看最近修改的日志文件
1 ls -lt /var/log | head -10
输出示例:
1 2 3 -rw-r--r-- 1 root root 12K May 30 15:30 syslog -rw-r--r-- 1 root root 8.5K May 30 15:30 auth.log -rw-r--r-- 1 root root 3.2K May 30 14:00 nginx/access.log
ls -l 输出解读:
1 2 3 4 5 6 7 8 9 10 11 12 -rw-r--r-- 1 zhangsan staff 2048 May 30 14:00 doc.txt │└┬┘└┬┘└┬┘ │ └──┬──┘ └─┬─┘ └─┬──┘ └──┬──┘ └──┬──┘ │ │ │ │ │ │ │ │ │ └─ 文件名 │ │ │ │ │ │ │ │ └─ 修改时间 │ │ │ │ │ │ │ └─ 文件大小(字节) │ │ │ │ │ │ └─ 所属组 │ │ │ │ │ └─ 所属用户 │ │ │ │ └─ 硬链接数 │ │ │ └─ 其他用户权限(r=读 w=写 x=执行) │ │ └─ 组用户权限 │ └─ 所有者权限 └─ 文件类型(-=文件 d=目录 l=链接)
2.3 cd — 切换目录 1 2 3 4 5 cd /home/zhangsan cd .. cd ../.. cd ~ cd -
场景 :你从 /var/log/nginx 切换到 /etc/nginx 修改配置,然后想快速回去看日志:
1 2 3 4 cd /var/log/nginx cd /etc/nginx cd -
2.4 mkdir — 创建目录 1 2 3 mkdir myproject mkdir -p a/b/c/d mkdir -p project/{src,dist,docs,test }
场景:快速搭建项目目录结构
1 2 mkdir -p my-web-app/{src/{components,utils,styles,assets},public,tests,docs}tree my-web-app
1 2 3 4 5 6 7 8 9 my-web-app/ ├── docs/ ├── public/ ├── src/ │ ├── assets/ │ ├── components/ │ ├── styles/ │ └── utils/ └── tests/
2.5 touch — 创建空文件 / 更新文件时间戳 1 2 3 touch README.md touch file1.txt file2.txt touch -t 202605301500 file.txt
2.6 cp — 复制文件或目录 1 2 3 4 5 6 cp source.txt dest.txt cp file1.txt file2.txt dir / cp -r dir1/ dir2/ cp -i source.txt dest.txt cp -p source.txt dest.txt cp -a dir1/ dir2/
场景:备份配置文件
1 2 cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%Y%m%d)
2.7 mv — 移动 / 重命名 1 2 3 4 mv old_name.txt new_name.txt mv file.txt /target/dir/ mv dir1/ dir2/ mv -i source.txt dest.txt
场景:批量重命名图片
1 2 3 4 for i in {1..10}; do mv "photo_$i .jpg" "img_$i .jpg" done
2.8 rm — 删除文件或目录(慎用!) 1 2 3 4 5 rm file.txt rm -i file.txt rm -f file.txt rm -r directory/ rm -rf directory/
🚫 千万不要执行 rm -rf / ——这会让系统彻底崩溃!
安全删除的好习惯:
1 2 3 4 5 6 mkdir -p ~/.trashmv file_to_delete.txt ~/.trash/rm -rf ~/.trash/*
2.9 查看文件内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 cat file.txtcat -n file.txt cat file1.txt file2.txt less /var/log/syslog head -20 /var/log/syslog tail -20 /var/log/syslog tail -f /var/log/syslog more file.txt
场景:实时监控应用日志
1 2 3 4 5 6 7 8 tail -f /var/log/nginx/access.logtail -f /var/log/nginx/error.log | grep "ERROR" tail -f /var/log/nginx/access.log /var/log/nginx/error.log
三、文件查找与搜索 3.1 find — 按条件查找文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 find /home -name "*.log" find /projects -name "*.js" find . -iname "README*" find . -type f -name "*.txt" find . -type d -name "node_modules" find /var/log -type f -size +100M find . -type f -size -1k find . -type f -mtime -7 find . -type f -mtime +30 find . -type f -mmin -60 find . -type f -name "*.log" -size +10M find . -type f -name "*.tmp" -delete find . -type f -name "*.txt" -exec ls -lh {} \;
场景:清理 30 天前的旧日志
1 find /var/log/myapp -type f -name "*.log" -mtime +30 -delete
场景:查找并删除所有 node_modules 目录
1 find /projects -type d -name "node_modules" -prune -exec rm -rf {} \;
3.2 grep — 文本内容搜索 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 grep "error" app.log grep -i "error" app.log grep -v "DEBUG" app.log grep -n "error" app.log grep -c "error" app.log grep -r "TODO" ./src/ grep -rl "CONFIG" ./ --include="*.js" grep -E "ERROR|FATAL" app.log grep -E "^2026-05-30" app.log grep -oE "status=\d+" app.log grep -A 3 "error" app.log grep -B 3 "error" app.log grep -C 3 "error" app.log
场景:排查 Nginx 错误日志
1 2 3 4 5 grep -C 5 "500" /var/log/nginx/access.log grep -oE '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' /var/log/nginx/access.log | sort | uniq -c | sort -rn
场景:在项目中搜索 TODO 注释
1 grep -rn "TODO\|FIXME\|HACK" ./src/ --include="*.js" --include="*.ts"
3.3 which / whereis — 查找命令位置 1 2 3 4 5 6 which node which python3whereis nginx
四、用户与权限管理 4.1 chmod — 修改文件权限 权限用数字表示:r=4, w=2, x=1
1 2 3 4 5 6 7 8 9 10 chmod 755 script.sh chmod 644 file.txt chmod 600 secret.key chmod 777 public/ chmod u+x script.sh chmod g-w file.txt chmod a+r file.txt chmod -R 755 project/
常见权限速查:
权限
数字
适用场景
755
目录
所有者可写,其他人可读可进入
644
文件
所有者可写,其他人只读
600
私密文件
只有所有者可读写(如 SSH 密钥)
700
脚本/程序
只有所有者可读写执行
4.2 chown — 修改文件所有者 1 2 3 chown zhangsan file.txt chown zhangsan:staff file.txt chown -R zhangsan:staff /var/www/
4.3 sudo — 以超级用户权限执行 1 2 3 4 sudo apt update sudo -u postgres createdb mydb sudo !! sudo -i
4.4 whoami / id / groups — 查看用户信息
五、进程管理 5.1 ps — 查看进程 1 2 3 ps aux ps -ef ps aux | grep nginx
ps aux 输出解读:
1 2 3 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 225712 9184 ? Ss 08:00 0:02 /sbin/init nginx 12345 0.0 0.3 445328 28600 ? S 08:01 0:01 nginx: worker process
列
含义
USER
进程所属用户
PID
进程 ID
%CPU
CPU 占用百分比
%MEM
内存占用百分比
VSZ
虚拟内存大小(KB)
RSS
物理内存大小(KB)
STAT
进程状态(S=睡眠 R=运行 Z=僵尸)
TIME
累计 CPU 时间
5.2 top / htop — 动态查看进程 1 2 3 top top -u zhangsan htop
场景:找出吃 CPU 最多的进程
1 ps aux --sort =-%cpu | head -5
5.3 kill — 终止进程 1 2 3 4 5 6 7 kill 12345 kill -9 12345 kill -15 12345 pkill nginx pkill -f "python app.py" killall node
常用信号:
信号编号
名称
作用
1
SIGHUP
重新加载配置
9
SIGKILL
强制杀死(不可捕获)
15
SIGTERM
优雅终止(默认)
场景:Nginx 平滑重启
1 2 3 4 kill -HUP $(cat /var/run/nginx.pid)nginx -s reload
5.4 后台运行与任务管理 1 2 3 4 5 6 7 8 9 10 11 12 13 node app.js & nohup node app.js & nohup node app.js > app.log 2>&1 & jobs Ctrl + Z bg fg bg %1
场景:在服务器上运行长期任务
1 2 3 4 5 nohup python3 train_model.py > training.log 2>&1 &tail -f training.log
5.5 lsof — 查看进程打开的文件 1 2 3 4 lsof -i :3000 lsof -p 12345 lsof /var/log/syslog lsof -u zhangsan
场景:端口被占用,找出是谁
1 2 3 4 5 6 7 lsof -i :8080 kill 12345
六、磁盘与空间管理 6.1 df — 查看磁盘使用情况 1 2 3 df -h df -h /home df -i
输出示例:
1 2 3 Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 20G 28G 42% / /dev/sdb1 200G 80G 110G 43% /data
6.2 du — 查看目录大小 1 2 3 4 du -sh * du -sh /var/log du -h --max-depth=1 /home du -sh * | sort -rh | head
场景:磁盘满了,找出占空间的大户
1 2 3 4 5 6 7 8 9 10 11 df -hdu -sh /* 2>/dev/null | sort -rh | head -10du -h --max-depth=1 /var | sort -rh | head -10find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
6.3 free — 查看内存使用情况
输出示例:
1 2 3 total used free shared buff/cache available Mem: 7.7G 2.3G 3.1G 200M 2.3G 5.0G Swap: 2.0G 100M 1.9G
七、网络相关 7.1 curl — 发送 HTTP 请求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 curl https://api.example.com/users curl -I https://www.baidu.com curl -X POST https://api.example.com/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"123456"}' curl -H "Authorization: Bearer token123" \ https://api.example.com/profile curl -O https://example.com/file.tar.gz curl -o myfile.tar.gz https://example.com/file.tar.gz curl -L https://example.com curl -w "\ntime_total: %{time_total}s\n" -o /dev/null -s https://example.com
场景:测试 API 接口
1 2 3 4 5 6 7 8 curl -s -o /dev/null -w "%{http_code}" https://blog.iot2045.cn curl -X POST http://localhost:3000/api/articles \ -H "Content-Type: application/json" \ -d '{"title":"测试文章","content":"这是内容"}'
7.2 wget — 下载文件 1 2 3 wget https://example.com/file.tar.gz wget -c https://example.com/large.zip wget -r -l 2 https://example.com/docs/
7.3 netstat / ss — 查看网络连接 1 2 3 4 5 6 7 8 netstat -tlnp netstat -an netstat -anp | grep :80 ss -tlnp ss -an
场景:确认服务是否启动并监听
1 2 3 4 ss -tlnp | grep nginx
7.4 ping — 测试网络连通性 1 2 ping -c 4 blog.iot2045.cn ping -i 2 google.com
7.5 scp — 远程拷贝 1 2 3 4 5 6 7 8 9 10 11 scp local_file.txt zhangsan@192.168.1.100:/home/zhangsan/ scp zhangsan@192.168.1.100:/var/log/app.log ./ scp -r myproject/ zhangsan@192.168.1.100:/home/zhangsan/ scp -P 2222 file.txt zhangsan@192.168.1.100:~/
7.6 ssh — 远程登录 1 2 3 ssh zhangsan@192.168.1.100 ssh -p 2222 zhangsan@192.168.1.100 ssh -i ~/.ssh/my_key zhangsan@server
SSH 免密登录配置:
1 2 3 4 5 6 7 8 ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ssh-copy-id zhangsan@192.168.1.100 ssh zhangsan@192.168.1.100
八、打包与压缩 8.1 tar — 归档(最常用) 1 2 3 4 5 6 7 8 9 10 11 12 13 tar -czvf archive.tar.gz /path/to/dir/ tar -cjvf archive.tar.bz2 /path/to/dir/ tar -cJvf archive.tar.xz /path/to/dir/ tar -xzvf archive.tar.gz tar -xjvf archive.tar.bz2 tar -xJvf archive.tar.xz tar -xvf archive.tar -C /target/dir/ tar -tzvf archive.tar.gz
参数速记:
参数
含义
c
创建(create)
x
解压(extract)
z
gzip 压缩/解压
j
bzip2 压缩/解压
v
显示过程(verbose)
f
指定文件名(file)
C
解压到指定目录
8.2 zip / unzip 1 2 3 4 zip -r archive.zip directory/ unzip archive.zip unzip -l archive.zip unzip archive.zip -d /target/dir/
九、文本处理(管道组合) Linux 的强大之处在于可以通过管道(|)将多个命令组合在一起。
9.1 管道符 | — 命令串联 1 2 command1 | command2 | command3
9.2 sort — 排序 1 2 3 4 5 sort file.txt sort -n file.txt sort -r file.txt sort -t ',' -k 2 file.csv sort -u file.txt
9.3 uniq — 去重 1 2 3 4 uniq file.txt sort file.txt | uniq sort file.txt | uniq -c sort file.txt | uniq -d
9.4 wc — 统计 1 2 3 wc -l file.txt wc -c file.txt wc -w file.txt
9.5 awk — 文本分析工具 1 2 3 4 5 6 7 8 9 10 11 awk '{print $1, $3}' data.txt awk -F ':' '{print $1, $7}' /etc/passwd awk '$3 > 1000' data.txt awk '{sum += $1} END {print sum}' numbers.txt
9.6 sed — 流编辑器 1 2 3 4 5 6 7 8 9 10 11 12 sed 's/old/new/' file.txt sed 's/old/new/g' file.txt sed -i 's/old/new/g' file.txt sed -i.bak 's/old/new/g' file.txt sed '/pattern/d' file.txt sed '2,5d' file.txt sed -n '10,20p' file.txt
9.7 实战组合:日志分析 场景 1:找出访问量 Top 10 的 IP
1 2 3 4 5 6 cat /var/log/nginx/access.log \ | awk '{print $1}' \ | sort \ | uniq -c \ | sort -rn \ | head -10
输出示例:
1 2 3 4 1523 192.168.1.100 892 10.0.0.55 456 172.16.0.88 ...
场景 2:统计 API 接口响应时间分布
1 2 3 4 5 6 7 8 9 10 11 12 13 cat /var/log/nginx/access.log \ | awk '{print $NF}' \ | sort -n \ | awk '{ if ($1 < 0.1) fast++ else if ($1 < 1.0) normal++ else slow++ } END { print "快速(<0.1s):", fast print "正常(0.1-1s):", normal print "慢(>1s):", slow }'
场景 3:查找一段日志
1 2 3 4 5 sed -n '/14:00/,/15:00/p' /var/log/syslog sed -n '/14:00/,/15:00/p' /var/log/syslog | grep -i "error"
十、软件包管理 Debian/Ubuntu 系(apt) 1 2 3 4 5 6 7 8 sudo apt update sudo apt upgrade sudo apt install nginx sudo apt remove nginx sudo apt purge nginx apt search keyword apt show nginx sudo apt autoremove
CentOS/RHEL 系(yum / dnf) 1 2 3 4 sudo yum install nginx sudo yum update nginx sudo yum remove nginx yum search keyword
十一、系统信息查看 1 2 3 4 5 6 7 8 9 10 uname -a lsb_release -a cat /etc/os-release uptime hostname cat /proc/cpuinfo cat /proc/meminfo lscpu lsblk dmesg | tail -20
十二、Shell 重定向与快捷键 12.1 输出重定向 1 2 3 4 5 6 7 8 9 10 11 12 13 14 command > file.txt command >> file.txt command 2> error.log command 2>> error.log command > all.log 2>&1 command &> all.log command > /dev/null 2>&1
12.2 终端快捷键
快捷键
作用
Ctrl + C
终止当前命令
Ctrl + D
退出终端 / EOF
Ctrl + Z
挂起当前任务
Ctrl + L
清屏(等同 clear)
Ctrl + A
光标移动到行首
Ctrl + E
光标移动到行尾
Ctrl + U
删除光标前的内容
Ctrl + K
删除光标后的内容
Ctrl + W
删除前一个单词
Ctrl + R
搜索历史命令(强烈推荐!)
Tab
自动补全
↑ / ↓
浏览历史命令
!!
重复上一条命令
十三、实用 Shell 技巧 13.1 命令历史 1 2 3 4 5 history history \| grep "ssh" !123 !! !$
场景示例:
1 2 mkdir -p /var/www/my-long-project-namecd !$
13.2 别名设置 1 2 3 4 5 6 7 8 9 10 11 12 13 alias alias ll='ls -alF' alias la='ls -A' alias ..='cd ..' alias ...='cd ../..' echo "alias ll='ls -alF'" >> ~/.bashrcecho "alias gst='git status'" >> ~/.bashrcsource ~/.bashrc
13.3 环境变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 env printenv echo $HOME echo $PATH export MY_VAR="hello" export PATH=$PATH :/usr/local/myapp/binecho 'export NODE_ENV=production' >> ~/.bashrc
13.4 一行命令完成常见任务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 find . -name "*.js" -not -path "*/node_modules/*" | xargs wc -l | tail -1 touch test_{1..100}.txtcp important.conf{,.bak.$(date +%Y%m%d)}python3 -m http.server 8000 grep -rl 'old_domain.com' ./ --include="*.md" | xargs sed -i 's/old_domain.com/new_domain.com/g' time npm run buildwatch -n 1 'ps aux | grep nginx' watch -n 2 'df -h'
十四、常见场景完全指南 场景 A:部署一个 Node.js 应用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ssh user@your-server-ip sudo apt update && sudo apt upgrade -ycurl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install -y nodejsnode --version && npm --version sudo mkdir -p /var/www/myappsudo chown -R $USER :$USER /var/www/myappcd /var/www/myappgit clone https://github.com/your-repo.git . npm install npm run build sudo npm install -g pm2pm2 start dist/main.js --name myapp pm2 save pm2 startup sudo apt install -y nginxsudo vim /etc/nginx/sites-available/myapp
Nginx 配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 server { listen 80 ; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1 .1 ; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection 'upgrade' ; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_cache_bypass $http_upgrade ; } }
1 2 3 4 sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/sudo nginx -t sudo systemctl restart nginx
场景 B:定时备份数据库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 cat > ~/backup-mysql.sh << 'EOF' BACKUP_DIR="/backup/mysql" DB_USER="root" DB_PASS="your_password" DB_NAME="my_blog" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p "$BACKUP_DIR " mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > "$BACKUP_DIR /${DB_NAME} _${DATE} .sql.gz" find "$BACKUP_DIR " -type f -name "*.sql.gz" -mtime +7 -delete echo "Backup completed: ${DB_NAME} _${DATE} .sql.gz" EOF chmod +x ~/backup-mysql.shcrontab -e
场景 C:排查服务故障 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 sudo systemctl status nginxps aux | grep nginx ss -tlnp | grep :80 sudo tail -100 /var/log/nginx/error.logfree -h df -h top -bn1 | head curl -I http://localhost:80 sudo systemctl restart nginx
常用命令速查表
分类
命令
说明
目录
pwd
显示当前路径
目录
ls -lah
显示详细文件列表
目录
cd ~
回到主目录
目录
mkdir -p a/b/c
递归创建目录
文件
touch file
创建空文件
文件
cp -r src dst
递归复制
文件
mv old new
移动/重命名
文件
rm -rf dir
强制删除(慎用!)
查看
cat file
查看文件
查看
less file
分页查看
查看
tail -f file
实时追踪文件
查找
find . -name "*.js"
按名称查找
查找
grep -r "text" .
递归搜索文本
权限
chmod 755 file
修改权限
权限
chown user file
修改所有者
进程
ps aux | grep name
查找进程
进程
kill -9 PID
强制终止进程
进程
top
系统监控
磁盘
df -h
磁盘空间
磁盘
du -sh dir/
目录大小
网络
curl -I url
HTTP 请求头
网络
ss -tlnp
监听端口
网络
scp file user@host:
远程拷贝
压缩
tar -czvf a.tar.gz d/
打包压缩
压缩
tar -xzvf a.tar.gz
解压
文本
sort | uniq -c
排序去重统计
文本
sed 's/a/b/g'
文本替换
文本
awk '{print $1}'
提取列
系统
uname -a
系统信息
系统
uptime
运行时间/负载
系统
free -h
内存信息
进一步学习建议
动手实践 :在虚拟机或 WSL 中安装 Linux,每天用命令行操作
学习 Shell 脚本 :自动化重复任务,推荐《鸟哥的 Linux 私房菜》
掌握 Vim :Linux 下的必备编辑器,至少学会基本操作
了解 systemd :现代 Linux 的服务管理方式(systemctl 系列命令)
熟悉正则表达式 :配合 grep、sed、awk 发挥强大威力
结语 本文涵盖了 Linux 开发中最常用的命令和实战场景。对于初学者,建议不要试图一次记住所有命令 ,而是在日常使用中逐步积累:
遇到一个场景 → 查对应命令 → 多敲几遍 → 自然记住
善用 man command 查看命令手册
善用 command --help 查看简要帮助
善用 Ctrl + R 搜索历史命令
记住:命令行不可怕,可怕的是不敢动手试 。打开终端,开始你的 Linux 之旅吧!🐧