Shell编程从入门到实践:基础语法与正则表达式文本处理指南

文章目录

Shell编程与正则表达式实战指南

引言:Shell与正则表达式的强大组合

在Linux/Unix系统中,Shell作为连接用户与内核的"桥梁",既是命令解释器,也是一门强大的脚本语言。配合正则表达式这一文本处理"利器",能够大幅提升系统管理、日志分析和批量任务处理的效率。本文将带你从基础到实战,全面掌握这两项核心技能。

一、Shell编程核心技能

1. 函数:封装可复用的代码块

Shell函数是代码复用的重要工具,具有以下特点:

  • 必须在调用前定义
  • 支持参数传递(通过位置参数1, 2等)
  • 返回值只能是整数(通过$?获取)
基础函数示例
bash 复制代码
#!/bin/bash
sum(){
read -p "请输入第一数:" num1
read -p "请输入第二数:" num2
echo " 你输入的两个数:$num1 和 $num2 "
SUM=$(($num1+$num2))
echo "两个数的和为:" $SUM
}
sum


参数处理技巧
bash 复制代码
show_params() {
    echo "第一个参数: $1"
    echo "第二个参数: $2"
    echo "第十个参数: ${10}"  # 注意大括号
    echo "参数总数: $#"
    echo "所有参数: $@"
}

show_params 1 2 3 4 5 6 7 8 9 10 11


3. 函数的返回值

bash 复制代码
#!/bin/bash
getMax()
{
if [ $1 -lt $2 ]; then
   return $2
else
   return $1;
fi
}
echo "Shell程序中传递的两个参数是:$1 , $2"

getMax $1 $2

echo "最大值::$?"   # $?表示返回值

使用 ? 并不妥,因为 ?并不妥,因为 ?并不妥,因为?的范围为0-255。当比较的数字大于255时无法得到正确的结果。

2. 数组:存储多个数据的容器

Shell数组特点:

  • 一维数组,无需声明大小
  • 索引从0开始
  • 支持稀疏数组(不连续索引)
数组基本操作
bash 复制代码
files=(*.txt)  # 将当前目录所有txt文件存入数组
echo "第一个文件: ${files[0]}"
echo "文件总数: ${#files[@]}"

# 遍历数组
for file in "${files[@]}"; do
    echo "处理文件: $file"
done
关联数组(Bash 4.0+)
bash 复制代码
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 '^#'
实战案例
bash 复制代码
# 查找包含"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. 日志分析系统

bash 复制代码
#!/bin/bash

analyze_logs() {
    # 统计访问量TOP10 IP
    awk '{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. 文件批量处理工具

bash 复制代码
#!/bin/bash

batch_rename() {
    for file in *.$1; do
        mv "$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"

四、进阶学习建议

  1. 深入学习文本处理三剑客

    • sed:流编辑器,擅长文本替换
    • awk:强大的文本分析工具
    • grep:文本搜索利器
  2. 正则表达式进阶

    • 零宽断言(lookaround)
    • 反向引用
    • 复杂模式匹配(如邮箱、URL等)
  3. Shell脚本优化

    • 错误处理机制
    • 性能优化技巧
    • 模块化设计

结语

Shell编程与正则表达式是Linux系统管理的核心技能组合。通过本文的学习,你已经掌握了从基础语法到实战应用的关键知识点。建议在日常工作中多实践、多思考,将这些技能真正转化为提升效率的"得力助手"。记住,持续实践是掌握这些技能的最佳途径!

相关推荐
半梦半醒*10 天前
正则表达式
linux·运维·开发语言·正则表达式·centos·运维开发
PyHaVolask10 天前
Python进阶教程:随机数、正则表达式与异常处理
python·正则表达式·异常处理·随机数生成
神秘人X70711 天前
正则表达式笔记
正则表达式·shell·脚本
然我13 天前
前端正则面试通关指南:一篇吃透所有核心考点,轻松突围面试
前端·面试·正则表达式
Lynnxiaowen15 天前
今天继续昨天的正则表达式进行学习
linux·运维·学习·正则表达式·云计算·bash
前端世界18 天前
Python 正则表达式实战:用 Match 对象轻松解析拼接数据流
python·正则表达式·php
Edward.W19 天前
别再和正则表达式死磕了!这套AI工具集让你的开发效率翻倍⚙️[特殊字符]
人工智能·正则表达式
beijingliushao19 天前
58-正则表达式
数据库·python·mysql·正则表达式
雷达学弱狗19 天前
正则表达式,字符串的搜索与替换
正则表达式
良木林19 天前
JS中正则表达式的运用
前端·javascript·正则表达式