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

相关推荐
吴声子夜歌2 天前
正则指引——Ruby
开发语言·正则表达式·ruby
吴声子夜歌2 天前
正则指引——Golang
开发语言·golang·正则表达式
吴声子夜歌3 天前
正则指引——PHP
开发语言·正则表达式·php
吴声子夜歌4 天前
正则指引——断言
正则表达式
吴声子夜歌5 天前
正则指引——匹配原理
java·正则表达式
吴声子夜歌6 天前
正则表达式——环视
开发语言·正则表达式
吴声子夜歌6 天前
正则表达式——边界
正则表达式
营养充电站7 天前
C++23 新特性在 CLion 中的实战体验
macos·docker·jupyter·正则表达式
吴声子夜歌7 天前
正则表达式——字符组
正则表达式