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

如何用Bash统计characteristic与exit间value的出现次数

统计characteristic块内"value"出现次数的Bash实现方案

嘿,我有两个简洁的方案帮你搞定这个需求,不用写一堆do while或者if语句,完全用Bash工具链就能实现:

先明确需求

你的输入是一串连续的配置文本,每个characteristic到exit是一个独立块,要统计每个块里value单词的出现次数,最终输出空格分隔的数字结果。

比如输入:

characteristic "type" value "A" value "B" value "C" default-value "B" exit characteristic "active" value "no" value "yes" default-value "no" exit characteristic "traffic" value "disabled" value "enabled" default-value "enabled" exit characteristic "quota" value "enabled" default-value "disabled" exit characteristic "redirect" value "disabled" value "enabled" default-value "disabled" exit 

期望输出:

3 2 2 1 2

方案一:用awk处理(推荐,高效简洁)

awk天生适合处理这种结构化文本,一行命令就能搞定:

awk '{
    for (i=1; i<=NF; i++) {
        if ($i == "characteristic") count=0;
        else if ($i == "value") count++;
        else if ($i == "exit") printf "%d ", count;
    }
    print ""
}' your_config.txt

原理说明:

  • 遍历每行的每个字段(NF代表当前行的总字段数)
  • 碰到characteristic就重置计数器count为0
  • 每遇到一个value就把计数器加1
  • 碰到exit就输出当前的计数,加个空格分隔
  • 最后换行保证输出格式整齐

方案二:sed+grep组合实现

如果你更习惯用sed和grep,也可以这样拆分处理:

sed 's/exit /\n/g' your_config.txt | grep -v '^$' | while read block; do
    echo "$block" | grep -o "value" | wc -l
done | tr '\n' ' ' && echo

原理说明:

  1. sed 's/exit /\n/g':把每个exit 替换成换行符,把原本连在一起的块拆分成单独的行
  2. grep -v '^$':过滤掉拆分后可能出现的空行
  3. 循环读取每个块,用grep -o "value"提取所有独立的value单词,再用wc -l统计数量
  4. tr '\n' ' ':把每行的计数转换成空格分隔的格式,最后echo补个换行

这两个方案都避免了复杂的循环和条件判断,完全符合你的要求,选哪个看你个人习惯~

内容的提问来源于stack exchange,提问作者Mauro M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:44:58