Möchten Sie sich auf ASCII oder die lateinische Schrift beschränken? Was ist mit Diakritika wie Akzenten (é, ...)?
Stéphane Chazelas
Vielen Dank für das Follow-up. Aktualisierter Originalbeitrag zur Klarstellung.
Freitag,
Ist es wirklich braucht in bash zu sein? Kann eine Sprache wie Perl oder awk?
terdon
1
Dann rufen Sie doch einfach Perl oder Python aus der Bash heraus an. Besonders bei perlist es sehr einfach, es als Einzeiler zu verwenden.
terdon
2
Versuchen Sie zu lernen oder wollen Sie nur das Ergebnis? Im zweiten Fall gibt es viele Programme, die die Arbeit erledigen, wie John the Ripper ( john) und dergleichen, die Ihnen viele Möglichkeiten bieten.
YoMismo
Antworten:
13
Hier ist eine Bash-Lösung, die die gewünschte Länge als Parameter verwendet (was Sie permute 5in Ihrem Fall tun würden):
#include <stdio.h>//global variables and magic numbers are the basis of good programming
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);return0;}
Starte es:
make CFLAGS=-O3 permute && time ./permute 5>/dev/null #about 20s on my PC
Hochrangige Sprachen lügen am brachialen Treiben (was im Grunde das ist, was Sie tun).
@Stéphane Chazelas Vielen Dank für die Bearbeitung. Ich habe schmutzig geschrieben und "richtige" Zitate ignoriert, da sie in diesem Fall nicht benötigt werden, aber ich bin sehr dankbar für die Abkürzungen!
PSkocik
Ich habe deine bashLösung ausprobiert . Es ist sehr nett; Ich mag es sehr. Es hat ungefähr 24 Stunden lang gut funktioniert, bevor ich bemerkte, dass mein System vollständig gesperrt war. Versuchte etwas Ähnliches mit `Python; mit einem ähnlichen Ergebnis, obwohl es wesentlich schneller war.
Achtung, das sind 6 x 62 5 Bytes, also 5.496.796.992.
Sie können die gleiche Schleife in machen bash, aber bashals langsamste Muschel im Westen wird das Stunden dauern:
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 dofor b dofor c dofor d dofor e do
echo "$a$b$c$d$e"done;done;done;done;done
(Auf meinem System werden 700 kB / s ausgegeben, im Gegensatz zu 20 MB / s mit dem perlÄquivalent).
Ich bin auch der Meinung, dass es die Antwort ergänzen würde, wenn Sie eine Möglichkeit hinzufügen würden, sie in eine Datei auszugeben. Vielleicht, weil es generiert wird, um Ihren RAM nicht zu zerstören, oder nachdem alles im RAM zwischengespeichert wurde
Hellreaver
2
@Hellreaver, sie alle schreiben in eine Datei (nach stdout, welche Datei auch immer geöffnet ist; wenn sie in einem Terminal ausgeführt wird, wie eine Gerätedatei /dev/pts/something; und Sie können dies mit dem Shell-Umleitungsoperator ändern), nicht in den Speicher, sondern in die erste, die erstellt wird die gesamte Ausgabe im Speicher, bevor sie ausgegeben wird (in die auf stdout geöffnete Datei).
Stéphane Chazelas
4
Hier ist eine Möglichkeit, dies in bash zu tun, ohne 5 GB Arbeitsspeicher benötigen zu müssen:
perl
ist es sehr einfach, es als Einzeiler zu verwenden.john
) und dergleichen, die Ihnen viele Möglichkeiten bieten.Antworten:
Hier ist eine Bash-Lösung, die die gewünschte Länge als Parameter verwendet (was Sie
permute 5
in Ihrem Fall tun würden):Es ist allerdings schmerzhaft langsam. Kann ich C empfehlen? https://youtu.be/H4YRPdRXKFs?t=18s
Starte es:
Hochrangige Sprachen lügen am brachialen Treiben (was im Grunde das ist, was Sie tun).
quelle
bash
Lösung ausprobiert . Es ist sehr nett; Ich mag es sehr. Es hat ungefähr 24 Stunden lang gut funktioniert, bevor ich bemerkte, dass mein System vollständig gesperrt war. Versuchte etwas Ähnliches mit `Python; mit einem ähnlichen Ergebnis, obwohl es wesentlich schneller war.In
bash
könnten Sie versuchen:aber das würde ewig dauern und all dein Gedächtnis verbrauchen. Am besten verwenden Sie ein anderes Tool wie
perl
:Achtung, das sind 6 x 62 5 Bytes, also 5.496.796.992.
Sie können die gleiche Schleife in machen
bash
, aberbash
als langsamste Muschel im Westen wird das Stunden dauern:(Auf meinem System werden 700 kB / s ausgegeben, im Gegensatz zu 20 MB / s mit dem
perl
Äquivalent).quelle
/dev/pts/something
; und Sie können dies mit dem Shell-Umleitungsoperator ändern), nicht in den Speicher, sondern in die erste, die erstellt wird die gesamte Ausgabe im Speicher, bevor sie ausgegeben wird (in die auf stdout geöffnete Datei).Hier ist eine Möglichkeit, dies in bash zu tun, ohne 5 GB Arbeitsspeicher benötigen zu müssen:
quelle
Diese Bash-Version ist immer noch nicht so schnell wie Perl, aber ungefähr viermal so schnell wie fünf verschachtelte Schleifen:
quelle
Sie können verwenden
crunch
(was zumindest auf Kali-Distributionen verfügbar ist).quelle
Naja ... elegant ?, ja (nur eine schnelle Probe):
Dieser vollständige Ausdruck blockiert höchstwahrscheinlich Ihren Computer:
Eine nicht blockierende Option besteht darin, mehrere Schleifen zu verwenden:
Nennen Sie es wie folgt:
Dabei ist das erste Argument die Anzahl der Zeichen und das zweite die durch Leerzeichen getrennte Liste der verwendeten Zeichen.
Dadurch wird eine Variable (
loop
) mit dem auszuführenden Skript erstellt, und die letzte Auswertung führt dieses Skript aus. Zum Beispiel für:Der Wert von
loop
wird sein:quelle
Gnu Parallel tun können , siehe Kombinationen https://www.gnu.org/software/parallel/ Etwas wie folgt aus :
quelle