如何用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
原理说明:
sed 's/exit /\n/g':把每个exit替换成换行符,把原本连在一起的块拆分成单独的行grep -v '^$':过滤掉拆分后可能出现的空行- 循环读取每个块,用
grep -o "value"提取所有独立的value单词,再用wc -l统计数量 tr '\n' ' ':把每行的计数转换成空格分隔的格式,最后echo补个换行
这两个方案都避免了复杂的循环和条件判断,完全符合你的要求,选哪个看你个人习惯~
内容的提问来源于stack exchange,提问作者Mauro M
相关产品推荐
相关产品推荐

