相关问题:如何根据用户输入创建随机输出
我想从用户那里获取输入(只有一个参数),就像Hello
.而且,我想给出类似的输出
olleho
llohe
he
llo
lo
就像上面一样。而且,我想从单个输入中生成数百万个样本。我想将这些文本保存在 txt 格式的文件中。怎么做?
假设我将我的电子邮件地址作为参数`[电子邮件受保护]`。所以,现在我想使这个帐户的相关密码成为可能。下面给出一些示例输出:
[email protected]
Istiakshovon
Istiak
Ishovon
Ishovon0
Iksgc
gmail
moc
我想尽可能以各种可能的方式创建示例密码。
我添加了awk标签原因,我注意到很多人使用“awk”格式化文本。我对它不太熟悉(我只是一个 Linux 初学者)。这就是我添加它的原因。
答案1
假设用户的输入位于 变量 中userinput
,那么以下awk
代码将生成该输入的永无止境的随机采样。
userinput=$userinput awk '
BEGIN {
s = ENVIRON["userinput"] "\n"
n = length(s)
while (1)
printf "%s", substr(s,int(1+rand()*n),1)
}'
这将获取 的值$userinput
,在字符串末尾添加一个换行符,然后开始从该字符串写入随机字符,直到中断代码。添加的换行符确保我们每隔一段时间就会在输出中得到换行符。
使用head
命令您可以限制输出的行数。如果您想要 1000 行,请通过管道输出head -n 1000
。使用以下命令测试前 10 行输出userinput='Hello World!'
:
$ userinput='Hello World!'
$ userinput=$userinput awk '
BEGIN {
s = ENVIRON["userinput"] "\n"
n = length(s)
while (1)
printf "%s", substr(s,int(1+rand()*n),1)
}' | head
ld l!lodd loWHe! o
H lolooel
o
eo !lll
WrlHellHod
rlll
o!Hddrd
l!lHelWloodWddeodldHHlo!d l ll oorordeoellrWHledW!!WrW W!l
l!od
如果要删除空行,请将输出传递给sed '/./!d'
.
该命令的一个变体,从输入的第一行获取输入字符串:
awk '{
s = $0 "\n"
n = length(s)
while (1)
printf "%s", substr(s,int(1+rand()*n),1)
}'
答案2
使用 Perl 和算法::置换库模块:
#!/usr/bin/perl
use strict;
use Algorithm::Permute qw(permute);
my $string = 'hello';
my @array = split //, $string;
permute { print join("",@array), "\n" } @array;
$ ./permute.pl | head
hello
helol
heoll
hoell
ohell
hello
helol
heoll
hoell
ohell
上面的版本仅打印与原始长度相同的排列。
以下版本执行从长度 1 到相同长度的所有排列:
#!/usr/bin/perl
use strict;
use Algorithm::Permute;
my $string = shift; # New & Improved! Now takes an argument!
# un-comment only ONE of the following two lines:
#for my $i (reverse 1 .. length($string)) {
for my $i (1 .. length($string)) {
my $p = Algorithm::Permute->new([split //, $string], $i);
while (my @res = $p->next) {
print join('',@res), "\n";
};
};
另存为,例如permute.pl
。使可执行文件chmod +x permute.pl
并运行如下:
$ ./permute.pl hello
注1:事实证明存在一个已知的错误进行完全排列时原始数组被清空在 Algorithm::Permute 模块中,该模块会擦除调用它的数组。
这绝对是非 Perl 行为,可能是因为该模块不是本机 Perl,它是编译后的 C 函数的薄 Perl 包装器......并且 C 函数是以破坏数组的方式编写的。
不管怎样,这就是为什么我去掉了这条my @array = split //, $string
线,并用来[split //, $string]
为该Algorithm::Permute->new()
方法生成一个匿名数组。这确保了每次循环时都会重新创建数组。
通常,如果数组没有(或不应该)在循环内修改,则应该在循环外仅创建它一次。
注 2:如果要反转输出的顺序,请将脚本的输出通过管道传输到tac
,或将脚本中的 for 循环更改为:
for my $i (reverse 1 .. length($string)) {
这样做让我注意到了这个错误。上面的更新版本现在可以使用或不使用reverse
.