Shell编程从入门到实践:基础语法与正则表达式文本处理指南
文章目录
- Shell编程与正则表达式实战指南
- 引言:Shell与正则表达式的强大组合
- 一、Shell编程核心技能
- 1. 函数:封装可复用的代码块
- 基础函数示例
- 参数处理技巧
- 3. 函数的返回值
- 2. 数组:存储多个数据的容器
- 数组基本操作
- 关联数组(Bash 4.0+)
- 二、正则表达式深度解析
- 1. 正则表达式基础
- Linux正则分类
- 2. 核心元字符
- 基础元字符
- 重复次数元字符
- 3. grep工具实战
- 常用选项
- 实战案例
- 三、综合实战项目
- 1. 日志分析系统
- 2. 文件批量处理工具
- 四、进阶学习建议
- 结语
Shell编程与正则表达式实战指南
引言:Shell与正则表达式的强大组合
在Linux/Unix系统中,Shell作为连接用户与内核的"桥梁",既是命令解释器,也是一门强大的脚本语言。配合正则表达式这一文本处理"利器",能够大幅提升系统管理、日志分析和批量任务处理的效率。本文将带你从基础到实战,全面掌握这两项核心技能。
一、Shell编程核心技能
1. 函数:封装可复用的代码块
Shell函数是代码复用的重要工具,具有以下特点:
- 必须在调用前定义
- 支持参数传递(通过位置参数$1, $2等)
- 返回值只能是整数(通过$?获取)
基础函数示例
#!/bin/bash
sum(){
read -p "请输入第一数:" num1
read -p "请输入第二数:" num2
echo " 你输入的两个数:$num1 和 $num2 "
SUM=$(($num1+$num2))
echo "两个数的和为:" $SUM
}
sum
参数处理技巧
show_params() {echo "第一个参数: $1"echo "第二个参数: $2"echo "第十个参数: ${10}" # 注意大括号echo "参数总数: $#"echo "所有参数: $@"
}show_params 1 2 3 4 5 6 7 8 9 10 11
3. 函数的返回值
#!/bin/bash
getMax()
{
if [ $1 -lt $2 ]; thenreturn $2
elsereturn $1;
fi
}
echo "Shell程序中传递的两个参数是:$1 , $2"getMax $1 $2echo "最大值::$?" # $?表示返回值
使用?并不妥,因为?并不妥,因为?并不妥,因为?的范围为0-255。当比较的数字大于255时无法得到正确的结果。
2. 数组:存储多个数据的容器
Shell数组特点:
- 一维数组,无需声明大小
- 索引从0开始
- 支持稀疏数组(不连续索引)
数组基本操作
files=(*.txt) # 将当前目录所有txt文件存入数组
echo "第一个文件: ${files[0]}"
echo "文件总数: ${#files[@]}"# 遍历数组
for file in "${files[@]}"; doecho "处理文件: $file"
done
关联数组(Bash 4.0+)
declare -A colors # 声明关联数组
colors["red"]="#FF0000"
colors["green"]="#00FF00"
echo "红色代码: ${colors[red]}"
二、正则表达式深度解析
1. 正则表达式基础
正则表达式是一种描述"字符串模式"的规则,通过元字符组合实现对文本的检索、替换和过滤。
Linux正则分类
分类 | 全称 | 特点 | 支持工具 |
---|---|---|---|
BRE | 基础正则表达式 | 功能有限,部分元字符需转义 | grep, sed |
ERE | 扩展正则表达式 | 功能更强,元字符无需转义 | egrep, awk |
2. 核心元字符
基础元字符
元字符 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
. | 任意单个字符 | a.c | abc, a1c |
[] | 字符集中的一个 | [aeiou] | a, e |
^ | 行首 | ^start | 行首的start |
$ | 行尾 | end$ | 行尾的end |
重复次数元字符
元字符 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
* | 0次或多次 | ab*c | ac, abc, abbc |
+ | 1次或多次 | ab+c | abc, abbc |
? | 0次或1次 | ab?c | ac, abc |
{n} | 恰好n次 | a{3} | aaa |
3. grep工具实战
常用选项
选项 | 含义 | 示例 |
---|---|---|
-E | 启用扩展正则 | grep -E 'a+' |
-i | 忽略大小写 | grep -i 'hello' |
-o | 只输出匹配部分 | grep -o '[0-9]+' |
-v | 反向匹配 | grep -v '^#' |
实战案例
# 查找包含"error"或"warning"的行
grep -E 'error|warning' log.txt #-E 可以识别正则表达式的元字符
|表示为或# 提取邮箱地址grep -E -o '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b' emails.txt
三、综合实战项目
1. 日志分析系统
#!/bin/bashanalyze_logs() {# 统计访问量TOP10 IPawk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10# 统计HTTP状态码awk '{print $9}' access.log | sort | uniq -c# 查找错误请求awk '$9 ~ /^[45]/ {print $0}' access.log
}analyze_logs
2. 文件批量处理工具
#!/bin/bashbatch_rename() {for file in *.$1; domv "$file" "${file%.*}.$2"done
}batch_replace() {find . -type f -exec sed -i "s/$1/$2/g" {} +
}# 使用示例
# batch_rename txt md
# batch_replace "old_text" "new_text"
四、进阶学习建议
-
深入学习文本处理三剑客:
sed
:流编辑器,擅长文本替换awk
:强大的文本分析工具grep
:文本搜索利器
-
正则表达式进阶:
- 零宽断言(lookaround)
- 反向引用
- 复杂模式匹配(如邮箱、URL等)
-
Shell脚本优化:
- 错误处理机制
- 性能优化技巧
- 模块化设计
结语
Shell编程与正则表达式是Linux系统管理的核心技能组合。通过本文的学习,你已经掌握了从基础语法到实战应用的关键知识点。建议在日常工作中多实践、多思考,将这些技能真正转化为提升效率的"得力助手"。记住,持续实践是掌握这些技能的最佳途径!