Answers:
具有awk system()功能:
样品input.txt:
a
b
c
awk '{
printf "name";
system("tr -dc \047[:alnum:]\047 </dev/urandom | head -c6");
printf "-%s\n", $0
}' input.txt
样本输出:
nameSDbQ7T-a
nameAliHY0-b
nameDUGP2S-c
system(command)
执行操作系统命令command,然后返回到awk程序
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-功能
tr: write error: Broken pipe?
您不觉得它有点明显吗?您只需生成一次随机字符串并将其存储在ran变量中,然后将其用于所有行!
getline在管道中使用变量
awk '{
str_generator = "tr -dc '[:alnum:]' </dev/urandom | head -c 6"
str_generator | getline random_str
close(str_generator)
print "name " random_str " - " $0
}' file
使用时command | getline var,命令的输出通过管道发送getline()到变量中,也发送到变量中var。
还要注意,当打开管道进行输出时,会awk记住与之关联的命令,并且对该命令的后续写入将附加到先前的写入中。我们需要对close()命令进行显式调用以防止这种情况。
如果中的嵌套单引号str_generator引起了问题,请用其八进制等效值(\047)替换
awk '{
str_generator = "tr -dc \047[:alnum:]\047 </dev/urandom | head -c 6"
str_generator | getline random_str
close(str_generator)
print "name " random_str " - " $0
}' file
tr -dc '[:alnum:]' </dev/urandom | head -c 6每行输入运行一个实例会适得其反,您最好这样做:
<input awk -v rng="LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6" '
{rng | getline r; print "name"r"-"$0}'
如果您的输入内容不包含反引号或单引号,则也可以使用m4的mkstemp():
<input sed "s/.*/mkstemp(name)\`&'/" | m4
其他几个答案的这种变化会在以下之外生成随机字符串awk:
LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6 |
awk '{ getline r <"/dev/stdin"; printf("name%s-%s\n", r, $0) }' file
的tr+ fold管道上产生的标准输入的随机六字符串层出不穷awk。 awk如果提供了文件名,它将忽略标准输入,因此getline将从这些随机字符串读取/dev/stdin到变量中r。 printf然后使用来为文件中的行加上适当的字符串作为前缀。
给定文件
123
abc
@#$
这可能会产生
nameFI4L1S-123
name5S8Shr-abc
namebRUjzV-@#$
完全不使用awk,非常简单 bash
while read line; do
printf "name%s-%s\n" \
"$(tr -dc '[:alnum:]' </dev/urandom|head -c6)" \
"$line"
done <myfile
paste <(base64 -w6 /dev/urandom) input.txt | awk 'NF==2{print $1$2} NF!=2{exit}'
要求 -input.txt应该仅包含一列,换句话说,它不应包含制表符或空格,因为它们由awk和paste(仅制表符)命令用作默认分隔符。否则,必须对命令进行一些修改。
注:
该Base64编码字母包含+和/字符:Base64编码表,如果你想只有数字和字母,您可以使用base32命令- Base32字母表。
输入值
===my_line_a
===my_line_b
===my_line_c
===my_line_d
===my_line_e
=== 为清楚起见添加了字符。
输出量
LYSdm8===my_line_a
5sSSNt===my_line_b
YVMdkA===my_line_c
3b/nsT===my_line_d
xt/AZO===my_line_e
tr -dc '[:alnum:]' </dev/urandom | head -c 6,它使用起来会更简单,更有效地进行计算pwgen -s 6 1,或者更好的是,pwgen -s 6 $(wc -l myfile)您一口气就能准确地提供所需的所有随机字符串。