Need Random Data? Unleash the Power of “shuf”!
Have you ever needed to shuffle lines in a file, generate a random sample from a list, or create randomized test data? The shuf command, a seemingly simple yet incredibly versatile utility, is your answer. Part of the GNU Core Utilities, shuf excels at creating random permutations of its input, making it an indispensable tool for tasks ranging from data analysis to game development. Let’s dive into how shuf can simplify your workflow and add a touch of randomness to your everyday tasks.
Overview

shuf is a command-line utility designed for generating random permutations of input. It reads lines from a file (or standard input), shuffles them, and writes the shuffled result to standard output. What makes shuf particularly clever is its ability to handle large datasets efficiently. Unlike some naïve shuffling algorithms, shuf avoids loading the entire input into memory. Instead, it employs algorithms that allow it to shuffle data streams of virtually any size. This makes it ideal for working with log files, database dumps, or any other large text-based data source.
The real power of shuf lies in its simplicity and flexibility. It integrates seamlessly into shell scripts and pipelines, enabling you to add randomness to complex workflows with minimal effort. Whether you’re drawing random winners from a list of participants, selecting a random subset of data for testing, or simply adding an element of surprise to your command-line interactions, shuf is the tool for the job.
Installation

Since shuf is part of the GNU Core Utilities, it’s pre-installed on most Linux distributions. You can verify its presence by simply typing shuf --version in your terminal. If it’s not installed, or if you need a specific version, you can typically install it using your distribution’s package manager.
Here are examples for some popular distributions:
- Debian/Ubuntu:
sudo apt update && sudo apt install coreutils - Fedora/CentOS/RHEL:
sudo dnf install coreutils - macOS (using Homebrew):
brew install coreutilsNote: On macOS, the
shufcommand installed by Homebrew will be prefixed withgto avoid conflicts with system utilities. Therefore, you’ll usegshufinstead ofshuf.
After installation, confirm the installation by running:
shuf --version
This should output the version information for shuf.
Usage

The basic syntax of the shuf command is:
shuf [OPTION]... [FILE]
If no file is specified, shuf reads from standard input. Let’s explore some common use cases with practical examples.
1. Shuffling Lines in a File
The most basic usage is to shuffle the lines in a file and print the result to standard output.
shuf myfile.txt
This command shuffles the lines in myfile.txt and displays the shuffled content in the terminal. The original file remains unchanged.
2. Shuffling Standard Input
You can pipe the output of another command into shuf to shuffle the results. For example, to shuffle a list of files:
ls -l | shuf
This shuffles the output of the ls -l command, randomizing the order of files listed.
3. Selecting a Random Sample
The -n option allows you to select a specific number of lines from the input. This is useful for creating random samples.
shuf -n 5 myfile.txt
This command selects 5 random lines from myfile.txt and prints them to the console. If the file contains fewer than 5 lines, all lines will be printed in random order.
4. Generating a Random Number Sequence
shuf can also generate random numbers within a specified range using the -i option.
shuf -i 1-10
This generates a random permutation of the integers from 1 to 10. You can combine this with the -n option to select a random number from the range:
shuf -i 1-10 -n 1
This selects a single random number between 1 and 10 (inclusive).
5. Creating a Random Password
You can use shuf to create random passwords by combining it with other utilities like tr and head.
cat /dev/urandom | tr -dc A-Za-z0-9\!@#\$%\^\&\*\(\)_\+\`\~\=\{\}\[\]\\\|:;\"\<\>\?\/ | head -c 16 | xclip -selection clipboard
Here’s a breakdown of this command:
cat /dev/urandom: Generates a stream of random bytes.tr -dc A-Za-z0-9\!@#\$%\^\&\*\(\)_\+\`\~\=\{\}\[\]\\\|:;\"\<\>\?\/: Filters the random bytes, keeping only alphanumeric characters and special symbols.head -c 16: Takes the first 16 characters of the filtered output.xclip -selection clipboard: Copies the generated password to the clipboard. (This requires thexcliputility to be installed.)
A more elegant and secure approach could be using openssl for password generation but this example showcases shuf in a pipeline scenario.
6. Simulating a Coin Flip
A simple use case for shuf is to simulate a coin flip.
echo -e "Heads\nTails" | shuf -n 1
This command outputs either “Heads” or “Tails” randomly.
7. Shuffling lines in place
By default, shuf writes to standard output, leaving the original file intact. If you want to shuffle the file “in-place”, you can use a temporary file and mv command:
shuf input.txt > tmp.txt && mv tmp.txt input.txt
Tips & Best Practices

- Seed for Reproducibility: For testing and debugging purposes, you might want to reproduce the same random sequence. Use the
--random-source=FILEoption to specify a file containing random data, or pipe data intoshuf, to control the random sequence. Whileshufdoesn’t directly support a seed argument like some random number generators, you can achieve similar results by piping a consistent stream of random data (e.g., from/dev/urandom) into it. - Handle Large Files Carefully: While
shufis designed to handle large files, processing extremely large files can still take time. Consider using other tools likesort -Rfor simpler randomization tasks if performance is critical. - Be Mindful of Character Encoding: Ensure that your input files are encoded consistently (e.g., UTF-8) to avoid unexpected shuffling behavior, especially when dealing with multi-byte characters.
- Combine with Other Utilities:
shufshines when combined with other command-line tools. Use pipes, redirection, and other utilities to create powerful and flexible data processing workflows. - Use xargs for arguments: Be careful when using
shufwith filenames containing spaces. Usingxargscan prevent unexpected results:
find . -name "*.txt" -print0 | shuf -z | xargs -0 ls -l
Troubleshooting & Common Issues

- Command Not Found: If you get a “command not found” error, make sure
coreutilsis installed correctly (see the Installation section). Also verify that the directory containingshufis in yourPATHenvironment variable. - Unexpected Output: If the output seems incorrect, double-check the input data and options used. Ensure that the file paths are correct and that the
-noption is used with a valid number of lines. - Performance Issues: For extremely large files, consider optimizing your workflow or using alternative tools if performance is a concern. Ensure that you have sufficient memory available.
- macOS gshuf vs shuf: Remember that if you installed
shufvia Homebrew on macOS, you need to usegshuf.
FAQ

- Q: What’s the difference between
shufandsort -R? - A: Both shuffle, but
shufis specifically designed for shuffling lines, handling large files efficiently, and selecting samples.sort -R(random sort) might be faster for simple randomization tasks, but its behavior and suitability for large files can vary. - Q: Can
shufshuffle columns instead of lines? - A: No,
shufoperates on lines. To shuffle columns, you’d need to use a different tool or script that manipulates the columns directly. - Q: Is
shufsuitable for generating cryptographically secure random numbers? - A: No,
shufis not designed for cryptographic purposes. For secure random number generation, use tools like/dev/urandomor libraries specifically designed for cryptography. - Q: How do I shuffle multiple files together as if they were one?
- A: You can concatenate the files using
catand pipe the result toshuf:cat file1.txt file2.txt file3.txt | shuf > shuffled_output.txt - Q: Can I use
shufto generate random dates? - A: While
shufitself doesn’t generate dates, you can create a file with a list of dates and then useshufto randomize them. You can also use other command-line tools likedatein conjunction withshufto generate random date ranges.
Conclusion
shuf is a powerful and versatile command-line tool for generating random permutations and selections from data. Its simplicity, efficiency, and seamless integration with other utilities make it an invaluable asset for any command-line user. Whether you’re a developer, data scientist, or system administrator, shuf can simplify your tasks and add a touch of randomness to your workflows.
Now that you’ve learned about the power of shuf, why not give it a try? Experiment with the examples provided in this article and discover new ways to incorporate randomness into your command-line adventures. For more information and advanced usage scenarios, visit the official GNU Core Utilities documentation.