我正在尝试从 /dev/urandom 中读取一些字节,仅保留我可以轻松输入的字节,并将结果修剪为 30 个字符。不过,当数据来自管道时,我不知道如何获得“仅 30 个字符”的行为。我试过
cat /dev/urandom | tr -cd 'A-Za-z0-9' | cut -c -30
和
cut -c -30 /dev/urandom | tr -cd 'A-Za-z0-9' | cut -c -30
但这些挂起而不显示任何内容。另一方面,
cut -c -30 /dev/urandom | tr -cd 'A-Za-z0-9'
无限地输出数据(尽管它显然已经被处理过,tr
因为输出中只出现指定的字符)。
一般来说,如何从管道中读取一定数量的字符(或字节)然后关闭管道?
答案1
cut
将读取输入直到文件末尾,并从每行中剪切一部分。使用前两个命令,您看不到任何内容,因为tr
删除了任何换行符,因此cut
永远看不到要处理的整行。最后,tr
再次删除换行符,因此您看不到如何很好地cut
将行保持在一定长度。
假设您的head
实用程序支持该选项,您可以使用它来获取固定数量的字节。如果没有,请使用. ( )-c <characters>
dd
dd bs=1 count=NNN < /dev/urandom
因此,这将产生 32 个字母数字(以及尾随换行符):
tr -cd 'A-Za-z0-9' < /dev/urandom | head -c32 ; echo
不过,从原则上讲,这有点浪费,因为tr
丢弃了大约 3/4 或原始输入字节。最好将原始数据传递urandom
到类似的东西base64
或任何产生十六进制转储的东西。
答案2
将任何内容变成可读字符的一种简单方法:
$ head -c30 /dev/urandom | base64
nkGmuXgY/1OfNz8i/t3MsVe/5Q0z18AKotV3oJRW