一行流:系统管理速查 | 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 --show

2.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"; done

4.3 快速统计

# 统计代码行数(排除空行和注释)
find . -name "*.py" | xargs wc -l | sort -rn
 
# 统计当前目录文件类型分布
find . -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn