문자와 숫자의 가능한 모든 조합

문자와 숫자의 가능한 모든 조합

그래서 소문자, 대문자, 숫자의 가능한 모든 조합을 생성하여 5개의 문자열을 만들고 싶습니다.

가능성: a..z, A..Z 및 0..9.

Bash에서 이것을 수행하는 우아한 방법이 있습니까?

답변1

다음은 원하는 길이를 매개변수로 사용하는 bash 솔루션입니다(귀하의 경우에는 그렇게 합니다 permute 5).

#!/bin/bash
charset=({a..z} {A..Z} {0..9})
permute(){
  (($1 == 0)) && { echo "$2"; return; }
  for char in "${charset[@]}"
  do
    permute "$((${1} - 1 ))" "$2$char"
  done
}
permute "$1"

하지만 고통스러울 정도로 느립니다. 감히 C를 추천하나요?https://youtu.be/H4YRPdRXKFs?t=18s

#include <stdio.h>

const char* charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
char buffer[50];

void permute(int level) {
  const char* charset_ptr = charset;
  if (level == -1){
    puts(buffer);
  } else {
    while(buffer[level] = *charset_ptr++) {
      permute(level - 1);
    }
  }
}

int main(int argc, char **argv)
{
  int length;
  sscanf(argv[1], "%d", &length); 

  //Must provide length (integer < sizeof(buffer)==50) as first arg;
  //It will crash and burn otherwise  

  buffer[length] = '\0';
  permute(length - 1);
  return 0;
}

달리다:

make CFLAGS=-O3 permute && time ./permute 5 >/dev/null #about 20s on my PC

고급 언어는 무차별 대입(기본적으로 수행하는 작업)에 매우 취약합니다.

답변2

에서는 bash다음을 시도해 볼 수 있습니다.

printf "%s\n" {{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}

하지만 이 작업은 시간이 오래 걸리고 메모리를 모두 소모하게 됩니다. 다음과 같은 다른 도구를 사용하는 것이 좋습니다 perl.

perl -le '@c = ("A".."Z","a".."z",0..9);
          for $a (@c){for $b(@c){for $c(@c){for $d(@c){for $e(@c){
            print "$a$b$c$d$e"}}}}}'

이는 6 x 62 5 바이트, 즉 5,496,796,992입니다.

에서 동일한 루프를 수행할 수 있지만 bash서쪽 bash에서 가장 느린 셸이므로 몇 시간이 걸립니다.

export LC_ALL=C # seems to improve performance by about 10%
shopt -s xpg_echo # 2% gain (against my expectations)
set {a..z} {A..Z} {0..9}
for a do for b do for c do for d do for e do
  echo "$a$b$c$d$e"
done; done; done; done; done

(내 시스템의 출력 속도는 700kiB/s인 반면, 동등한 시스템의 출력 속도는 20MiB/s입니다 perl.)

답변3

crunch(적어도 Kali 배포판에서는) 사용할 수 있습니다 .

crunch 5 5 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890

답변4

Gnu Parallel을 결합할 수 있습니다.https://www.gnu.org/software/parallel/이 같은:

parallel echo ::: {a..z} {A..Z} {0..9} ::: {a..z} {A..Z} {0..9} ::: {a..z} {A..Z} {0..9} ::: {a..z} {A..Z} {0..9} ::: {a..z} {A..Z} {0..9}

관련 정보