这是《Linux 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 命令行是 Linux 的主操作界面。图形界面适合浏览和观察,命令行适合精确、重复、可审计的生产操作。本章把 Shell 提示符、参数、通配符、重定向、管道、历史命令和帮助系统讲清楚。
2.1 Shell 提示符
常见提示符:
[app@web01 ~]$
[root@db01 /var/log]#
含义:
| 符号 | 含义 |
|---|---|
app / root |
当前用户 |
web01 / db01 |
主机名 |
~ |
当前用户家目录 |
/var/log |
当前目录 |
$ |
普通用户 |
# |
root 用户 |
确认环境:
whoami
hostname
pwd
echo "$SHELL"
bash --version
生产操作前先确认主机名和用户,避免在错误机器上执行变更。
2.2 命令格式
command [options] [arguments]
示例:
ls
ls -l
ls -lah /var/log
tar -czf app.tar.gz /opt/app
短选项可以合并:
ls -l -a -h
ls -lah
长选项通常不能随意合并:
docker ps --all
df --human-readable
大小写敏感:
ls
LS
后一个命令通常会报 command not found。
2.3 常用命令
目录与位置:
pwd
cd /var/log
cd ~
cd -
cd ..
ls
ls -lah
tree -L 2 /opt
文件查看:
cat app.conf
less /var/log/syslog
head -n 50 app.log
tail -n 50 app.log
tail -f app.log
wc -l app.log
stat app.log
file app.bin
时间与系统:
date
date -u
uptime
uname -a
cat /etc/os-release
free -h
df -hT
tail -f 适合观察追加日志。查看轮转后的新文件可用:
tail -F app.log
2.4 通配符与路径
绝对路径从 / 开始,相对路径从当前目录开始。
/etc/nginx/nginx.conf 绝对路径
./conf/nginx.conf 当前目录
../shared/config.yml 上一级目录
~/deploy.sh 当前用户家目录
常用通配符:
| 符号 | 含义 | 示例 |
|---|---|---|
* |
任意长度字符 | *.log |
? |
一个字符 | app?.conf |
[abc] |
一个指定字符 | app[12].log |
{a,b} |
多个候选 | app.{conf,yml} |
示例:
ls /var/log/*.log
ls *.conf
cp app.{conf,bak}
rm app-2026-0[1-3].log
危险命令必须先预览展开结果:
echo /var/log/*.log
ls /data/backup/*
涉及删除时,不要把未确认的变量直接拼进命令。
2.5 引号与转义
user=app
echo $user
echo "$user"
echo '$user'
echo "PATH=$PATH"
echo "name\tvalue"
区别:
| 写法 | 行为 |
|---|---|
$user |
变量替换 |
"$user" |
变量替换,保留参数边界 |
'$user' |
不替换 |
\$user |
转义 $ |
`cmd` |
命令替换,旧写法 |
$(cmd) |
命令替换,推荐 |
推荐:
today=$(date +%F)
echo "backup-$today.tar.gz"
包含空格的路径必须加引号:
cp "my config.yml" /tmp/
find /opt -name '*.log'
2.6 重定向
标准输入、输出和错误:
| 描述符 | 名称 | 数字 |
|---|---|---|
| stdin | 标准输入 | 0 |
| stdout | 标准输出 | 1 |
| stderr | 标准错误 | 2 |
输出:
command > out.log
command >> append.log
command 2> error.log
command > all.log 2>&1
command &> all.log
bash 支持 &>。跨 Shell 脚本更推荐下面的写法:
command > all.log 2>&1
丢弃输出:
command > /dev/null
command > /dev/null 2>&1
输入:
mysql < schema.sql
sha256sum app.tar.gz < checksum.txt
Here Document:
cat <<'EOF'
server:
port: 8080
EOF
带引号的 EOF 不做变量替换,适合写配置模板。
2.7 管道
管道把前一个命令的标准输出接到后一个命令的标准输入:
ps aux | grep java | grep -v grep
常用管道:
cat access.log | wc -l
ps aux | sort -nrk 3 | head
du -sh /var/log/* | sort -h
journalctl -u nginx --since today | tail -100
错误流不会自动进入管道:
command 2>&1 | grep ERROR
查看大文件时优先用 less,避免把数十万行刷到终端。
2.8 查找与过滤
grep:
grep ERROR app.log
grep -n ERROR app.log
grep -i error app.log
grep -v DEBUG app.log
grep -r "listen 80" /etc/nginx
grep -E 'ERROR|WARN' app.log
grep -c ERROR app.log
常用选项:
| 选项 | 含义 |
|---|---|
-i |
忽略大小写 |
-n |
显示行号 |
-v |
反向匹配 |
-r |
递归目录 |
-E |
扩展正则 |
-c |
统计匹配行 |
-F |
按字面字符串匹配 |
-A/-B/-C |
显示后、前、上下文 |
查找文件:
find /etc -name '*.conf'
find /var/log -type f -name '*.gz'
find /data -type f -size +100M
find /opt/app -type f -mmin -30
find /tmp -type f -delete
删除动作要分两步执行:
find /tmp -type f -name '*.tmp' -print
find /tmp -type f -name '*.tmp' -delete
2.9 历史与补全
历史命令:
history
history | tail -20
!$
!!
Ctrl+R
常用快捷键:
| 快捷键 | 作用 |
|---|---|
Ctrl+C |
终止前台命令 |
Ctrl+D |
结束输入或退出 Shell |
Ctrl+R |
搜索历史 |
Ctrl+A |
到行首 |
Ctrl+E |
到行尾 |
Ctrl+U |
删除到行首 |
Ctrl+K |
删除到行尾 |
Ctrl+L |
清屏 |
Tab |
补全 |
历史命令是审计线索,也可能包含敏感参数。不要把密码直接写在命令行里。
2.10 获取帮助
ls --help
man ls
info coreutils
type cd
which nginx
whereis nginx
alias
man 常用章节:
| 章节 | 内容 |
|---|---|
| 1 | 用户命令 |
| 5 | 配置文件格式 |
| 8 | 管理命令 |
示例:
man 5 crontab
man 8 systemctl
不同发行版的命令行为可能不同。生产执行前,应以当前系统的 man、--help 和官方文档为准。
2.11 生产操作习惯
变更前:
1. 确认主机、用户、目录
2. 备份目标文件
3. 预览通配符展开结果
4. 确认命令作用范围
5. 准备回滚命令
变更中:
1. 只做计划内操作
2. 保留终端输出
3. 记录时间戳
4. 出现异常立即停止
变更后:
1. 检查配置语法
2. 检查进程和端口
3. 观察日志
4. 验证业务指标
5. 更新工单记录
备份配置:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%F-%H%M)
本章小结
命令行操作的核心是理解命令、选项、参数、路径、引号、重定向和管道。通配符和变量让操作高效,也让风险放大;生产变更前先预览展开结果,并保留备份与回滚方案。遇到不熟悉的命令,优先查看当前系统的帮助文档。
思考题
>和>>的区别是什么?- 为什么
command > log 2>&1不能写成command 2>&1 > log的等价形式? - 单引号和双引号对变量替换有什么区别?
- 如何安全执行
find ... -delete? - 设计一条管道统计 Nginx 访问日志中出现次数最多的前 10 个客户端 IP。