终端基础工具指南
覆盖 Linux / macOS / Windows,从零开始掌握命令行。
1. Shell 基础概念
什么是 Shell?
Shell 就是你和操作系统对话的窗口。你在里面打命令,系统执行后返回结果。
| 系统 | 默认 Shell | 配置文件 |
|---|---|---|
| Linux | bash(多数发行版) | ~/.bashrc |
| macOS | zsh(Catalina 起) | ~/.zshrc |
| Windows | PowerShell / CMD | $PROFILE(PowerShell) |
终端 vs Shell vs 控制台
- 终端(Terminal):显示界面,如 iTerm2、Windows Terminal、GNOME Terminal
- Shell:解释命令的程序,如 bash、zsh、fish、PowerShell
- 控制台(Console):物理终端,在 Linux 上指
Ctrl+Alt+F1~F6切出的纯文本界面
环境变量
# 查看所有环境变量
env
printenv
# 查看单个变量
echo $HOME # /home/你的用户名
echo $PATH # 可执行文件搜索路径
echo $USER # 当前用户名
echo $SHELL # 当前使用的 shell
# 临时设置(当前终端有效)
export MY_VAR="hello"
# 永久设置(加到配置文件)
echo 'export MY_VAR="hello"' >> ~/.bashrc # Linux bash
echo 'export MY_VAR="hello"' >> ~/.zshrc # macOS zsh
source ~/.bashrc # 重新加载生效PATH 是什么?
PATH 是一个目录列表,系统在这些目录里找你要运行的命令。
# 查看当前 PATH
echo $PATH
# 查看某个命令的实际路径
which ls # /usr/bin/ls
which python3 # /usr/bin/python3 或 /home/xxx/.local/bin/python3
type cd # cd 是 shell 内置命令,没有路径
# 临时添加路径
export PATH="$PATH:/home/mage123/.local/bin"
# 永久添加
echo 'export PATH="$PATH:/home/mage123/.local/bin"' >> ~/.bashrc2. 文件与目录操作
目录导航
pwd # 显示当前目录(Print Working Directory)
cd /home/mage123 # 切换到指定目录
cd ~ # 回到家目录
cd - # 回到上一个目录(超实用!)
cd .. # 上一级目录
cd ../.. # 上两级目录
cd . # 当前目录(没用,但语法正确)目录操作
mkdir mydir # 创建目录
mkdir -p a/b/c # 递归创建(父目录不存在也一起创建)
rmdir mydir # 删除空目录
rm -r mydir # 递归删除目录及内容(⚠️ 不可恢复)
rm -rf mydir # 强制递归删除(更危险!千万别 rm -rf /)文件列表
ls # 列出当前目录文件
ls -l # 详细列表(权限、大小、日期)
ls -la # 包含隐藏文件(以 . 开头的文件)
ls -lh # 人类可读的文件大小(KB/MB)
ls -lt # 按修改时间排序
ls -lS # 按文件大小排序
ls -R # 递归列出所有子目录
ls *.txt # 列出所有 .txt 文件
ls -la /etc | head -20 # 只看前 20 行文件操作
cp source.txt dest.txt # 复制文件
cp -r dir1/ dir2/ # 递归复制目录
mv old.txt new.txt # 重命名
mv file.txt /tmp/ # 移动文件
rm file.txt # 删除文件
rm -i file.txt # 删除前确认(安全模式)
ln -s /path/to/file link # 创建软链接(快捷方式)文件内容查看
cat file.txt # 输出整个文件内容
cat -n file.txt # 带行号
less file.txt # 分页查看(q 退出,/ 搜索,n 下一个)
more file.txt # 分页查看(功能比 less 少)
head -20 file.txt # 查看前 20 行
tail -20 file.txt # 查看最后 20 行
tail -f /var/log/syslog # 实时追踪文件变化(看日志神器)
wc -l file.txt # 统计行数
wc -w file.txt # 统计单词数
wc -c file.txt # 统计字节数文件权限
# 权限格式:rwxrwxrwx(所有者/组/其他人)
# r=读(4) w=写(2) x=执行(1)
chmod 755 script.sh # rwxr-xr-x(所有者全权限,其他人读+执行)
chmod 644 file.txt # rw-r--r--(所有者读写,其他人只读)
chmod +x script.sh # 添加执行权限
chmod -R 755 mydir/ # 递归设置目录权限
chown user:group file.txt # 修改文件所有者
sudo chown -R mage123:mage123 mydir/ # 递归修改文件搜索与查找
# find —— 按条件查找文件
find . -name "*.txt" # 当前目录下所有 .txt 文件
find . -name "*.log" -mtime +7 # 7天前修改的 .log 文件
find . -type f -size +100M # 大于 100MB 的文件
find . -type d -name "node_modules" # 所有 node_modules 目录
find . -name "*.tmp" -delete # 删除所有 .tmp 文件
find . -name "*.py" -exec wc -l {} \; # 统计所有 Python 文件行数
# locate —— 快速查找(基于数据库,比 find 快很多)
sudo updatedb # 更新数据库
locate nginx.conf # 查找 nginx.conf
# which / whereis —— 查找命令位置
which python3 # /usr/bin/python3
whereis python3 # 二进制、源码、手册页位置3. 文本处理
grep —— 文本搜索
# 基础用法
grep "error" logfile.txt # 搜索包含 error 的行
grep -i "error" logfile.txt # 忽略大小写
grep -n "error" logfile.txt # 显示行号
grep -v "debug" logfile.txt # 反选(不含 debug 的行)
grep -c "error" logfile.txt # 只输出匹配行数
grep -r "TODO" src/ # 递归搜索目录下所有文件
grep -rn "TODO" src/ # 递归搜索 + 显示行号
grep --color "error" logfile.txt # 高亮匹配内容
# 正则搜索
grep -E "error|warn|fatal" logfile.txt # 匹配多个模式(扩展正则)
grep -P "\d{3}-\d{4}" contacts.txt # Perl 正则(部分系统支持)
grep "^start" file.txt # 以 start 开头的行
grep "end$" file.txt # 以 end 结尾的行
# 常用组合
ps aux | grep nginx # 查找 nginx 进程
history | grep docker # 在历史命令里搜 docker
cat /etc/passwd | grep -v nologin # 查找有登录 shell 的用户sed —— 流编辑器
# 替换文本
sed 's/old/new/' file.txt # 替换每行第一个 old → new
sed 's/old/new/g' file.txt # 替换所有 old → new
sed -i 's/old/new/g' file.txt # 直接修改文件(⚠️ 原地修改)
sed -i.bak 's/old/new/g' file.txt # 修改并备份原文件
# 删除行
sed '3d' file.txt # 删除第 3 行
sed '3,5d' file.txt # 删除第 3-5 行
sed '/^#/d' file.txt # 删除所有 # 开头的行
sed '/^$/d' file.txt # 删除空行
# 插入/追加
sed '2i\new line' file.txt # 在第 2 行前插入
sed '2a\new line' file.txt # 在第 2 行后追加
# 提取内容
sed -n '10,20p' file.txt # 只输出第 10-20 行awk —— 文本分析利器
# 基础:按列提取
awk '{print $1}' file.txt # 打印每行第 1 列
awk '{print $1, $3}' file.txt # 打印第 1 和第 3 列
awk '{print NR, $0}' file.txt # 打印行号 + 整行
# 指定分隔符
awk -F: '{print $1, $7}' /etc/passwd # 以 : 分隔,取第 1、7 列
awk -F',' '{print $2}' data.csv # CSV 文件取第 2 列
# 条件过滤
awk '$3 > 100 {print $1, $3}' data.txt # 第 3 列大于 100 的行
awk '/error/ {print}' logfile.txt # 包含 error 的行
# 统计
awk '{sum += $1} END {print sum}' nums.txt # 求和
awk '{print NR": "$0}' file.txt # 每行加行号
awk 'END {print NR}' file.txt # 统计总行数
# 实战:统计日志中各 IP 出现次数
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10sort / uniq —— 排序与去重
sort file.txt # 按字母排序
sort -n file.txt # 按数字排序
sort -r file.txt # 逆序
sort -k2 file.txt # 按第 2 列排序
sort -t: -k3 -n /etc/passwd # 以 : 分隔,按第 3 列数字排序
uniq file.txt # 去除连续重复行
sort file.txt | uniq # 先排序再去重(标准流程)
sort file.txt | uniq -c # 去重并统计每行出现次数
sort file.txt | uniq -c | sort -rn # 按出现次数降序排列cut —— 按列切割
cut -d: -f1 /etc/passwd # 以 : 分隔,取第 1 列
cut -d',' -f1,3 data.csv # CSV 取第 1、3 列
cut -c1-10 file.txt # 取每行第 1-10 个字符
cut -f2 file.tsv # TSV 取第 2 列(默认 tab 分隔)tr —— 字符转换
echo "hello" | tr a-z A-Z # 转大写 → HELLO
echo "HELLO" | tr A-Z a-z # 转小写 → hello
echo "a b c" | tr -s ' ' # 压缩连续空格为单个
echo "hello" | tr -d 'l' # 删除字符 → heo
cat file.txt | tr '\t' ' ' # tab 转空格xargs —— 参数拼接
# 把标准输入变成命令参数
cat urls.txt | xargs curl -s # 逐行 curl
find . -name "*.log" | xargs rm # 删除找到的所有日志
find . -name "*.txt" | xargs wc -l # 统计所有 txt 文件行数
echo "file1 file2 file3" | xargs -n 1 echo # 每次传 1 个参数
find . -name "*.py" | xargs -I {} cp {} /backup/ # 用 {} 占位管道与重定向
# 管道:把前一个命令的输出作为后一个命令的输入
ls -la | grep ".txt" # 列出文件,过滤出 txt
cat log.txt | grep error | wc -l # 统计 error 行数
ps aux | sort -k3 -rn | head -10 # 查看 CPU 占用最高的 10 个进程
# 重定向
echo "hello" > file.txt # 覆盖写入
echo "world" >> file.txt # 追加写入
command 2> error.txt # 只输出 stderr
command &> all.txt # stdout + stderr 都输出到文件
command > /dev/null 2>&1 # 丢弃所有输出(静默执行)
cat < input.txt # 从文件读取输入(用得少)
# Here Document
cat << EOF > config.txt
server_name = example.com
port = 8080
EOF
# Here String
grep "pattern" <<< "this is a pattern test"4. 进程与系统管理
进程查看
ps aux # 查看所有进程
ps aux | grep nginx # 查找特定进程
ps -ef --forest # 树状显示进程关系
top # 实时进程监控(按 q 退出)
htop # 增强版 top(需安装)
kill PID # 发送 SIGTERM(优雅终止)
kill -9 PID # 发送 SIGKILL(强制杀死)
killall nginx # 按进程名杀死
pkill -f "python app.py" # 按命令行模式杀死
pgrep nginx # 按进程名查找 PID
nohup command & # 后台运行,退出终端不中断系统信息
uname -a # 系统内核信息
cat /etc/os-release # 发行版信息(Linux)
sw_vers # macOS 版本信息
hostname # 主机名
uptime # 运行时间和负载
free -h # 内存使用(Linux)
vm_stat # 内存使用(macOS)
df -h # 磁盘使用
du -sh * # 当前目录各文件/目录大小
du -sh . | sort -rh | head -10 # 找最大的目录
lscpu # CPU 信息(Linux)
sysctl -n machdep.cpu.brand_string # CPU 信息(macOS)网络工具
ping google.com # 测试连通性
curl -I https://example.com # 只看 HTTP 头
curl -s https://api.example.com | jq # 请求 API 并格式化 JSON
wget https://example.com/file.zip # 下载文件
wget -c url # 断点续传
ss -tlnp # 查看监听端口(现代替代 netstat)
netstat -tlnp # 查看监听端口(旧版)
ip addr # 查看 IP 地址(Linux)
ifconfig # 查看 IP 地址(macOS 通用)
nslookup example.com # DNS 查询
dig example.com # 详细 DNS 查询
scp file.txt user@host:/path/ # 远程复制文件
ssh user@host # SSH 登录5. 包管理速查
# Debian/Ubuntu (apt)
sudo apt update # 更新包索引
sudo apt install nginx # 安装
sudo apt remove nginx # 卸载
sudo apt search keyword # 搜索
sudo apt list --installed # 已安装列表
# macOS (Homebrew)
brew install nginx # 安装
brew uninstall nginx # 卸载
brew search keyword # 搜索
brew list # 已安装列表
brew update && brew upgrade # 更新所有
# Fedora/RHEL (dnf)
sudo dnf install nginx
sudo dnf remove nginx
# Arch (pacman)
sudo pacman -S nginx
sudo pacman -R nginx6. 实用技巧
Tab 补全
按一次 Tab 补全命令/文件名,按两次列出所有候选。这是最省时间的操作。
历史命令
history # 查看所有历史
history | grep docker # 搜索历史
!42 # 执行第 42 条历史命令
!! # 执行上一条命令
!$ # 上一条命令的最后一个参数
Ctrl+R # 反向搜索历史(超好用!)
Ctrl+G # 退出搜索快捷键
Ctrl+C 中断当前命令
Ctrl+Z 暂停当前命令(用 fg 恢复)
Ctrl+D 退出当前 shell / EOF
Ctrl+L 清屏(等同 clear)
Ctrl+A 光标移到行首
Ctrl+E 光标移到行尾
Ctrl+U 删除光标到行首
Ctrl+K 删除光标到行尾
Ctrl+W 删除光标前一个单词
Ctrl+Y 粘贴 Ctrl+U/K/W 删除的内容
Alt+. 插入上一条命令的最后一个参数tmux —— 终端复用器
tmux # 新建会话
tmux new -s mywork # 新建命名会话
tmux ls # 列出所有会话
tmux attach -t mywork # 连接到会话
Ctrl+B D # 断开(会话继续运行)
Ctrl+B % # 左右分屏
Ctrl+B " # 上下分屏
Ctrl+B 方向键 # 切换面板7. Bash vs Zsh 差异
macOS 从 Catalina 开始默认用 zsh。核心命令一样,但配置和一些特性不同:
| 特性 | Bash | Zsh |
|---|---|---|
| 配置文件 | ~/.bashrc | ~/.zshrc |
| Tab 补全 | 基础 | 更智能(模糊匹配、拼写纠正) |
| 插件生态 | 有限 | oh-my-zsh 强大生态 |
| 历史共享 | 各终端独立 | 可配置多终端共享 |
| 主题 | 基础 | 丰富(powerlevel10k 等) |
| 数组索引 | 从 0 开始 | 从 1 开始 |
| 通配符 | 有限 | 扩展通配(**/*.txt) |
# 安装 oh-my-zsh(macOS 推荐)
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# 常用插件(在 ~/.zshrc 的 plugins=() 里添加)
plugins=(git z autosuggestions zsh-syntax-highlighting)8. GNU vs BSD 差异(Linux vs macOS)
macOS 的命令行工具是 BSD 版本,和 Linux 的 GNU 版本有些细微差异:
# ls —— 基本相同
ls -la # 两边一样
# date —— 格式化方式不同
date +"%Y-%m-%d" # GNU (Linux)
date -j -f "%s" +%Y-%m-%d # BSD (macOS) 更麻烦
# sed —— BSD 要求备份参数非空
sed -i 's/old/new/g' file # GNU (Linux) 直接改
sed -i '' 's/old/new/g' file # BSD (macOS) 需要空备份参数
# stat —— 输出格式完全不同
stat file # GNU: 多行详细信息
stat file # BSD: 一行紧凑格式
# xargs —— GNU 有 -d 参数
echo "a,b,c" | xargs -d ',' # GNU
echo "a,b,c" | tr ',' '\n' | xargs # BSD 兼容写法
# 解决方案:macOS 装 GNU 版本
brew install coreutils gnu-sed grep findutils
# 然后用 gsed、ggrep、gfind 等前缀
gsed -i 's/old/new/g' file9. Windows 终端速览
Windows 用户有两种选择:
CMD(传统命令提示符)
:: 基础导航
cd C:\Users # 切换目录
dir # 列出文件(等同 ls)
dir /a # 包含隐藏文件
dir /s # 递归列出
mkdir mydir # 创建目录
rmdir /s /q mydir # 强制递归删除
:: 文件操作
copy source.txt dest.txt # 复制
move old.txt new.txt # 移动/重命名
del file.txt # 删除
type file.txt # 查看内容(等同 cat)
:: 其他
echo %PATH% # 查看环境变量
set MY_VAR=hello # 设置变量
tasklist # 查看进程(等同 ps)
taskkill /PID 1234 /F # 强制杀死进程PowerShell(推荐)
PowerShell 功能强大得多,是现代 Windows 的首选:
# 导航
Get-Location # pwd
Set-Location C:\Users # cd
Get-ChildItem # ls
Get-ChildItem -Recurse -Filter "*.txt" # find + ls
# 文件操作
Copy-Item source.txt dest.txt # cp
Move-Item old.txt new.txt # mv
Remove-Item file.txt # rm
New-Item -ItemType Directory dir # mkdir
# 文本搜索
Get-Content log.txt | Select-String "error" # grep 等效
Get-Content log.txt | Where-Object {$_ -match "error"} # 另一种写法
# 进程管理
Get-Process # ps aux
Stop-Process -Name nginx -Force # killall
Get-Process | Sort CPU -Descending | Select -First 10 # top 10 CPU
# 网络
Test-Connection google.com # ping
Invoke-WebRequest https://example.com # curl
Invoke-RestMethod https://api.example.com # 请求 API 并解析 JSONLinux 命令的 Windows 等效
| Linux | CMD | PowerShell |
|---|---|---|
ls -la | dir | Get-ChildItem -Force |
cd | cd | Set-Location |
cat file | type file | Get-Content file |
grep pattern | findstr pattern | Select-String pattern |
rm -rf dir | rmdir /s /q dir | Remove-Item -Recurse -Force dir |
cp | copy | Copy-Item |
mv | move | Move-Item |
touch file | echo.> file | New-Item file |
which cmd | where cmd | Get-Command cmd |
head -20 | — | Get-Content -Head 20 |
tail -f | — | Get-Content -Wait |
chmod | icacls | Set-Acl |
curl | — | Invoke-WebRequest |
Pro Tip:Windows 10/11 自带 WSL(Windows Subsystem for Linux),可以直接跑完整的 Linux 终端:
wsl --install # 安装 WSL + Ubuntu wsl # 进入 Linux 环境装了 WSL 就不用记 CMD/PowerShell 了,直接用 Linux 命令。
10. 速查卡
文件目录
pwd 当前路径
cd dir 切换目录
cd - 回上个目录
ls -la 列出所有文件详情
mkdir -p a/b 递归创建目录
rm -rf dir 递归删除(⚠️)
cp -r src/ dst/ 递归复制
mv old new 移动/重命名
ln -s src link 软链接查看内容
cat file 全部输出
less file 分页查看
head/tail -N 前/后 N 行
tail -f file 实时追踪
wc -l file 统计行数搜索
grep -r "str" dir 递归搜索
find . -name "*.py" 按名找文件
find . -size +100M 按大小找
locate file 快速定位
which cmd 命令路径文本处理
sed 's/a/b/g' 替换
awk '{print $1}' 取列
sort | uniq -c 排序计数
cut -d: -f1 切列
tr a-z A-Z 转大写
xargs 参数拼接系统
ps aux 进程列表
top / htop 实时监控
kill PID 杀进程
df -h 磁盘
free -h 内存
ss -tlnp 端口快捷键
Tab 补全
Ctrl+R 搜历史
Ctrl+C 中断
Ctrl+Z 暂停
Ctrl+L 清屏
Ctrl+A/E 行首/行尾
评论已关闭