终端基础工具指南

覆盖 Linux / macOS / Windows,从零开始掌握命令行。

1. Shell 基础概念

什么是 Shell?

Shell 就是你和操作系统对话的窗口。你在里面打命令,系统执行后返回结果。

系统默认 Shell配置文件
Linuxbash(多数发行版)~/.bashrc
macOSzsh(Catalina 起)~/.zshrc
WindowsPowerShell / 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"' >> ~/.bashrc

2. 文件与目录操作

目录导航

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 -10

sort / 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 nginx

6. 实用技巧

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。核心命令一样,但配置和一些特性不同:

特性BashZsh
配置文件~/.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' file

9. 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 并解析 JSON

Linux 命令的 Windows 等效

LinuxCMDPowerShell
ls -ladirGet-ChildItem -Force
cdcdSet-Location
cat filetype fileGet-Content file
grep patternfindstr patternSelect-String pattern
rm -rf dirrmdir /s /q dirRemove-Item -Recurse -Force dir
cpcopyCopy-Item
mvmoveMove-Item
touch fileecho.> fileNew-Item file
which cmdwhere cmdGet-Command cmd
head -20Get-Content -Head 20
tail -fGet-Content -Wait
chmodicaclsSet-Acl
curlInvoke-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            行首/行尾