/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>
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
16進ダンプを生成することに渡す方が良いでしょう。
答え2
何でも読みやすい文字に置き換える簡単な方法:
$ head -c30 /dev/urandom | base64
nkGmuXgY/1OfNz8i/t3MsVe/5Q0z18AKotV3oJRW