You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计字符串中子串出现次数?含Bash环境下的实现需求示例

嘿,我来帮你解决这个统计子串出现次数的问题!下面针对Bash环境给你两种实用的方法,还会结合你的示例来演示~

在Bash中统计字符串中子串的出现次数

方法1:使用grep + wc(直观易读,适合大多数场景)

这个方法的核心是用grep -o选项——它会把每个匹配到的子串单独输出一行,再用wc -l统计行数,行数就是子串的出现次数。

针对你的示例操作:

先把目标字符串存入变量(方便后续重复使用,也可以直接从文件或其他命令的输出读取):

target_str="0: asus-wlan: Wireless LAN Soft blocked: no Hard blocked: no 1: asus-bluetooth: Bluetooth Soft blocked: no Hard blocked: no 2: phy0: Wireless LAN Soft blocked: no Hard blocked: no 113: hci0: Bluetooth Soft blocked: no Hard blocked: no"

接着执行统计命令:

echo "$target_str" | grep -o "Bluetooth Soft blocked: no Hard blocked: no" | wc -l

执行后会输出2,也就是你的目标子串在示例字符串里一共出现了2次。

方法2:纯Bash内置操作(无外部命令,效率更高)

如果不想调用外部工具,可以利用Bash的字符串替换特性,通过计算长度差来得到次数:

# 定义要查找的子串和目标字符串
substr="Bluetooth Soft blocked: no Hard blocked: no"
target_str="0: asus-wlan: Wireless LAN Soft blocked: no Hard blocked: no 1: asus-bluetooth: Bluetooth Soft blocked: no Hard blocked: no 2: phy0: Wireless LAN Soft blocked: no Hard blocked: no 113: hci0: Bluetooth Soft blocked: no Hard blocked: no"

# 核心计算逻辑:(原字符串长度 - 替换所有子串为空后的长度) ÷ 子串长度
count=$(( (${#target_str} - ${#target_str//$substr/}) / ${#substr} ))
echo $count

运行这段代码同样会输出2,而且全程只用Bash内置功能,速度更快。

为什么你之前用sed/grep可能没成功?

如果之前直接用grep没加-o选项,它只会输出包含子串的整行——但你的输入是单个长字符串,所以只会返回1行,统计行数得到的结果自然不对;而sed默认按行处理,若没配合合适的计数逻辑,也很难直接得到准确的出现次数。上面的两种方法都能精准解决这个问题哦~

内容的提问来源于stack exchange,提问作者Eduardo Lúcio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:45:49