一行流:系统管理速查 | One-Liners: System Administration Quick Reference
章节概述
核心理念:一行流是 Bash 的灵魂——将多个简单命令通过管道、重定向和组合技串联,用最短的代码完成复杂的系统管理任务。掌握一行流,就像掌握 C 语言的宏展开,能用一行代码解决别人十行才能搞定的问题。
第1节:常用一行流命令组合
1.1 find + exec 组合
find 配合 -exec 可以批量查找并执行操作,类似 C 语言中遍历数组后对每个元素调用函数。
# 查找并删除所有 .log 文件
find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;
# 查找大于 100MB 的文件并显示大小
find / -type f -size +100M -exec ls -lh {} \;
# 批量修改文件权限
find /srv -type f -name "*.sh" -exec chmod 755 {} \;
# 查找并替换文件内容(使用 sed)
find . -name "*.conf" -exec sed -i 's/old_value/new_value/g' {} \;
# 查找空文件并删除
find /tmp -type f -empty -delete| 参数 | 说明 | 示例 |
|---|---|---|
-name | 按名称匹配 | -name "*.txt" |
-type | 按类型过滤 | -type f(文件)/ -type d(目录) |
-size | 按大小过滤 | -size +10M |
-mtime | 按修改时间 | -mtime -7(7天内) |
-exec | 执行命令 | -exec rm {} \; |
-delete | 直接删除 | -delete |
1.2 grep + awk 组合
# 从日志中提取特定字段
grep "ERROR" /var/log/app.log | awk '{print $1, $4, $NF}'
# 统计每个 IP 的访问次数(降序)
grep "GET" access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
# 提取 CSV 第 3 列并求和
grep "sales" data.csv | awk -F',' '{sum += $3} END {print "Total:", sum}'
# 匹配并格式化输出
dmesg | grep -i "error" | awk '{printf "[%s] %s\n", $1, $0}'1.3 sed 替换与编辑
# 批量替换文件中的字符串
sed -i 's/old_text/new_text/g' file.txt
# 删除包含特定模式的行
sed -i '/^#/d' config.conf
# 在指定行后插入内容
sed -i '3a\new_line_content' file.txt
# 提取两标记之间的内容
sed -n '/START/,/END/p' file.txt
# 多行替换(跨行操作)
sed -i '/BEGIN/,/END/c\replaced content' file.txt第2节:系统管理速查
2.1 磁盘管理
# 查看磁盘使用情况(人类可读)
df -h
# 查看当前目录占用空间
du -sh *
# 查找大文件(前 10 个)
du -ah / 2>/dev/null | sort -rh | head -10
# 查看磁盘 I/O 统计
iostat -x 1 5
# 检查文件系统错误
sudo fsck /dev/sda1| 命令 | 用途 | 常用选项 |
|---|---|---|
df | 磁盘空间概览 | -h(人类可读)、-T(显示文件系统类型) |
du | 目录/文件大小 | -sh(汇总)、-a(包含文件) |
lsblk | 块设备列表 | -f(显示文件系统信息) |
fdisk | 分区管理 | -l(列出分区) |
mount | 挂载文件系统 | -o ro(只读) |
2.2 内存管理
# 查看内存使用情况
free -h
# 查看详细内存信息
cat /proc/meminfo
# 按内存使用排序进程
ps aux --sort=-%mem | head -10
# 清理页面缓存
sudo sync && echo 1 | sudo tee /proc/sys/vm/drop_caches
# 查看 swap 使用情况
swapon --show2.3 进程管理
# 查找特定进程
ps aux | grep nginx | grep -v grep
# 杀掉占用特定端口的进程
kill $(lsof -t -i:8080)
# 查看进程树
pstree -p
# 按 CPU 使用排序
ps aux --sort=-%cpu | head -10
# 查看进程打开的文件
lsof -p <PID>2.4 网络管理
# 查看监听端口
ss -tlnp
# 查看网络连接状态
ss -s
# 防火墙规则查看
sudo iptables -L -n
# 端口扫描
nmap -sT localhost
# 下载文件
wget -c https://example.com/file.tar.gz
# 网络速度测试
speedtest-cli第3节:C printf 类比
Bash 的格式化输出与 C 语言的 printf 有直接的对应关系,理解这个类比能帮助有 C 背景的开发者快速上手。
# C 语言:
# printf("Name: %s, Age: %d\n", name, age);
# Bash 等价:
name="Alice"
age=30
printf "Name: %s, Age: %d\n" "$name" "$age"
# 格式化对齐(与 C 相同)
printf "%-20s %10d %8.2f\n" "Product" "Quantity" "Price"
printf "%-20s %10d %8.2f\n" "Widget" 42 9.99
printf "%-20s %10d %8.2f\n" "Gadget" 7 149.50| C printf 格式 | Bash printf 格式 | 说明 |
|---|---|---|
%s | %s | 字符串 |
%d | %d | 整数 |
%f | %f | 浮点数 |
%x | %x | 十六进制 |
%% | %% | 转义百分号 |
%05d | %05d | 零填充整数 |
%-20s | %-20s | 左对齐字符串 |
# 生成分隔线(C 中类似 printf 的填充)
printf "%-60s\n" | tr ' ' '='
# 带颜色输出(ANSI 转义码)
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
printf "${GREEN}[OK]${NC} %s\n" "Task completed"
printf "${RED}[FAIL]${NC} %s\n" "Task failed"第4节:实战案例
4.1 日志清理脚本
#!/bin/bash
# 一键清理 7 天前的日志
find /var/log/myapp -name "*.log" -mtime +7 -exec gzip {} \;
find /var/log/myapp -name "*.gz" -mtime +30 -delete
echo "Log cleanup completed at $(date)"4.2 批量重命名
# 将所有 .jpeg 文件重命名为 .jpg
for f in *.jpeg; do mv "$f" "${f%.jpeg}.jpg"; done
# 一行流版本
ls *.jpeg | while read f; do mv "$f" "${f%.jpeg}.jpg"; done4.3 快速统计
# 统计代码行数(排除空行和注释)
find . -name "*.py" | xargs wc -l | sort -rn
# 统计当前目录文件类型分布
find . -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn