第 4 章 · 命令行基础与常用命令
高手「快速用命令看清一切状态」的底层能力就是本章。不追求背全,追求高频命令 + 查命令的方法论:以后遇到没见过的命令,你会自己查、自己用。本章命令基本 Ubuntu/Rocky 通用(个别差异已标注)。
本章目录
4.1 Shell 与提示符 4.2 命令结构 4.3 高频命令地图 4.4 管道/重定向/通配符 4.5 文件与搜索 4.6 进程管理 4.7 文本三剑客 4.8 vim 必会 4.9 tmux 会话 4.10 环境变量与 PATH 4.11 查命令方法论 自测题4.1Shell 是什么:你的翻译官
Shell 是「接收你输入的命令 → 翻译成系统调用 → 返回结果」的程序。默认是 Bash(Ubuntu 20.04+ 默认 dash 作为 sh,交互 Shell 是 bash;Rocky 默认 bash)。你输入的每一行,Shell 按「命令 + 选项 + 参数」解析执行。
echo $SHELL看当前 Shell;cat /etc/shells看系统有哪些 Shell。- 提示符形如
user@host:~$:$普通用户、#root 用户(看到 # 要警惕,你已拥有最高权限)。 - Ubuntu 的 sudo 组用户用
sudo提权;Rocky 的 root 可直接登录或用 sudo。
4.2命令的骨架:命令 + 选项 + 参数
ls -lh /var/log
│ │ └── 参数(目标)
│ └── 选项(-l 详细, -h 人类可读)
└── 命令
- 选项:
-l短选项、--long长选项;多数可合并ls -lah。 - 求助三连:
命令 --help(快速)、man 命令(详细手册,按 q 退出)、info 命令(更详细)。
4.3高频命令地图(按场景分类,先混脸熟)
| 场景 | 核心命令 |
|---|---|
| 文件与目录 | ls cd pwd mkdir cp mv rm ln file stat |
| 查看文件内容 | cat tac less head tail grep wc diff |
| 搜索 | find locate which whereis grep -r |
| 进程 | ps top htop kill pkill pgrep jobs nohup |
| 系统状态 | uptime free df du uname hostnamectl dmesg lsblk |
| 用户 | whoami id who w last useradd passwd sudo |
| 网络 | ip ss ping curl wget dig ssh scp traceroute |
| 压缩 | tar zip unzip gzip xz zstd |
| 文本处理 | grep sed awk sort uniq cut tr jq(JSON) |
| 帮助 | man --help apropos type help |
别急着全背 —— 第 4.11 节教你怎么用的时候查;查多了自然记住高频的。
4.4管道、重定向、通配符(Shell 的灵魂)
# 管道 | :把前一个命令的输出,作为后一个命令的输入
ps aux | grep nginx
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
# 重定向 > >> < 2>:输出到文件 / 追加 / 从文件输入 / 错误输出
echo "hello" > /tmp/a.txt
nginx -t 2>&1 # 错误信息合并到正常输出
mail -s "备份" user < report.txt
# 通配符 * ? [ ]
ls *.log # 所有 .log 结尾
rm -f backup_2024??.tar # ? 匹配单个字符
ls file[1-3].txt # file1 file2 file3
rm 安全铁律
rm -rf 是「后悔药最贵的命令」。三条保命习惯:① 用通配符前先 ls 预览匹配结果;② 重要删除先 mv 到 /tmp 再观察;③ 系统目录(/etc /usr /var/lib)绝不手动 rm -rf。养成把 rm -rf 替换成 rm -rf -- 路径 并用绝对路径写全的习惯。
4.5文件与搜索:每日操作清单
ls -lah /etc/nginx # 详细列表(-a 含隐藏文件)
cp -r /etc/nginx /root/nginx.bak # -r 递归复制目录
mv old.conf new.conf # 重命名/移动
ln -s /opt/app/bin/app /usr/local/bin/app # 软链接(快捷方式)
find / -name "*.conf" -type f 2>/dev/null # 全盘找文件
find /var/log -mtime -7 # 7 天内修改过的文件(排查痕迹常用)
locate nginx.conf # 数据库秒查(需 updatedb 更新)
tail -f /var/log/nginx/access.log # 实时跟踪日志(运维最常用!)
tail -f 是运维之神器:实时看日志、看服务输出、看流量。学完第 10 章你会用它查攻击。
4.6进程管理
ps aux # 全部进程快照(列:USER PID CPU MEM VSZ RSS TTY STAT START TIME COMMAND)
ps -ef | grep mysql # 按名字找进程
top # 实时刷新;按 P 按CPU排、M 按内存排、1 看每核
pgrep -f "nginx: worker" # 只输出 PID
kill -15 1234 # 温柔终止(默认);kill -9 强杀(最后手段)
pkill -f mysqld # 按名杀
sleep 3600 & # 后台运行
nohup ./app > app.log 2>&1 & # 脱离终端后台运行(登出也不死)
jobs -l # 查看当前 Shell 后台任务
kill -9 的顺序
先
kill -15(让进程清理自己)等几秒,不行再 -9。数据库、配置类服务强杀可能损坏数据。生产环境杀进程前先确认:ps -ef | grep 名字 看清 PID 和归属。
4.7文本三剑客:grep / sed / awk(运维看家本领)
# grep:过滤行
grep "error" /var/log/syslog
grep -i "warning" app.log # 忽略大小写
grep -E "192\.168\.1\.(10|20)" access.log # 扩展正则
grep -rn "listen" /etc/nginx/ # 递归搜索目录
# sed:流编辑(查找替换)
sed -i 's/8080/80/g' nginx.conf # 原地替换(-i 慎用,先备份)
sed -n '10,20p' file.txt # 打印 10-20 行
# awk:按列处理
awk '{print $1, $9}' access.log # 打印第 1、9 列(IP 与状态码)
awk '$9 == 404 {print $1}' access.log | sort | uniq -c
df -h | awk 'NR>1 {print $1, $5}' # 分区与使用率
现在先会用 grep,sed/awk 能看懂示例即可,第 11 章脚本实战里会大量用到。这三样是「从日志里快速提炼信息」的核心武器。
4.8vim:服务器上绕不开的编辑器
服务器没有图形界面时,改配置全靠终端编辑器。vim 学习曲线陡但必须入门(nano 是简易替代,但 vim 无处不在)。只记必会 15 个操作:
| 操作 | 按键 |
|---|---|
| 打开文件 | vim /etc/nginx/nginx.conf |
| 进入编辑模式 | i(光标前插入)/ a(后)/ o(新行) |
| 返回普通模式 | Esc |
| 移动 | h j k l(左 下 上 右); gg 文件头; G 文件尾; :N 到第 N 行 |
| 删除 | x 删一个字符; dd 删一行; dG 删到结尾 |
| 复制粘贴 | yy 复制行; p 粘贴 |
| 撤销重做 | u 撤销; Ctrl+r 重做 |
| 查找 | /关键词 回车; n 下一个; N 上一个 |
| 保存退出 | :wq 保存退出; :q! 不保存退出; :w 只保存 |
| 行号显示 | :set nu(写入 ~/.vimrc 永久生效) |
练习方法:每天用 vim 改一个配置文件,一周就顺了。
4.9tmux:SSH 断开不断线(多任务神器)
SSH 一断,终端里的进程就收到挂断信号。tmux 让会话在服务器后台存活,断线重连后一切还在:
tmux new -s work # 新建会话(-s 命名)
tmux ls # 列出会话
tmux attach -t work # 重连会话
# 会话内:Ctrl+b 然后按 ——
# c 新窗口 d 脱离(detach,任务继续跑) % 左右分屏 " 上下分屏
tmux kill-session -t work # 关闭会话
习惯养成
以后在服务器上跑长任务(编译、备份、部署),一律
tmux new -s 任务名 后执行。这是「登出不断线」的专业做法。screen 是同类老工具,功能类似。4.10环境变量与 PATH:命令为什么能被找到
echo $PATH:Shell 按 PATH 里的目录顺序找命令。所以「解压到 /opt/app/bin 后输入命令找不到」是因为 PATH 里没有该目录。- 临时生效:
export PATH=$PATH:/opt/app/bin;永久生效:写进~/.bashrc或/etc/profile.d/xxx.sh(系统级)。 - 常用变量:
HOMEUSERLANGLANG=C(英文输出)EDITOR。 env查看全部;set含 Shell 变量。
echo 'export PATH=$PATH:/opt/app/bin' >> ~/.bashrc
source ~/.bashrc # 让配置立即生效
4.11查命令方法论:以后遇到陌生命令怎么办
type 命令:是内建、别名、还是外部程序?(alias看别名)which 命令/whereis 命令:可执行文件在哪。命令 --help:最快看用法。man 命令:完整手册。搜索手册:man -k 关键词或apropos 关键词。- 想要示例:
tldr 命令(需安装,社区示例集合,强烈推荐)。 - 想知道系统里有哪些同类命令:
ls /usr/bin | grep 关键词。
「不再靠问 AI」的关键
高手不是记性好,是查得快:man / tldr / --help 三件套 30 秒内解决 90% 的「这命令怎么用」。从今天起,遇到陌生命令先自己查三分钟,再决定要不要搜索。第 16 章还会教你高质量的搜索姿势(site:、manpage 官网等)。
本章自测题
- 解释管道 | 和重定向 > 的区别,并各写一个例子。
- 找出 /var/log 下 3 天内修改的所有 .log 文件。
- 把 access.log 中 404 请求的 IP 统计出现次数,从多到少排前 10。
- nohup 和 & 各解决什么问题?tmux 解决什么问题?
- 你解压了软件到 /opt/app,命令却找不到,怎么解决?
- kill -15 与 kill -9 的区别?先试哪个?
- vim 中:进入插入、保存退出、不保存退出、撤销、搜索,分别按什么?
参考答案
1. | 把一个命令输出给下一个命令当输入;> 把输出写到文件。例:ps aux|grep nginx;echo hi>/tmp/a。
2. find /var/log -name "*.log" -mtime -3
3. grep ' 404 ' access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
4. & 放后台但 SSH 断开可能被杀;nohup 让进程忽略挂断信号;tmux 让会话整体存活,断线可重连。
5. 把 /opt/app/bin 加入 PATH(export PATH=$PATH:/opt/app/bin 写入 ~/.bashrc)。
6. -15 优雅退出,-9 强制杀。先 -15 等几秒再 -9。
7. i;:wq;:q!;u;/关键词。