Shell脚本应遵循“输入→判断→操作→输出”主线,支持文件、目录、管道等输入方式,用grep/sed/awk分工处理,辅以参数校验、文件检查、临时文件保护和错误捕获,并封装为可复用函数提升鲁棒性与可维护性。

写一个能自动处理文本文件的 Shell 脚本,核心不是堆命令,而是理清“输入 → 判断 → 操作 → 输出”这条主线。关键在于让脚本能适应不同场景,而不是写死某一种格式。
明确处理目标和输入来源
先想清楚:你要处理什么?是日志过滤、配置提取、批量重命名,还是字段清洗?目标定了,输入也就明确了——可能是单个文件、多个文件、目录下所有匹配文件,甚至标准输入(比如管道传来的数据)。常用方式有:
- 直接传参:
./process.sh file1.txt file2.log - 用
find动态获取:find /var/log -name "*.log" -mtime -1 - 支持管道:
cat data.csv | ./process.sh(此时需检查[ -t 0 ]判断是否为终端输入)
用 grep/sed/awk 组合完成核心文本操作
三者分工清晰,组合使用效率最高:
-
grep 负责“找”:筛选行(
^Error)、排除干扰(-v "DEBUG")、加行号(-n)或上下文(-A 2) -
sed 负责“改”:替换字段(
s/old/new/g)、删空行(/^$/d)、插入标记(3i\# HEADER),加-i可直接修改原文件 -
awk 负责“算”和“分”:按列取值(
$3 ~ /202[4-6]/ {print $1,$3})、统计频次({count[$1]++} END{for (i in count) print i, count[i]})、条件拼接($2 > 100 {print "ALERT:", $0})
加入可控逻辑提升鲁棒性
自动化脚本怕的不是功能弱,而是出错后静默失败或误操作。必须包含:
- 参数校验:
if [ $# -eq 0 ]; then echo "Usage: $0 <file>"; exit 1; fi</file> - 文件存在检查:
[ -f "$1" ] || { echo "File not found: $1"; exit 1; } - 临时文件保护:
tmpfile=$(mktemp),处理完再mv "$tmpfile" "$1"或用trap 'rm -f $tmpfile' EXIT - 错误捕获:
set -e让任意命令失败即退出,或用|| { echo "Step failed"; exit 1; }
封装成可复用的小模块
别把所有逻辑塞进一个脚本。把通用操作拆成函数,比如:
extract_ip() { grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' "$1"; }backup_file() { cp "$1" "$1.$(date +%Y%m%d_%H%M%S)"; }log_step() { echo "[$(date +'%T')] $1" >&2; }
这样主流程就变成:log_step "Start"; backup_file "$file"; extract_ip "$file" > result.txt; log_step "Done",清晰且易维护。


















