03
常用命令大全:二十条命令闯天下
Command Line Handbook
别被"几千条命令"吓住。日常真正高频的也就三四十条,把下面这几大类练熟,你在服务器上就基本不慌了。每条都给:语法 → 常用选项 → 真实例子 → 输出。看不懂选项表没关系,先混眼熟,用的时候回来查。
一、文件操作:增删改查搬位置
这是每天都要按几百次的"手脚命令"。记住三个反人类点:移动是 mv、复制是 cp、删除是 rm,没有回收站。
文件/目录基本功
# 看:-l 详细信息,-h 人类可读大小,-a 含隐藏文件
ls -lh
ls -la
# 进目录 / 我在哪 / 建目录(-p 连父目录一起建)
cd /var/log
pwd
mkdir -p project/src/utils
# 建空文件 / 删空目录 / 复制 / 移动改名
touch note.txt
rmdir emptydir
cp note.txt note_backup.txt # 复制文件
cp -r src/ src_backup/ # 复制目录必须加 -r
mv note.txt todo.txt # 移动 = 改名
mv todo.txt ~/Documents/ # 挪到别的目录
# 删:-r 递归删目录,-f 不问直接删(核武器,想清楚再按回车)
rm note_backup.txt
rm -r old_project/
# 看真身 / 看详细信息
file mystery.bin
stat report.txt
$ ls -lh
total 12K
-rw-r--r-- 1 jianma jianma 2.0K Sep 16 10:00 note.txt
drwxr-xr-x 2 jianma jianma 4.0K Sep 16 10:01 project
$ file mystery.bin
mystery.bin: PNG image data, 800 x 600
$ stat note.txt
File: note.txt
Size: 2048 Access: (0644/-rw-r--r--)
链ln:软链接 vs 硬链接,一句话分清
软链接(ln -s)= Windows 的快捷方式:一个小文件指向原文件路径。原文件删了,链接就断。可以跨磁盘、可以链目录。ln -s /opt/app/bin/app /usr/local/bin/app 把软件挂进 PATH。
硬链接(ln,不加 -s)= 文件的第二个名字:两个文件名指向同一个 inode,删了任何一个,数据还在另一个名下。不能跨分区、不能链目录,日常用得少,了解即可。
链接实战
ln -s /opt/nginx/conf/nginx.conf ~/nginx.conf.link # 软链
ln report.txt report_hard.txt # 硬链
ls -li report.txt report_hard.txt
$ ls -li report.txt report_hard.txt
132187 -rw-r--r-- 2 jianma jianma ... report.txt
132187 -rw-r--r-- 2 jianma jianma ... report_hard.txt
# inode 号一模一样 = 同一个文件的两个名字
二、查看文件:别再用 cat 读大文件了
日志动辄几十万行,cat 一把全刷出来只会让你眼瞎。学会按"看多少"选工具:
| 命令 | 一句话用途 |
cat | 小文件一把梭打印出来。文件大了别用。 |
more / less | 分页看长文件。less 比 more 强(能上下翻、能搜、按 q 退出),是终端里的"阅读器"。 |
head | 看头几行。head -n 20 file。 |
tail | 看尾几行。tail -f /var/log/nginx/access.log 实时跟踪日志新增,排障神器。 |
wc | 数行数/词数/字节数。wc -l file 数行数最常用。 |
sort / uniq | 排序 / 去重。uniq 只去相邻重复,所以经典组合是 sort | uniq -c 统计次数。 |
查看与统计实战
tail -n 50 /var/log/syslog # 看最后 50 行
tail -f /var/log/nginx/access.log # 实时跟踪,Ctrl+C 退出
wc -l access.log # 这个日志多少行?
sort access.log | uniq -c | sort -rn | head # 最常出现的 10 条记录
$ wc -l access.log
18423 access.log
$ tail -n 2 /var/log/syslog
Sep 16 10:01:01 ubuntu CRON[881]: (root) CMD (run-parts)
Sep 16 10:05:01 ubuntu systemd[1]: Started Session 12 of user jianma.
三、文本处理三剑客:grep / sed / awk
这是 Linux 最精华的一套功夫,合称"三剑客"。配合管道 |(把前一个命令的输出,塞给后一个命令当输入),能把任何文本"过滤、修改、抽字段"。
grep 文件里的搜索引擎
grep = Global Regular Expression Print,"在一堆文本里找符合条件的行"。常用选项:-i 忽略大小写、-v 反选(找不包含的)、-n 显示行号、-r 递归搜目录、-c 数匹配行数、-E 开启扩展正则。
grep 五个实用例子
grep "error" /var/log/syslog # 找含 error 的行
grep -rn "password" /etc/ssh/ # 递归找,显示文件名和行号
grep -i "failed" /var/log/auth.log # 忽略大小写
grep -v "^#" /etc/ssh/sshd_config # 去掉所有注释行
ps aux | grep "nginx" # 配合管道:找 nginx 进程
$ grep -n "PermitRootLogin" /etc/ssh/sshd_config
48:PermitRootLogin prohibit-password
sed 流编辑器,像流水线工人
sed 不打开编辑器,而是把文本一行行"流过"流水线,你告诉它怎么改,它改完吐出结果。最常用的是替换:sed 's/旧/新/g',g 表示一行里替换所有(不加只换第一个)。加 -i 直接改原文件(危险,先别加 -i 试运行)。
sed 五个实用例子
echo "2026-09-16" | sed 's/-/\//g' # 把横杠换成斜杠
sed 's/root/admin/' /etc/passwd # 每一行第一个 root 换成 admin
sed -n '10,20p' file.txt # 只打印第 10 到 20 行
sed '/^$/d' file.txt # 删除所有空行
sed '3i\新插进来的一行' file.txt # 在第 3 行前插入一行
$ echo "2026-09-16" | sed 's/-/\//g'
2026/09/16
sed -i 是个狠角色
sed -i 's/old/new/g' file 会原地直接改文件,没有撤销。新手正确姿势:先不加 -i,看屏幕输出对不对,确认无误再补 -i。或者 sed -i.bak '...' file 让它顺手备份一个 file.bak。
awk 文本处理的瑞士军刀
awk 把每一行按"列"切开处理,天生擅长做表格数据。几个内置变量:$0 整行、$1 $2... 第 1、2 列、NF 这行有几列、NR 现在是第几行、FS 分隔符(默认是空格/Tab)。
awk 五个实用例子
awk '{print $1}' access.log # 只取每行第一列(访问者 IP)
awk 'NR>1 {print $1, $4}' data.csv # 跳过表头行,打印第1、4列
awk -F: '{print $1}' /etc/passwd # 按冒号分隔,列出所有用户名
awk '$3 > 100 {print $0}' scores.txt # 条件:第三列大于100的行才打印
awk '{sum+=$1} END {print sum}' nums.txt # 把第一列全部加起来
$ awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -3
5210 203.0.113.5
1873 198.51.100.22
904 192.0.2.87
# 访问最多的 IP 排行
四、权限:rwx 这套数字游戏
Linux 每个文件都有三组权限:属主(u)、属组(g)、其他人(o)。每组三个位:r 读=4、w 写=2、x 执行=1。755、644 这两个数字要刻进脑子。
| 数字 | 权限 | 典型用途 |
| 755 | rwxr-xr-x | 可执行脚本/目录:自己能改能跑,别人只能进来看。 |
| 644 | rw-r--r-- | 普通文件:自己能改,别人只能读。配置文件、网页文件标准。 |
| 600 | rw------- | 私密文件:只有自己能读能改。SSH 私钥、密码文件必须是这个。 |
| 777 | rwxrwxrwx | 所有人全开,新手图省事最爱用,也是安全大忌,除了临时调试别用。 |
改权限 / 改属主
chmod 755 deploy.sh # 数字法:给脚本可执行权限
chmod 644 index.html # 网页文件标准权限
chmod u+x deploy.sh # 符号法:给属主加执行权限
chmod g-w,o-r secret.txt # 组去掉写权限,其他人去掉读权限
chown jianma:jianma report.txt # 改属主和属组(属主:属组)
chown -R jianma:www-data /var/www # -R 递归改整个目录树
chgrp www-data /var/www/html # 只改组
umask # 看新建文件默认权限掩码
$ ls -l deploy.sh
-rwxr-xr-x 1 jianma jianma 1024 Sep 16 deploy.sh
$ umask
0022
# 022 意味着:新建文件默认 644,目录默认 755
位SUID / SGID / Sticky Bit:三个特殊位
SUID(chmod u+s,数字 4xxx):谁运行它,就临时拥有文件属主的权限。经典例子 passwd 命令——你改密码时临时获得 root 权限去写 /etc/shadow。滥用极危险,别随便给脚本加 SUID。
SGID(g+s,2xxx):在目录里新建的文件,自动继承目录的组。团队协作目录常用。
Sticky Bit(o+t,1xxx):目录里的文件只有属主和 root 能删。/tmp 就是它——所有人能写,但不能删别人的文件。
五、进程:谁在占我机器
进程就是"正在跑的程序"。系统出问题、卡、慢,第一步就是看进程:谁在占 CPU、谁在吃内存、怎么杀掉它。
看进程 / 杀进程
ps aux # 看所有进程快照(BSD 风格)
ps -ef # 另一种等价写法(System V 风格)
ps aux | grep nginx # 找某个程序的进程
top # 实时监控面板(按 q 退出)
htop # top 的彩色加强版,更好看(要先装)
pstree # 树状看进程父子关系
kill 12345 # 温和地请 PID=12345 退出
kill -9 12345 # 强行杀掉(核武器,先试普通 kill)
killall nginx # 按名字杀所有 nginx
pkill -f "python app.py" # 按命令行内容杀
$ ps aux | grep nginx
root 881 0.0 0.1 51200 1200 ? Ss Sep15 0:00 nginx: master process
www-data 882 0.0 0.3 52300 3400 ? S Sep15 0:03 nginx: worker process
$ kill 882 # 完事后 ps 一下确认没了
活前台、后台与 nohup
命令 &:命令末尾加 & 扔到后台跑,终端立刻还给你。但一关终端它可能跟着死。
nohup 命令 &:nohup = no hang up(不被挂断),关掉终端程序照样活,输出自动写到 nohup.out。临时跑个长跑脚本时用它。
jobs / bg / fg:Ctrl+Z 把当前程序挂起,bg 扔后台、fg 拉回前台。
nice / renice:调整进程优先级(-20 最高到 19 最低)。nice -n 19 ./大计算 把不重要的任务降权,别让它抢关键业务的 CPU。
六、网络:你的机器怎么上网
后端和服务器的日常一大半是网络:查 IP、测连通、传文件、抓包。记住,ip 命令家族是新时代,ifconfig/netstat 是老古董(还能用,但新文档都在推前者)。
| 命令 | 干什么 |
ip addr | 看所有网卡和 IP 地址(老命令 ifconfig)。 |
ip route | 看路由表,找默认网关(老命令 route)。 |
ping 域名 | 测通不通、延迟多少。Ctrl+C 停。 |
traceroute / tracepath | 看数据包一路上经过了哪些路由器。 |
ss -tulpn | 看本机开了哪些端口、谁在监听(老命令 netstat -tulpn),排障高频。 |
curl / wget | curl 发 HTTP 请求测试接口;wget 直接下载文件。 |
ssh / scp | 远程登录 / 跨机复制文件(第 8 章细讲)。 |
nslookup / dig | 查域名解析到哪个 IP。 |
网络排障三连
ip addr show # 我的 IP 是多少
ping -c 4 baidu.com # 发 4 个包测连通
ss -tulpn | grep ":80" # 80 端口谁在监听
curl -I https://example.com # 只看响应头
curl -O https://example.com/file.tar.gz # 下载文件
dig example.com # 域名解析详情
scp file.txt jianma@1.2.3.4:/tmp/ # 把本地文件传到远程
$ ss -tulpn | grep :80
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:("nginx",pid=881,fd=6)
$ ping -c 4 baidu.com
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max = 12.1/13.4/15.0 ms
tcpdump 入门:把来往的网络包抓下来看
前面的工具都是"看结果",tcpdump 是"看现场"——数据包一来一回它全录下来。接口/服务不通信时,抓包看"包到底发没发出去、对方回没回",是终极排障手段。
sudo tcpdump -i any # 抓所有网卡的包
sudo tcpdump -i eth0 port 80 # 只抓 80 端口的 HTTP 包
sudo tcpdump host 1.2.3.4 # 只看和某 IP 的通信
sudo tcpdump -nn port 22 -c 10 # 抓 10 个包就停,-nn 不做域名反解(更快)
sudo tcpdump -w /tmp/cap.pcap # 存成文件,后面用 Wireshark 慢慢看
$ sudo tcpdump -nn -c 3 port 80
listening on eth0, link-type EN10MB
10:30:01.001 IP 192.168.1.5.51234 > 93.184.216.34.80: Flags [S], seq 100
10:30:01.012 IP 93.184.216.34.80 > 192.168.1.5.51234: Flags [S.], seq 200
10:30:01.013 IP 192.168.1.5.51234 > 93.184.216.34.80: Flags [.], ack 201
# S/S./. 就是三次握手:我连→对方应→我确认,连接建立
七、磁盘:空间都被谁吃了
"磁盘满了!"是运维第一名的事故。先用 df 看整体,再用 du 揪出最肥的目录。
查看空间 / 找大文件
df -h # 各分区使用情况,-h 人类可读
du -sh /var/log/* # /var/log 下每个子目录占多大
du -h --max-depth=1 /var # /var 下第一层各占多少
lsblk # 树状看磁盘和分区
blkid # 看分区的 UUID 和文件系统类型
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 40G 18G 20G 48% /
tmpfs 393M 0 393M 0% /tmp
$ du -sh /var/log/* | sort -rh | head -3
1.2G /var/log/journal
350M /var/log/nginx
88M /var/log/installer
分区与挂载(加新硬盘时用)
sudo fdisk /dev/sdb # 给新硬盘 /dev/sdb 分区(交互式)
sudo mkfs.ext4 /dev/sdb1 # 把分好的区格式化成 ext4
sudo mkdir /mnt/data
sudo mount /dev/sdb1 /mnt/data # 挂载到 /mnt/data
sudo umount /mnt/data # 用完卸载
/etc/fstab 里长这样(用 UUID 更稳)
# blkid 查到的 UUID 挂载点 类型 选项 备份 检查顺序
UUID=12345678-aaaa-bbbb-cccc-1234567890ab /mnt/data ext4 defaults 0 2
# 写完 sudo mount -a 测试,不报错再重启
mount 重启就没,要写 fstab
mount 挂的盘重启后自动消失。想开机自动挂,得往 /etc/fstab 写一行配置。这文件写错一个字符,系统可能起不来——改完先 sudo mount -a 测试,成功再重启。
swap(交换分区)与磁盘概览
lsblk # 树状看磁盘/分区
free -h # 看 swap 用量
swapon --show # 当前 swap 设备
# 内存不够时,系统会把一部分数据挪到磁盘上的 swap;频繁用 swap 说明该加内存了
八、压缩打包:tar 是祖师爷
Linux 圈最常见的是 .tar.gz。记住四个字母组合:c 建包、x 解包、z 用 gzip、v 显示过程、f 指定文件名。背口诀:"压缩 czf,解包 xzf"。
tar 全家桶
tar -czvf backup.tar.gz project/ # 打包并用 gzip 压缩
tar -xzvf backup.tar.gz # 解出来
tar -tzvf backup.tar.gz # 只看里面有什么,不解压
tar -xzvf backup.tar.gz -C /tmp/ # 解到指定目录
gzip file.txt # 压缩成 file.txt.gz
gunzip file.txt.gz # 解压
zip -r folder.zip folder/ # zip 格式(Windows 友好)
unzip folder.zip
$ tar -czvf backup.tar.gz project/
project/
project/src/
project/src/main.py
$ ls -lh backup.tar.gz
-rw-r--r-- 1 jianma jianma 1.2M Sep 16 backup.tar.gz
九、查找:文件和命令都在哪
find → 实时扫磁盘,想怎么找就怎么找
find 路径 条件,按名字、类型、大小、时间找。
例子:find /var/log -name "*.log" 按名;find . -type f -size +100M 找大于 100M 的文件;find . -name "*.tmp" -mtime +7 -delete 找 7 天前的 tmp 直接删;find . -name "*.log" -exec wc -l {} \; 找到后对每个文件执行命令。
locate → 查数据库,秒出结果
它查的是系统预先建好的文件名索引库,比 find 快,但新文件要先 updatedb 才找得到。
例子:locate nginx.conf 一秒列出全盘所有 nginx.conf。
which / whereis → 找命令本身
which python3 告诉你这个命令的可执行文件在哪;whereis nginx 连二进制、配置、手册一起列。
典型用途:"我装了俩版本的 python,现在敲 python3 跑的是哪个?"——which 一下就清楚。
find 实战:找出 7 天前的日志并打包备份
find /var/log/nginx -name "*.log" -mtime +7
find /var/log/nginx -name "*.log" -mtime +7 -exec tar -czf old_logs.tar.gz {} +
which python3
whereis nginx
$ which python3
/usr/bin/python3
$ whereis nginx
nginx: /usr/sbin/nginx /etc/nginx /usr/share/nginx
十、其他高频杂项
| 命令 | 用途 |
date / cal | 看/改时间,看日历。 |
echo / printf | 打印变量、写测试内容到文件。 |
history | 历史命令;!编号 重跑;Ctrl+R 搜索历史,神仙快捷键。 |
alias | 起别名:alias ll='ls -lh',永久生效写进 ~/.bashrc。 |
uname -a / hostname | 看内核信息 / 看主机名。 |
reboot / shutdown -r now | 重启;shutdown -h now 关机;shutdown +10 十分钟后关机。 |
man 命令 / 命令 --help | 忘记选项就问系统:man 是详细手册(q 退出),--help 是快速摘要。 |
clear | 清屏(Ctrl+L 也行)。 |
本章小练习 · details 点开做
练习 1:把 /etc 下所有.conf 文件复制到家目录的 conf_backup/ 里
mkdir -p ~/conf_backup && cp /etc/*.conf ~/conf_backup/(注意子目录里的 .conf 要 -r 和 find 配合:sudo find /etc -name "*.conf" -exec cp {} ~/conf_backup/ \;)。
练习 2:统计 access.log 里出现次数最多的 IP(第一列)前 5 名
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -5。三剑客流水线:awk 抽列 → sort 排序 → uniq -c 计数 → 再排序取前 5。
练习 3:把 start.sh 的权限改成"自己可读写执行,组和别人只读和执行"
755。chmod 755 start.sh 或符号法 chmod u=rwx,go=rx start.sh。
练习 4:发现一个进程 PID=9999 占满 CPU,普通 kill 没用,怎么办
先 kill 9999 温和请求退出;没用再 kill -9 9999 强杀。kill -9 不给进程清理机会,可能留临时文件,放最后用。
练习 5:/var/log 快满了,怎么找出最大的 5 个文件
find /var/log -type f -exec du -h {} + | sort -rh | head -5,或者 du -ah /var/log | sort -rh | head -5。
记
本章小结
① 文件三板斧 cp/mv/rm 没有回收站;看文件 less 分页、tail -f 跟日志,别拿 cat 读大文件。
② 三剑客 grep 找、sed 改、awk 抽列,用管道 | 串起来是灵魂。
③ 权限记死 755 脚本 / 644 普通文件 / 600 密钥;进程 ps aux 看、kill 杀、nohup 后台跑;磁盘 df 看总量、du 找肥文件。