从标准输入读取一定数量的字节,然后关闭管道

从标准输入读取一定数量的字节,然后关闭管道

我正在尝试从 /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>dddd 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

相关内容