Linux Shell 命令实用指南 
1. Bash 基础 
1.1 什么是 Bash 
Bash(Bourne Again Shell)是一个命令处理器,运行在文本窗口中,并能直接执行用户输入的命令。
Bash 的主要特性:
- Bash 能从文件中读取 Linux 命令,被称为脚本
- Bash 支持通配符、管道、命令替换、条件判断等逻辑控制语句
- 支持命令历史记录和自动补全
- 提供强大的脚本编程能力
1.2 命令行展开 
Bash 支持命令行展开,注意 , 中间没有空格:
bash
echo {a,b,c}
# 输出: a b c
{echo 1;echo 2}
# 输出:
# 1
# 2
echo {1..5}
# 输出: 1 2 3 4 5
echo file{1..3}.txt
# 输出: file1.txt file2.txt file3.txt1.3 执行脚本 
将命令信息写入 .sh 文件,然后可以执行:
bash
# 方法1:使用 bash 命令
bash script.sh
# 方法2:添加执行权限后直接运行
chmod +x script.sh
./script.sh脚本开头通常包含 shebang:
bash
#!/bin/bash
echo "Hello, World!"2. 输入输出重定向 
2.1 标准流 
在 Linux 系统中,有三个标准流:
- 0代表标准输入(stdin)
- 1代表标准输出(stdout)
- 2代表标准错误(stderr)
2.2 重定向操作符 
使用管道符 | 来组合多个命令,使用 > 或者 >> 来进行重定向标准输出,使用 2> 来重定向错误输出。
bash
# 覆盖写入
echo "Hello" > file.txt
# 追加写入
echo "World" >> file.txt
# 重定向错误输出
command 2> error.log
# 同时重定向标准输出和错误输出
command > output.log 2>&1
# 简化写法(Bash 4+)
command &> output.log
# 丢弃输出
command > /dev/null 2>&12.3 重定向示例详解 
bash
ls table 2>&1
# 报错,并在标准输出(终端)展示
ls table > /dev/null 2>&1
# 报错,标准错误重定向到标准输出。而标准输出被 /dev/null 占据了,所以错误进了 /dev/null
ls table 2>&1 > /dev/null
# 报错,标准输出指向 /dev/null。而标准错误仍然重定向至标准输出,所以能在终端看到错误输出3. 历史命令 
3.1 使用历史命令 
bash
# 查看历史命令
history
# 执行历史命令中的第 n 行
!n
# 执行上一条命令
!!
# 执行最近一条以 string 开头的命令
!string
# 获取上一条命令的最后一个参数
!$3.2 快捷键 
bash
Ctrl + R    # 反向搜索历史命令
Ctrl + P    # 上一条命令
Ctrl + N    # 下一条命令
Ctrl + A    # 移动到行首
Ctrl + E    # 移动到行尾
Ctrl + U    # 删除光标前的内容
Ctrl + K    # 删除光标后的内容4. 文件查看与编辑 
4.1 cat - 查看文件内容 
bash
# 基本用法
cat file.txt
# 显示行号
cat -n file.txt
# 合并多个文件
cat file1.txt file2.txt > merged.txt
# 追加内容
cat >> file.txt << EOF
第一行
第二行
EOF常用参数:
- -A显示所有控制字符
- -b对非空行编号
- -n对所有行编号
- -s压缩连续空行为一行
4.2 vi/vim - 文本编辑器 
bash
# 打开文件
vi filename
# Vim 基本操作
i    # 进入插入模式
Esc  # 退出插入模式
:w   # 保存
:q   # 退出
:wq  # 保存并退出
:q!  # 强制退出不保存
/pattern    # 搜索
:%s/old/new/g  # 全局替换4.3 echo - 输出文本 
bash
# 基本输出
echo "Hello, World!"
# 输出变量
name="Alice"
echo "Hello, $name"
# 输出到文件
echo "content" > file.txt
# 不换行输出
echo -n "No newline"
# 输出特殊字符
echo -e "Line1\nLine2\tTabbed"5. 文件和目录操作 
5.1 pwd - 显示当前目录 
bash
pwd    # 显示当前工作目录的绝对路径5.2 find - 查找文件 
bash
# 按名称查找
find /path -name "*.txt"
# 按类型查找
find /path -type f    # 文件
find /path -type d    # 目录
# 按大小查找
find /path -size +100M    # 大于 100MB
find /path -size -1k      # 小于 1KB
# 按时间查找
find /path -mtime -7    # 最近 7 天修改的文件
# 执行操作
find /path -name "*.log" -delete
find /path -name "*.txt" -exec cat {} \;5.3 which/whereis - 查找命令位置 
bash
# which - 显示命令的完整路径
which python
which gcc
# whereis - 显示命令的二进制、源码和手册页位置
whereis python
whereis gcc6. 文本处理 
6.1 grep - 文本搜索 
bash
# 基本搜索
grep "pattern" file.txt
# 递归搜索
grep -r "pattern" /path
# 忽略大小写
grep -i "pattern" file.txt
# 显示行号
grep -n "pattern" file.txt
# 反向匹配
grep -v "pattern" file.txt
# 正则表达式
grep -E "pattern1|pattern2" file.txt
# 统计匹配行数
grep -c "pattern" file.txt
# 显示匹配的文件名
grep -l "pattern" *.txt6.2 sed - 流编辑器 
bash
# 替换文本
sed 's/old/new/' file.txt           # 替换每行第一个匹配
sed 's/old/new/g' file.txt          # 替换所有匹配
sed 's/old/new/2' file.txt          # 替换每行第二个匹配
# 删除行
sed '1d' file.txt                   # 删除第一行
sed '/pattern/d' file.txt           # 删除匹配的行
# 插入和追加
sed '1i\New line' file.txt          # 在第一行前插入
sed '$a\New line' file.txt          # 在最后一行后追加
# 直接修改文件
sed -i 's/old/new/g' file.txt       # 直接修改原文件6.3 awk - 文本分析 
bash
# 打印列
awk '{print $1}' file.txt           # 打印第一列
awk '{print $1, $3}' file.txt       # 打印第一和第三列
# 指定分隔符
awk -F ':' '{print $1}' /etc/passwd
# 条件过滤
awk '$3 > 100' file.txt             # 第三列大于 100
awk '/pattern/ {print $1}' file.txt # 匹配模式的行
# 计算
awk '{sum += $1} END {print sum}' file.txt    # 求和
awk '{print NR, $0}' file.txt                 # 添加行号
# 内置变量
# NR - 行号
# NF - 字段数
# $0 - 整行
# $1, $2... - 各字段6.4 wc - 统计 
bash
# 统计行数
wc -l file.txt
# 统计单词数
wc -w file.txt
# 统计字符数
wc -c file.txt
# 综合统计
wc file.txt    # 显示 行数 单词数 字符数7. 网络工具 
7.1 ifconfig/ip - 网络配置 
bash
# 查看网络接口
ifconfig
ip addr show
# 启用/禁用网卡
ifconfig eth0 up
ifconfig eth0 down
# 配置 IP 地址
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
ip addr add 192.168.1.100/24 dev eth07.2 ping - 测试连通性 
bash
# 基本用法
ping google.com
# 指定次数
ping -c 5 google.com
# 指定间隔
ping -i 2 google.com
# 指定超时
ping -W 1 google.com7.3 wget - 下载文件 
bash
# 下载文件
wget https://example.com/file.zip
# 指定输出文件名
wget -O newname.zip https://example.com/file.zip
# 后台下载
wget -b https://example.com/large-file.zip
# 断点续传
wget -c https://example.com/file.zip
# 限速下载
wget --limit-rate=200k https://example.com/file.zip
# 下载整个网站
wget -r -np https://example.com/7.4 curl - 数据传输 
bash
# GET 请求
curl https://api.example.com
# POST 请求
curl -X POST -d "key=value" https://api.example.com
# 发送 JSON
curl -X POST -H "Content-Type: application/json" \
     -d '{"name":"John"}' https://api.example.com
# 下载文件
curl -O https://example.com/file.zip
# 显示响应头
curl -I https://example.com
# 跟随重定向
curl -L https://example.com
# 认证
curl -u username:password https://api.example.com8. 进程管理 
8.1 ps - 查看进程 
bash
# 查看当前用户进程
ps
# 查看所有进程
ps aux
# 查看进程树
ps auxf
# 查看特定进程
ps aux | grep nginx
# 常用列说明
# USER - 用户
# PID - 进程ID
# %CPU - CPU使用率
# %MEM - 内存使用率
# VSZ - 虚拟内存大小
# RSS - 实际内存大小
# STAT - 进程状态
# START - 启动时间
# TIME - CPU时间
# COMMAND - 命令8.2 top - 实时监控 
bash
# 启动 top
top
# 常用快捷键
P    # 按 CPU 使用率排序
M    # 按内存使用率排序
k    # 终止进程
q    # 退出8.3 kill - 终止进程 
bash
# 终止进程
kill PID
# 强制终止
kill -9 PID
# 按名称终止
pkill process_name
# 终止用户的所有进程
pkill -u username9. 别名管理 
9.1 alias - 创建别名 
bash
# 创建别名
alias ll='ls -lah'
alias gs='git status'
alias ..='cd ..'
# 查看所有别名
alias
# 查看特定别名
alias ll9.2 unalias - 删除别名 
bash
# 删除别名
unalias ll
# 删除所有别名
unalias -a9.3 永久保存别名 
将别名添加到 ~/.bashrc 或 ~/.bash_profile:
bash
# 编辑配置文件
vi ~/.bashrc
# 添加别名
alias ll='ls -lah'
alias gs='git status'
# 重新加载配置
source ~/.bashrc10. 实用技巧 
10.1 管道组合 
bash
# 查找占用空间最大的文件
du -ah /path | sort -rh | head -n 10
# 查找最常用的命令
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -n 10
# 实时监控日志
tail -f /var/log/syslog | grep ERROR
# 统计代码行数
find . -name "*.py" | xargs wc -l | sort -rn10.2 通配符 
bash
*       # 匹配任意字符
?       # 匹配单个字符
[abc]   # 匹配 a、b 或 c
[a-z]   # 匹配 a 到 z
[!abc]  # 匹配除 a、b、c 外的字符
# 示例
ls *.txt        # 所有 .txt 文件
ls file?.txt    # file1.txt, file2.txt 等
ls [abc]*.txt   # a、b、c 开头的 .txt 文件10.3 命令替换 
bash
# 使用反引号
echo "Today is `date`"
# 使用 $()(推荐)
echo "Today is $(date)"
# 嵌套使用
echo "Files: $(ls $(pwd))"11. 参考资料 
- https://www.gnu.org/software/bash/manual/ - Bash 官方手册
- https://explainshell.com/ - Shell 命令解释器
- https://github.com/jlevy/the-art-of-command-line - 命令行艺术
- https://devhints.io/bash - Bash 速查表