Appearance
Shell 与文本处理
第二讲从“会敲命令”升级到“会用命令组合解决问题”。日志分析、部署脚本、CTF 信息收集都依赖这一课。
先记住一句话:Shell 的威力不在单个命令,而在管道:前一个命令的输出,就是后一个命令的输入。
一、管道与重定向
bash
ls /var/log | head -5 # 只看前 5 行
cat access.log | grep "404" | wc -l # 统计 404 行数
grep "error" app.log > errors.txt # 覆盖写入
grep "warn" app.log >> warnings.txt # 追加写入
python app.py 2> error.log # 只看标准错误
command > out.log 2>&1 # 标准输出和错误一起写入| 符号 | 作用 |
|---|---|
| ` | ` |
> | 覆盖重定向 |
>> | 追加重定向 |
2> | 标准错误重定向 |
2>&1 | 把错误接到标准输出 |
二、文本三件套:grep / sed / awk
bash
grep -n "error" app.log # 显示行号
grep -i "timeout" app.log # 忽略大小写
grep -E "404|500" access.log # 扩展正则:匹配 404 或 500
grep -v "health" access.log # 排除匹配行
sed -n '1,20p' app.log # 只看 1~20 行
sed 's/old/new/g' app.log # 替换后输出(不改原文件)
sed -i 's/old/new/g' app.log # 直接改文件(先备份)
awk '{print $1}' access.log # 打印第一列(常见为 IP)
awk '$9 == 404 {print $1, $7}' access.log # 找 404 请求的 IP 和路径
awk '{count[$1]++} END {for (ip in count) print count[ip], ip}' access.log | sort -nr | head三、环境变量与 PATH
bash
echo $HOME
echo $PATH
export APP_ENV=dev
env | grep APP_ENVPATH 决定你敲 python、node 时系统去哪些目录找可执行文件。命令找不到时,先 which node、echo $PATH。
四、写一个最小脚本
bash
cat > check.sh <<'SH'
#!/usr/bin/env bash
set -euo pipefail
target="${1:-https://example.com}"
echo "checking $target"
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$target")
echo "http_code=$code"
if [ "$code" != "200" ]; then
echo "site is not healthy" >&2
exit 1
fi
SH
chmod +x check.sh
./check.sh https://web-basics.myxbw.cn/重点记住 set -euo pipefail:命令失败即退出、未定义变量报错、管道中任一命令失败也报错。
五、动手实验
💡 动手实验:造一份迷你访问日志,完成一次完整统计。
bash
cat > access.log <<'LOG'
192.168.1.10 - - GET /index.html 200
10.0.0.8 - - GET /admin 404
192.168.1.10 - - GET /api/login 500
10.0.0.8 - - GET /index.html 200
172.16.0.5 - - GET /admin 404
LOG
# 1. 统计总行数
wc -l access.log
# 2. 统计 404 次数
grep "404" access.log | wc -l
# 3. 找出访问次数最多的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
# 4. 列出所有非 200 请求的 IP 和路径
awk '$5 != 200 {print $1, $4}' access.log小结
- 管道把多个小命令串成解决复杂问题的流水线
- 文本处理先会
grep定位,再会awk取列统计,最后用sed替换 - 脚本开头写
set -euo pipefail,让错误尽早暴露 - 排查日志的固定顺序:
wc -l→grep→awk统计 →sort/uniq找 TopN
🧠 记忆锚点:小工具 + 管道 = Shell 编程;日志先统计,再定位,再取证。
下一讲:看系统正在发生什么——进程、端口与网络排查。