Chinaunix
标题:
如何生成如下需求的字符?
[打印本页]
作者:
chsense
时间:
2014-03-05 15:25
标题:
如何生成如下需求的字符?
我需要生成各种长度的字母、数字、字符组合,每一行一个,用来做字典。
从3个字符组合开始。
可以是大写/小写字母、数字、其他键盘的上的字符。
直到12子字符的组合结束。
能否使用shell script来完成?shell 新手一枚。请大家指点。
谢谢
作者:
seesea2517
时间:
2014-03-05 15:32
如下是个示例,可举一反三:
[seesea@UC ~]$ echo {0..9}{a..z}
0a 0b 0c 0d 0e 0f 0g 0h 0i 0j 0k 0l 0m 0n 0o 0p 0q 0r 0s 0t 0u 0v 0w 0x 0y 0z 1a 1b 1c 1d 1e 1f 1g 1h 1i 1j 1k 1l 1m 1n 1o 1p 1q 1r 1s 1t 1u 1v 1w 1x 1y 1z 2a 2b 2c 2d 2e 2f 2g 2h 2i 2j 2k 2l 2m 2n 2o 2p 2q 2r 2s 2t 2u 2v 2w 2x 2y 2z 3a 3b 3c 3d 3e 3f 3g 3h 3i 3j 3k 3l 3m 3n 3o 3p 3q 3r 3s 3t 3u 3v 3w 3x 3y 3z 4a 4b 4c 4d 4e 4f 4g 4h 4i 4j 4k 4l 4m 4n 4o 4p 4q 4r 4s 4t 4u 4v 4w 4x 4y 4z 5a 5b 5c 5d 5e 5f 5g 5h 5i 5j 5k 5l 5m 5n 5o 5p 5q 5r 5s 5t 5u 5v 5w 5x 5y 5z 6a 6b 6c 6d 6e 6f 6g 6h 6i 6j 6k 6l 6m 6n 6o 6p 6q 6r 6s 6t 6u 6v 6w 6x 6y 6z 7a 7b 7c 7d 7e 7f 7g 7h 7i 7j 7k 7l 7m 7n 7o 7p 7q 7r 7s 7t 7u 7v 7w 7x 7y 7z 8a 8b 8c 8d 8e 8f 8g 8h 8i 8j 8k 8l 8m 8n 8o 8p 8q 8r 8s 8t 8u 8v 8w 8x 8y 8z 9a 9b 9c 9d 9e 9f 9g 9h 9i 9j 9k 9l 9m 9n 9o 9p 9q 9r 9s 9t 9u 9v 9w 9x 9y 9z
复制代码
作者:
q1208c
时间:
2014-03-05 15:42
这是要破人家密码的节奏么?
作者:
Herowinter
时间:
2014-03-05 15:46
回复
3#
q1208c
这个好像是最合理的猜想了。
作者:
yestreenstars
时间:
2014-03-05 15:56
目测LZ在生成字典~
作者:
chsense
时间:
2014-03-05 15:56
本帖最后由 chsense 于 2014-03-05 15:59 编辑
回复
2#
seesea2517
很好的示范。
但是,这样一来,是不是只考虑到了排列,没有组合?字母也许在数字之前呢? 如何解?感谢
看来是要好好学习一下正则表达式 。
作者:
chsense
时间:
2014-03-05 16:01
q1208c 发表于 2014-03-05 15:42
这是要破人家密码的节奏么?
你的可用积分就是这样弄来的?
我正在学习正则表达式。
作者:
q1208c
时间:
2014-03-05 16:07
回复
7#
chsense
在我看过的正则表达式的书中, 从来没见过这样的需求, 当然, 我看的书真的不多.
我积分是怎么来的, 我也不知道, 有时候会突然多出来, 有时候也会突然少下去.
对你要生成的 内容, 你已经说得很清楚了, "字典". 而这种随机生成的字母数字的组合, 并且还有长度需求, 是 破解密码的 字典 的标准.
除了这个, 我想不到 还有 其它的 "字典".
如果你有关于这样的"正则"的"字典"的书, 请写出书名, 我也正好要学一下正则. 谢谢!!
作者:
seesea2517
时间:
2014-03-05 16:19
回复
5#
yestreenstars
鄙视啊,人家都写了字典在上面了,还要测。哈哈。
作者:
yestreenstars
时间:
2014-03-05 16:20
回复
9#
seesea2517
好吧,请叫我瞎子~
作者:
关阴月飞
时间:
2014-03-05 16:21
回复
1#
chsense
脚本很凶残,测试时请将基础字符范围改小点,字符串长度范围改小点,以免引起系统下身不遂:
#/bin/bash
#定义基础字符
a='{0..9}' #数字
b='{a..z}' #小字字母
c='{A..Z}' #大写字母
d='{#,-,%}' #其它字符,自己想到什么加什么
#生成字符串长度范围
for (( i=3;i<=12;i++ ))
do
#生成长度为i的基础字符组合列表:
for n in $(eval echo $(awk '{for(i=0;i++<$0;)a=a"{a..d}";print a}' <<<$i))
do
#生成所有长度为i的字符串组合:
eval echo $(eval echo $(awk -F '' '{for(i=0;i++<NF;)a=a"$"$i;print a}' <<<$n)) |xargs -n1 >>outfile
done
done
复制代码
作者:
seesea2517
时间:
2014-03-05 16:22
回复
8#
q1208c
其实楼主也不用急。如果是练习其实也不错啦,找一个现实的项目来实践是进步最快的方法。另外字典也有时候是自己需要,比如我很早期自己加密的一个rar文档忘记密码了,我就需要把它破解了。
字典其实有现成的生成程序下载或文本下载,要做也不需要自己弄了,搜索都有。
作者:
seesea2517
时间:
2014-03-05 16:23
回复
10#
yestreenstars
这可不能叫,常在江边走哪能不湿鞋子,你经常目测,难免看走眼啊,哈哈。
作者:
yestreenstars
时间:
2014-03-05 16:29
回复
11#
关阴月飞
跑了10分钟还没跑完,果然好凶残,我感觉的我电脑要死机了~
作者:
chsense
时间:
2014-03-05 16:30
本帖最后由 chsense 于 2014-03-05 16:31 编辑
回复
11#
关阴月飞
很实在的指点、帮助。 远比那些只说不行动的大佬令人佩服!主要是我还没到那个熟练程度,人家一说,我就会。
谢谢你。
作者:
Herowinter
时间:
2014-03-05 16:32
回复
14#
yestreenstars
目测了一下脚本,感觉太凶残,
对自己的电脑没信心,没敢跑。
作者:
关阴月飞
时间:
2014-03-05 16:36
回复
15#
chsense
shell版的兄弟们都是很热心的,偶尔也会调皮一下,都是为了活跃活跃气氛, 楼主别太认真了....
作者:
关阴月飞
时间:
2014-03-05 16:38
回复
14#
yestreenstars
目测是个不听话的孩子,都说要把范围改小一点再试了......
作者:
chsense
时间:
2014-03-05 16:40
回复
17#
关阴月飞
shell script 基本为零基础, 言语不严谨,让人不爽了呗。
我长记性了。
加油
作者:
rogantianwz
时间:
2014-03-05 16:50
回复
10#
yestreenstars
目测没有人给个牛掰的答案啊
@seesea2517
作者:
yestreenstars
时间:
2014-03-05 16:53
回复
20#
rogantianwz
11楼不就有了吗?
作者:
rogantianwz
时间:
2014-03-05 16:55
回复
21#
yestreenstars
还在第一页的时候打开的页面,溜达一圈再回复,猛然发现第二页已经回复了,目测此贴会火
作者:
seesea2517
时间:
2014-03-05 17:07
rogantianwz 发表于 2014-03-05 16:55
回复 21# yestreenstars
够火啦,三页了都。哈。
作者:
Shell_HAT
时间:
2014-03-06 09:26
回复
11#
关阴月飞
多进程并发,提高执行效率
#/bin/bash
# 定义基础字符
a='{0..3}' #数字
b='{a..c}' #小字字母
c='{A..Z}' #大写字母
d='{#,-,%}' #其它字符,自己想到什么加什么
Pass_Gen () {
# 生成长度为i的基础字符组合列表:
for n in $(eval echo $(awk '{for(i=0;i++<$0;)a=a"{a..d}";print a}' <<<$1)); do
eval echo $(eval echo $(awk -F '' '{for(i=0;i++<NF;)a=a"$"$i;print a}' <<<$n)) | xargs -n1
done
}
# 生成字符串长度范围
LenMin=3
LenMax=6
for (( i=$LenMin;i<=$LenMax;i++ )); do
Pass_Gen $i > outfile_$i &
done
复制代码
作者:
关阴月飞
时间:
2014-03-06 09:39
回复
24#
Shell_HAT
牛,学习了,不过脚本依然很凶残,基础字符多一点,字符串长度大一点,就不敢测试了
作者:
Shell_HAT
时间:
2014-03-06 10:28
回复
25#
关阴月飞
10个数字 + 26个小写字母 + 26个大写字母 + 32个标点符号 = 94个字符
仅考虑12位字符的排列组合:
P(94,12) = 2.2874374023610194e+23
不知道楼主从哪里搞到如此大的硬盘?
作者:
关阴月飞
时间:
2014-03-06 10:32
回复
26#
Shell_HAT
我就想到了双色球的组合数,这概念想都不敢想
作者:
runintostar
时间:
2014-03-06 12:56
本帖最后由 runintostar 于 2014-03-06 16:18 编辑
ksh写了个,效率绝对底下,慢慢跑~
#!/bin/ksh
#file:dict.ksh
function dict_len
{
len=$1
max=`echo "95^$len-1"|bc`
min=`echo "95^2+95+1"|bc`
i=$min
while [ $i -le $max ]
do
set -A m `echo "obase=95;$i"|bc|grep -v '00'`
if [ ${#m[@]} -ne 0 ];then
for j in `echo ${m[@]}`
do
printf "\\`echo \"obase=8;$j+32\"|bc`"
done
printf "\n"
fi
done
i=`expr $i + 1`
}
dict_len 3
复制代码
加个高效的,如果你还能看到的话。呵呵
#include <stdio.h>
#include <stdlib.h>
int gen(int now,int* d,int len);
int main(int argc,char** argv){
if(argc<=1){
return 1;
}
int len=atoi(argv[1]);
int* d=(int*)calloc(len,sizeof(int));
gen(len,d,len);
return 0;
}
int gen(int now,int* d,int len){
int i,j;
for(i=33;i<127;i++){
d[len-now]=i;
if(now!=1){
gen(now-1,d,len);
}
else{
for(j=0;j<len;j++)
printf("%c",d[j]);
printf("\n");
}
}
return 0;
}
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2