如何统计字符串中子串出现次数?含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
相关产品推荐
相关产品推荐

