如何用Crunch生成并过滤单字符最多出现2次的8位字典?
解决Crunch字典过滤:排除字符出现超2次的条目
Crunch本身确实没有直接限制字符总出现次数的选项,你可以通过管道把Crunch的输出传给grep或者awk来完成二次过滤,下面是两种实用方法:
方法1:用grep正则快速过滤
直接用反向匹配排除存在字符出现3次及以上的条目,命令如下:
crunch 8 8 ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -d 1 | grep -vE '(.).*\1.*\1'
正则说明:
-v:反向匹配,意思是排除符合后面正则的行-E:启用扩展正则表达式,不用转义括号(.).*\1.*\1:匹配任意一个字符((.)),然后在字符串中再次出现两次(.*\1.*\1),也就是这个字符总共出现至少3次。只要字符串里有这样的字符,就会被排除。
方法2:用awk直观统计过滤
如果觉得正则不好懂,awk的方法逻辑更直白,逐个统计字符出现次数,一旦有字符超过2次就跳过:
crunch 8 8 ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -d 1 | awk '{ delete count; for(i=1; i<=length($0); i++){ c=substr($0,i,1); count[c]++; if(count[c]>2) next; } print $0 }'
逻辑说明:
- 对每一行生成的字符串,先清空统计用的数组
count - 遍历字符串的每一个字符,逐个计数
- 只要发现某个字符出现次数超过2,直接跳过当前行
- 所有字符都符合≤2次的要求,就输出这一行
两种方法都能满足你的需求,awk的写法更易读,grep的命令更简洁,你可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者zeromeia
相关产品推荐
相关产品推荐

