Я хочу сделать файл, который очень большой по размеру для целей тестирования, который должен содержать уникальные слова (строго не повторяющиеся). Это может быть в GB, TB и т. Д. Могу ли я сделать это с терминалом?
Я использую Ubuntu 16.04 (Xenial Xerus).
Чтобы получить большой файл, заполненный случайными словами, используйте следующую команду:
cat /dev/urandom | head -c 1000000 | tr -dc "A-Za-z0-9\n" | sort | uniq
Это создаст файл с неопределенным словом в каждой строке и строками случайного текста. Вы можете увеличить размер файла, сделав 1000 больше или меньше.
Чтобы сделать пространство слов разделенным, просто передайте их обратно через tr "\n" " ".
cat /dev/urandom | head -c 1000000 | tr -dc "A-Za-z0-9\n" | sort | uniq | tr "\n" " "
Это также позволяет избежать проблем с производительностью, связанных с петли на оболочке.
Простейший однострочный шрифт для создания случайных строк символов:
while true; do echo $RANDOM | base64 >> BIGFILE.txt ; done
или, альтернативно:
while true; do echo $RANDOM | sha512sum >> BIGFILE.txt ; done
Для лучшей уникальности вы можете использовать /dev/urandom:
cat /dev/urandom | base64
Завершить команду с помощью Ctrl + C, когда ваш файл достигнет желаемого размера
Рассмотрим также случайные генераторы строк / паролей:
Таким образом, один из ответов там может быть адаптировано для этого:
while true; do openssl rand -base64 20 ; done
Если вы не хотите использовать знаки и цифры пунктуации, но используйте только буквы, то мы можем использовать tr для исправления этого: [ ! d7]
while true; do openssl rand -base64 20 | tr -d '[[:digit:]][[:punct:]]' ; done
Для дополнительной случайности вы можете перетасовать символы сгенерированных строк, используя shuf.
while true; do openssl rand -base64 20 | fold -w1 | shuf | tr -d '\n' ; done
И так далее и т. д. Вы можете даже передать вывод другому набору команд base64 или sha256sum, чтобы сделать их еще более случайными.
Для тех, кто любит альтернативные языки, отличные от оболочки, вот однострочный python: [ ! d10]
python -c $'import string,random;i = [i for i in string.uppercase + string.lowercase + string.digits];\nwhile not random.shuffle(i): print "".join(i)'
Если ограниченный алфавит и очень предсказуемый вывод являются точными, следующий, вероятно, самый быстрый (и самый спорный: P) ответ:
seq 100
(если слова могут состоять из простых чисел) или :
seq 100 | tr 0-9 A-I
(если есть желание использовать фактические буквы).
Вы также можете использовать /proc/sys/kernel/random/uuid в Linux для генерации UUID, что должно быть гарантировано уникальным:
[~]$ for i in {1..10}; do cat /proc/sys/kernel/random/uuid; done
c8072c40-32f5-4f14-8794-c3ab68e1a0f5
2f2630d8-0e17-4cba-8e62-586ee23f0ebb
97606886-f227-46f6-827a-141b0db57c59
5ffea57c-c3bf-4ba6-8c08-8a1b29ee8f6c
2b90f797-2def-4433-ae71-6f404db944fc
fcb793e9-6102-472d-a7a0-7bf5204dbee5
d84e2877-6804-4bed-85f0-0a551234425a
3d9445ca-335c-4960-83d5-6cb1bef8b9eb
913bce71-5c20-47f7-a22e-277be6856a57
8f232541-f8c1-46ba-b57a-0d11314c3483
Вы можете удалить - символ с tr -d, а затем перенаправить его в файл :
[~]$ for i in {1..10000}; do cat /proc/sys/kernel/random/uuid | tr -d '-' ; done > /tmp/words
[~]$ sort /tmp/words | uniq | wc -l
10000