標準入力から特定のバイト数を読み取り、パイプを閉じます。

標準入力から特定のバイト数を読み取り、パイプを閉じます。

/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入力はファイルの最後まで読み取られ、各行の一部が切り捨てられます。最初の2つのコマンドを使用すると、改行が削除さ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このようなものに渡すか、base6416進ダンプを生成することに渡す方が良いでしょう。

答え2

何でも読みやすい文字に置き換える簡単な方法:

$ head -c30 /dev/urandom | base64
nkGmuXgY/1OfNz8i/t3MsVe/5Q0z18AKotV3oJRW

関連情報