Chinaunix

标题: 如何生成如下需求的字符? [打印本页]

作者: chsense    时间: 2014-03-05 15:25
标题: 如何生成如下需求的字符?
我需要生成各种长度的字母、数字、字符组合,每一行一个,用来做字典。

从3个字符组合开始。
可以是大写/小写字母、数字、其他键盘的上的字符。
直到12子字符的组合结束。


能否使用shell script来完成?shell 新手一枚。请大家指点。

谢谢

作者: seesea2517    时间: 2014-03-05 15:32
如下是个示例,可举一反三:
  1. [seesea@UC ~]$ echo {0..9}{a..z}
  2. 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

脚本很凶残,测试时请将基础字符范围改小点,字符串长度范围改小点,以免引起系统下身不遂:
  1. #/bin/bash
  2. #定义基础字符
  3. a='{0..9}'   #数字
  4. b='{a..z}'   #小字字母
  5. c='{A..Z}'   #大写字母
  6. d='{#,-,%}' #其它字符,自己想到什么加什么

  7. #生成字符串长度范围
  8. for (( i=3;i<=12;i++ ))
  9. do
  10.         #生成长度为i的基础字符组合列表:
  11.         for n in $(eval echo $(awk  '{for(i=0;i++<$0;)a=a"{a..d}";print a}' <<<$i))
  12.         do
  13.                 #生成所有长度为i的字符串组合:
  14.                 eval echo $(eval echo $(awk -F '' '{for(i=0;i++<NF;)a=a"$"$i;print a}' <<<$n)) |xargs -n1  >>outfile
  15.         done
  16. 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# 关阴月飞


多进程并发,提高执行效率
  1. #/bin/bash
  2. # 定义基础字符
  3. a='{0..3}'   #数字
  4. b='{a..c}'   #小字字母
  5. c='{A..Z}'   #大写字母
  6. d='{#,-,%}'  #其它字符,自己想到什么加什么

  7. Pass_Gen () {
  8.     # 生成长度为i的基础字符组合列表:
  9.     for n in $(eval echo $(awk '{for(i=0;i++<$0;)a=a"{a..d}";print a}' <<<$1)); do
  10.         eval echo $(eval echo $(awk -F '' '{for(i=0;i++<NF;)a=a"$"$i;print a}' <<<$n)) | xargs -n1
  11.     done
  12. }

  13. # 生成字符串长度范围
  14. LenMin=3
  15. LenMax=6
  16. for (( i=$LenMin;i<=$LenMax;i++ )); do
  17.     Pass_Gen $i > outfile_$i &
  18. 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写了个,效率绝对底下,慢慢跑~
  1. #!/bin/ksh
  2. #file:dict.ksh
  3. function dict_len
  4. {
  5. len=$1
  6. max=`echo "95^$len-1"|bc`
  7. min=`echo "95^2+95+1"|bc`
  8. i=$min
  9. while [ $i -le $max ]
  10. do
  11.         set -A m `echo "obase=95;$i"|bc|grep -v '00'`
  12.         if [ ${#m[@]} -ne 0 ];then
  13.                 for j in `echo ${m[@]}`
  14.                 do
  15.                         printf "\\`echo \"obase=8;$j+32\"|bc`"
  16.                 done
  17.                 printf "\n"
  18.         fi
  19. done
  20. i=`expr $i + 1`
  21. }
  22. dict_len 3
复制代码
加个高效的,如果你还能看到的话。呵呵
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int gen(int now,int* d,int len);
  4. int main(int argc,char** argv){
  5.         if(argc<=1){
  6.                 return 1;
  7.         }
  8.         int len=atoi(argv[1]);
  9.         int* d=(int*)calloc(len,sizeof(int));
  10.         gen(len,d,len);
  11.         return 0;
  12. }
  13. int gen(int now,int* d,int len){
  14.         int i,j;
  15.         for(i=33;i<127;i++){
  16.                 d[len-now]=i;
  17.                 if(now!=1){
  18.                         gen(now-1,d,len);
  19.                 }
  20.                 else{
  21.                         for(j=0;j<len;j++)
  22.                                 printf("%c",d[j]);
  23.                         printf("\n");
  24.                 }
  25.         }
  26.         return 0;
  27. }
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2