diff --git a/rand/rand b/rand/rand index 8022643..8705e07 100755 --- a/rand/rand +++ b/rand/rand @@ -10,7 +10,7 @@ rand - generate (pseudo-)random data =head1 SYNOPSIS -B [[I] I] +B [-f FORMAT|--format FORMAT] [[I] I] =head1 DESCRIPTION @@ -27,6 +27,19 @@ If I is given, numbers will be integers from 0 to I. If I is also given, numbers will be integers from I to I. +=head1 OPTIONS + +=over 4 + +=item B<--format> I + +=item B<-f> I + +Format number using I. I follows Bs specification. + +=back + + =head1 EXAMPLE Overwrite a harddisk with random data: @@ -41,9 +54,16 @@ Overwrite a harddisk with random data: rand 1000 1999 | head -n 100 +=head1 EXAMPLE + +100 random numbers from 256 to 65535 in hex with 0s prepended: + + rand -f '%04x\n' 256 65535 | head -n 100 + + =head1 AUTHOR -Copyright (C) 2017 Ole Tange, +Copyright (C) 2017-2020 Ole Tange, http://ole.tange.dk and Free Software Foundation, Inc. @@ -67,7 +87,7 @@ along with this program. If not, see . =head1 DEPENDENCIES -B uses B. +B uses B, B, and B. =head1 SEE ALSO @@ -77,42 +97,58 @@ B =cut -# Generate random 8-bit data by AES encrypting /dev/zero with a random -# key -randfunc() { +randdata() { + # Generate random 8-bit data by AES encrypting /dev/zero with a + # random key key=$(openssl rand -hex 16) iv=$(openssl rand -hex 16) < /dev/zero openssl enc -aes-128-ctr -K $key -iv $iv 2>/dev/null } -export -f randfunc +export -f randdata ints() { + # Convert random data on stdin to numbers $from..$to in $fmt from=$1 to=$2 + fmt="$3" # Allow up to 2^64 perl -e '$diff='$to-$from'+1; $factor = 2**64/$diff; while(sysread(STDIN,$buf,65536)) { - print map { (int($_ / $factor) + '$from'),"\n" } unpack("Q*",$buf); + print map { sprintf("'"$fmt"'", int($_ / $factor) + '$from'); } unpack("Q*",$buf); }' } export -f ints randints() { - randfunc | ints "$@" + randdata | ints "$@" } export -f randints +# Default format of ints +fmt='%s\n' + +while true; do + case "$1" in + -f | --fmt ) fmt="$2"; shift 2 ;; + -D | --debug ) debug=true; shift ;; + -h | --help ) help=1; shift 2 ;; + -- ) shift; break ;; + * ) break ;; + esac +done +qfmt="$(parallel --shellquote --shellquote ::: "$fmt")" + if [ "$1" == "" ] ; then # Boost performance by running 1 per CPU core - eval parallel -u randfunc ::: {1..$(parallel --number-of-cores)} + eval parallel -u randdata ::: {1..$(parallel --number-of-threads)} else # $1 set => numerical if [ "$2" == "" ] ; then # 0 .. $1 - eval parallel --lb randints 0 $1 ::: {1..$(parallel --number-of-cores)} + eval parallel -N0 --lb randints 0 $1 "$qfmt" ::: {1..$(parallel --number-of-threads)} else # $1 .. $2 - eval parallel --lb randints $1 $2 ::: {1..$(parallel --number-of-cores)} + eval parallel -N0 --lb randints $1 $2 "$qfmt" ::: {1..$(parallel --number-of-threads)} fi fi