If you're looking for a lot of "randomness" quickly, you might consider not using /dev/urandom directly, but instead use a plain dm-crypt device with a random key.
It's perfect for overwriting a device, but combining it with a fixed length file you could get a fixed length of random data without waiting for /dev/urandom at all.
(Though your main problem appears to have been waiting for consecutive characters with strings, this could still be useful & quicker, solving your "subject line problem")
Here's the relevant section from cryptsetup's FAQs:
2.19 How can I wipe a device with crypto-grade randomness?
The conventional recommendation if you want to not just do a
zero-wipe is to use something like
cat /dev/urandom > <taget-device>
That is very slow and painful at 10-20MB/s on a fast computer. Using cryptsetup and a plain dm-crypt device with a random key, it is much faster and gives you the same level of security. The defaults are quite enough.
For device set-up, do the following:
cryptsetup open --type plain -d /dev/urandom /dev/<block-device> to_be_wiped
This maps the container as plain under /dev/mapper/to_be_wiped with a
random password. For the actual wipe you have several options.
Simple wipe without progress-indicator:
cat /dev/zero > /dev/mapper/to_be_wiped
Progress-indicator by dd_rescue:
dd_rescue -w /dev/zero /dev/mapper/to_be_wiped
Progress-indicator by my "wcs" stream meter (available from
http://www.tansi.org/tools/index.html ):
cat /dev/zero | wcs > /dev/mapper/to_be_wiped
Or use plain "dd", which gives you the progress when
sent a SIGUSR1, see the dd man page.
Remove the mapping at the end and you are done.
So creating a fixed length file of say 10M named 10
fallocate -l 10M 10
Setup the plain dm-crypt on 10, named /dev/mapper/crypt10
cryptsetup -v open --type plain -d /dev/urandom 10 crypt10
Now "overwriting" 10 with crypto-grade randomness (with dd) & close the mapping
dd if=/dev/zero of=/dev/mapper/crypt10
cryptsetup -v close crypt10
Now you've got 10M of random data in the file 10 to play with, or delete all the non-printable characters using Kamil's answer: "translating" the whole file to the printable file named 10-printable would be
tr -dc '[:print:]' < 10 > 10-printable
leaving about 3.8M of printable data in 10-printable.