shell 字符串截取(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言:为何要掌握 shell 字符串截取?

在 shell 脚本开发与日常命令行操作中,字符串处理是一个高频需求。无论是解析配置文件、处理日志数据,还是从复杂路径中提取关键信息,字符串截取技术都扮演着核心角色。掌握 shell 字符串截取方法,不仅能提升工作效率,更能帮助开发者构建更健壮的自动化流程。本文将系统性地介绍这一主题,从基础语法到高级技巧,逐步揭开 shell 字符串截取的奥秘。


基础语法:字符串操作的底层逻辑

在深入具体命令之前,需要先理解 shell 字符串的基本特性。字符串在 shell 中通常以变量形式存储,例如:

text="Hello World! This is a sample string."
echo ${#text}  # 输出字符串长度 29

关键概念解析

  • 字符串索引:从左到右,字符索引从 0 开始(如 H 是索引 0,e 是索引 1)
  • 负数索引:从右到左计算,-1 表示最后一个字符(如 g 是索引 -1)
  • 子字符串:通过起始位置和长度定义的字符串片段

常用命令详解:工具链全景图

1. cut 命令:基于分隔符的简单截取

cut 是处理结构化文本的利器,适合按固定分隔符分割字段:

echo "apple,banana,cherry" | cut -d ',' -f2  # 输出 "banana"

参数说明

  • -d 指定分隔符(默认为制表符)
  • -f 选择字段范围(如 1-3 表示前三个字段)

扩展技巧: 通过 tr 命令转换分隔符,可处理复杂格式:

echo "100;200;300" | cut -d ';' -f1 | tr -d ' '  # 去除空格后输出 "100"

2. awk 命令:灵活的文本处理专家

awk 提供了更强大的字段操作能力,支持动态计算:

echo "192.168.1.1 GET /index.html" | awk '{print $1}'  # 输出 "192.168.1.1"

进阶用法

  • substr 函数实现精确截取:
    echo "2023-10-05" | awk '{print substr($0,1,4)}'  # 输出年份 "2023"
    

3. sed 命令:正则表达式的力量

sed 的流编辑功能使其擅长基于正则表达式处理文本:

echo "/var/log/messages" | sed 's#.*/##'  # 输出 "messages"

正则技巧

  • ^ 匹配开头,$ 匹配结尾
  • 使用 .* 捕获任意字符:
    echo "username=john.doe@example.com" | sed 's/.*=\(.*\)/\1/'  # 提取邮箱 "john.doe@example.com"
    

4. 参数扩展:shell 内置的轻量级方案

通过 ${parameter} 语法实现无外部命令的字符串操作:

基础语法格式:

参数形式说明
${var:offset}从 offset 开始到结尾
${var:offset:length}截取 offset 开始的 length 字符
${var#pattern}删除最短前缀匹配
${var##pattern}删除最长前缀匹配
${var%pattern}删除最短后缀匹配
${var%%pattern}删除最长后缀匹配

典型应用场景:

path="/usr/local/bin/python3"

echo ${path##*/}  # 输出 "python3"

echo ${path%/*}   # 输出 "/usr/local/bin"

str="abcdefghijk"
echo ${str:1:-1}  # 从索引1到倒数第二个字符,输出 "bcdefghij"

高级技巧:组合与优化策略

1. 管道串联提升处理能力

通过组合多个命令实现复杂需求:

cat access.log | cut -d '[' -f2 | cut -d ']' -f1 | head -n1

2. 正则表达式增强灵活性

sedawk 中使用正向/反向断言:

echo "v2.4.7" | sed -E 's/v([0-9]+)\..*/\1/'  # 输出 "2"

3. 环境变量动态处理

结合变量实现动态截取:

length=${#text}
echo ${text:0:$length-5}  # 截取除最后5个字符外的所有内容

实战案例:真实场景解析

案例 1:解析 Docker 容器 ID

需求:从 docker ps 输出中提取容器短 ID 的前 12 位。

解决方案

docker ps | awk 'NR>1 {print substr($1,0,12)}'
id=$(docker ps | awk 'NR>1 {print $1}')
echo ${id:0:12}

案例 2:处理 CSV 文件中的特殊字符

需求:从包含逗号的字段中安全提取内容:

"John Doe","developer, engineer",50000

处理命令

cat data.csv | awk -F',' 'BEGIN{OFS=","} {gsub(/"/,"",$2); print $2}' 

总结与建议

通过本文的讲解,我们系统掌握了 shell 字符串截取的四大工具链(cutawksed、参数扩展)以及进阶技巧。选择合适的方法需考虑以下维度:

  • 简单结构化数据:优先使用 cut
  • 复杂模式匹配:结合 awksed
  • 轻量级需求:直接使用参数扩展

建议读者通过以下步骤实践:

  1. 从基础命令开始,逐步尝试组合
  2. 使用 echo 测试短字符串
  3. 逐步过渡到真实数据集
  4. 记录常用命令片段到代码库

掌握 shell 字符串截取不仅是一项技术能力,更是提升命令行效率的关键。通过持续练习,开发者能够构建出更优雅、健壮的自动化解决方案。

最新发布