Linux截取字符串推荐使用Bash参数扩展${var:offset:length},索引从0开始;cut -c按字符位置(1起始)但macOS不支持;awk substr()跨平台且UTF-8安全。

Linux 中截取字符串指定位置的子串,主要靠 Shell 参数扩展(Parameter Expansion)和内置命令(如 cut、sed、awk),不需要调用外部工具也能高效完成。
用 ${var:offset:length} 直接截取(推荐)
这是 Bash/Zsh 原生支持的方式,语法简洁、性能好、无需启动新进程:
-
${str:2:5}:从第 2 个字符开始(索引从 0 起),取 5 个字符(注意:不是“到第 5 位”) -
${str: -3}:从末尾倒数第 3 个字符起,取到结尾(前面空格不能省) -
${str: -4:2}:从倒数第 4 个字符起,取 2 个字符 - 若省略
length(如${str:3}),则从第 3 位截取到末尾
示例:
str="hello world"
echo ${str:0:5} # 输出:hello
echo ${str:6:5} # 输出:world
echo ${str: -5:3} # 输出:"wor"(注意空格)用 cut 按字节或字符位置截取
cut 默认按字节(byte)处理,对英文安全;若含中文等 UTF-8 多字节字符,需加 -n 选项配合 -b 才能按字符(而非字节)切分:
-
echo "$str" | cut -c 2-6:按字符位置,取第 2 到第 6 个字符(1-indexed) -
echo "$str" | cut -c 7-:从第 7 个字符到结尾 -
echo "$str" | cut -c -5:前 5 个字符 - ⚠️ 注意:
-c在大多数 GNU 系统可用;BSD/macOS 的cut不支持-c,需改用awk或sed
用 awk 按位置提取(跨平台兼容性好)
awk 的 substr() 函数语义清晰,且统一按字符计数(UTF-8 安全),适合脚本中稳定使用:
-
echo "$str" | awk '{print substr($0, 1, 5)}':从第 1 字符起取 5 个(1-indexed) -
echo "$str" | awk '{print substr($0, 7)}':从第 7 字符到结尾 -
echo "$str" | awk '{print substr($0, length($0)-3+1, 3)}':取倒数 3 个字符
小提醒:索引差异要留心
不同工具索引起点不同,容易出错:
- Bash
${var:off:len}:偏移量off从 0 开始 -
cut -c和awk substr():起始位置从 1 开始 - 负数偏移只在 Bash 扩展中有效,
cut和awk不支持直接负数索引 - 处理中文、emoji 等时,优先选
awk或 Bash(Zsh 同样支持 UTF-8 字符截取)


















