표준 입력에서 특정 바이트 수를 읽은 다음 파이프를 닫습니다.

표준 입력에서 특정 바이트 수를 읽은 다음 파이프를 닫습니다.

/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이와 같은 것으로 전달하거나 base6416진수 덤프를 생성하는 것으로 전달하는 것이 더 좋습니다 .

답변2

무엇이든 읽을 수 있는 문자로 바꾸는 쉬운 방법:

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

관련 정보