Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

R.1 命令行速查

只放「高频 + 易错」;完整解释回各章。默认 Ubuntu 24.04 / bash 5.2。

1. 导航与文件

目的命令
当前目录pwd -P(物理路径,解开符号链接)
列出(含隐藏、inode)ls -alhi
按大小/时间排序ls -lhS / ls -lht
只看目录ls -d */
建目录(含父)mkdir -p a/b/c
复制保留属性cp -a src dst
移动/改名mv -- old new
删除(先确认)ls -ld -- target && rm -rf -- target
硬链接ln src dst
软链接ln -s target link
查看链接指向readlink -f link
元数据stat file
文件类型file file
磁盘占用du -xhd1 . | sort -h
目录树tree -L 2 -a

2. 权限

目的命令
八进制chmod 644 f / chmod 755 d
符号chmod u+x,g-w,o=r f
递归chmod -R u+rwX dir(X 只给目录/已可执行文件)
属主chown user:group f
默认权限umask / umask 022
ACLgetfacl f / setfacl -m u:alice:rw f
能力getcap f / setcap cap_net_bind_service=+ep f
查找 setuidfind / -perm -4000 -type f 2>/dev/null

判定顺序:root → 属主 → 属组 → other;ACL mask 会限制有效权限;目录的 x 是「能进入」,r 是「能列名」。

3. 文本处理

目的命令
查找内容grep -RIn --exclude-dir=.git 'pat' .
固定串grep -F 'a.b'
扩展正则grep -E 'a|b'
PCREgrep -P '(?<=x)y'
只输出匹配grep -o 'pat'
前后文grep -C3 'pat'
替换sed -i.bak 's/old/new/g' f
按行号sed -n '10,20p' f
删除空行sed '/^$/d' f
字段抽取awk -F: '{print $1, $3}' /etc/passwd
条件统计awk '$3>100 {n++} END{print n}' f
去重计数sort f | uniq -c | sort -nr
列cut -d, -f2,4 f
拼接paste a b
十六进制xxd -g1 f / hexdump -C f

4. 重定向与管道

写法含义
> fstdout 覆盖到 f
>> f追加
2> fstderr 到 f
2>&1stderr 复制到当前 stdout(顺序重要)
&> fstdout+stderr 到 f(bash)
< fstdin 来自 f
<<EOFhere-doc
<<<"$s"here-string
|管道;默认只有 stdout
|&stdout+stderr 都进管道(bash)
tee f分流到文件与 stdout
<(cmd)进程替换(bash)
set -o pipefail管道任一失败即失败

退出码:$?;PIPESTATUS[@] 看每段;SIGPIPE 退出码 141。

5. 进程、作业、信号

目的命令
快照ps -eo pid,ppid,stat,pcpu,pmem,etime,cmd --sort=-pcpu
线程ps -eLf / top -H -p PID
树pstree -ap
后台cmd &
作业jobs -l / fg %1 / bg %1
脱离终端nohup cmd >out 2>&1 & / setsid cmd
发信号kill -TERM PID / kill -9 PID
按名pkill -f 'pattern'
超时timeout 10s cmd
等待wait / wait -n
查看状态cat /proc/PID/status
查看栈cat /proc/PID/stack(root)

信号:TERM 可捕获、KILL 不可捕获、INT 是 Ctrl-C、HUP 是终端关闭、STOP/CONT 暂停/继续、CHLD 子进程状态变化。

6. 磁盘与文件系统

目的命令
空间df -hT / df -i
目录占用du -xhd1 /var | sort -h
块设备lsblk -f
挂载findmnt -T /path
挂载/卸载mount /dev/sdb1 /mnt / umount /mnt
只读重挂mount -o remount,rw /
文件系统mkfs.ext4 / mkfs.xfs
LVMpvs / vgs / lvs / lvextend -r -L +10G vg/lv
RAIDmdadm --detail /dev/md0
SMARTsmartctl -a /dev/sdX
谁占用挂载点fuser -vm /mnt

df 满但 du 小:lsof +L1 找被删除仍打开的文件。

7. 包、服务、日志

目的命令
更新sudo apt update && sudo apt upgrade
安装/删除sudo apt install pkg / sudo apt remove pkg
查文件属于哪个包dpkg -S /path
包内容dpkg -L pkg
服务状态systemctl status svc
启停sudo systemctl start/stop/restart svc
开机自启sudo systemctl enable --now svc
失败原因systemctl --failed / journalctl -xeu svc
本次启动日志journalctl -b
实时日志journalctl -f -u svc
定时器systemctl list-timers
croncrontab -e / crontab -l

8. 网络

目的命令
地址ip -br addr
路由ip route get 8.8.8.8
邻居ip neigh
监听ss -lntp
连接ss -tnp state established
统计ss -s
套接字明细ss -tin
抓包sudo tcpdump -i any -nn -s0 -w cap.pcap
读包tcpdump -r cap.pcap 'tcp port 443'
DNSdig +short example.com / resolvectl query
HTTPcurl -v --trace-time
端口测试nc -vz host 443
带宽iperf3 -c host -P 4
路径mtr -rwc 100 host

9. 性能

症状先看
CPU 高top、mpstat -P ALL 1、perf top -p PID
load 高但 CPU 闲ps -eo state,wchan,comm | awk '$1=="D"'、iostat -xz
内存涨free -h、smem -tk、/proc/PID/status
磁盘慢iostat -xz 1、iotop -oPa
网络慢ss -tin、tcpdump、mtr
系统调用多strace -c -T -p PID
内核热点perf top -g、bpftrace

10. Bash 惯用法

set -euo pipefail                  # 严格模式(注意语境例外)
IFS=$'\n\t'                        # 安全分词
name=${1:?usage: $0 NAME}          # 必填参数
tmp=$(mktemp -d); trap 'rm -rf "$tmp"' EXIT
while IFS= read -r line; do ...; done < file   # 不丢反斜杠
mapfile -t arr < file              # 读数组
for f in *.log; do [ -e "$f" ] || continue; done
printf '%s\n' "$var"               # 优于 echo

易错:

  • for f in $(ls):文件名含空格会拆开;用 glob。
  • while read 在管道里是子 shell,变量改了外面看不到;用进程替换或 mapfile。
  • [ $x = y ] 在 x 为空时变成 [ = y ];用 [[ ]] 或加引号。
  • cd 失败后继续 rm -rf *:先 cd ... || exit 1。
  • set -e 在 if/&&/||/! 语境不触发;别把它当万能。

11. 一页诊断顺序

1. 现象:什么坏了?影响谁?从什么时候开始?
2. 变更:最近改了什么(发布/配置/证书/磁盘)?
3. 资源:CPU / 内存 / 磁盘 / 网络 / fd
4. 进程:在不在?什么状态?卡在哪?
5. 日志:应用 / 内核 / systemd
6. 证据:命令输出存档,再动手

回 R.2 系统编程速查;需要按症状排查去 A.3。