Need Randomness? Harness the Power of “shuf”!
In the world of Linux and Unix-like systems, the command line is your playground. And like any good playground, it’s filled with tools that, while seemingly simple, can unlock powerful and unexpected solutions. One such tool, often overlooked but immensely useful, is shuf
. If you’ve ever needed to randomize data, create sample sets, or simply introduce an element of chance into your scripts, shuf
is your new best friend. Let’s dive into the hows and whys of this handy utility.
Overview: The Magic of Randomization with shuf

shuf
, part of the GNU Core Utilities, is a command-line program designed to generate random permutations of input. It reads input from files or standard input (stdin), shuffles the lines (or numbers within a specified range), and writes the randomized output to standard output (stdout). What makes shuf
ingenious is its simplicity and versatility. It doesn’t require complex scripting or programming knowledge; you can achieve sophisticated randomization with a single command. This is invaluable for tasks such as selecting random samples from a large dataset, generating randomized test data, or even creating a playlist of shuffled songs. shuf
truly embodies the Unix philosophy of “doing one thing and doing it well.”
Installation: Getting shuf on Your System

Since shuf
is part of the GNU Core Utilities, it’s highly likely that it’s already installed on your Linux or macOS system. To verify, simply open your terminal and type:
shuf --version
If shuf
is installed, the command will display its version number. If not, you’ll need to install the GNU Core Utilities package. The installation process varies depending on your operating system.
- Debian/Ubuntu:
sudo apt update sudo apt install coreutils
- Fedora/CentOS/RHEL:
sudo dnf install coreutils
- macOS (using Homebrew):
brew install coreutils
After installation, you may need to use `gshuf` instead of `shuf` on macOS, as the default `shuf` might be a different implementation. You can alias it:
alias shuf='gshuf'
Usage: Unleashing the Power of shuf
Now that you have shuf
installed, let’s explore its capabilities with some practical examples.
1. Shuffling Lines from a File
One of the most common uses of shuf
is to shuffle the lines of a text file. Suppose you have a file named `names.txt` containing a list of names, one name per line.
cat names.txt
# Output:
# Alice
# Bob
# Charlie
# David
# Eve
To shuffle these names randomly, simply run:
shuf names.txt
# Possible Output:
# David
# Alice
# Eve
# Bob
# Charlie
Each time you run this command, the output will be a different random permutation of the lines in `names.txt`. The original `names.txt` file remains unchanged.
2. Shuffling Standard Input (stdin)
shuf
can also accept input from standard input (stdin), allowing you to pipe data from other commands.
seq 1 5 | shuf
# Possible Output:
# 3
# 1
# 5
# 4
# 2
In this example, `seq 1 5` generates a sequence of numbers from 1 to 5, which is then piped to shuf
for randomization.
3. Generating a Random Sample
You can use shuf
to extract a random sample of a specific size from a larger dataset using the `-n` option. This is extremely useful for tasks such as data analysis and machine learning.
seq 1 100 | shuf -n 10
# Possible Output:
# 67
# 12
# 88
# 4
# 32
# 91
# 55
# 21
# 76
# 1
This command generates a sequence of numbers from 1 to 100 and then randomly selects 10 of them.
4. Specifying an Output File
By default, shuf
writes its output to standard output. To save the shuffled output to a file, use redirection:
shuf names.txt > shuffled_names.txt
This command shuffles the lines in `names.txt` and saves the result to a new file named `shuffled_names.txt`.
5. Generating a Random Range of Numbers
Instead of providing a file as input, you can directly specify a range of numbers to shuffle using the `-i` option.
shuf -i 1-10
# Possible Output:
# 7
# 2
# 9
# 1
# 5
# 10
# 6
# 8
# 3
# 4
This command shuffles the numbers from 1 to 10 and prints the randomized sequence.
6. Generating a Non-Repeating Sequence
By default, shuf
will produce a shuffled list of all elements in the input. If you want to avoid repetition and have a random sample of a certain size, you can combine `-n` with `-i` or a file input:
shuf -i 1-10 -n 5
# Possible Output:
# 3
# 8
# 1
# 6
# 9
This command generates a random sample of 5 numbers from the range 1 to 10 without repetition.
7. Repeat Shuffling Multiple Times
Sometimes you want to repeat the shuffling process multiple times. While shuf
itself doesn’t have a built-in repeat option, you can easily achieve this with a simple loop.
for i in {1..3}; do shuf -i 1-5; echo "---"; done
# Possible Output:
# 5
# 2
# 4
# 3
# 1
# ---
# 2
# 5
# 3
# 4
# 1
# ---
# 1
# 2
# 4
# 3
# 5
# ---
This loop shuffles the numbers from 1 to 5 three times, separating each result with “—“.
Tips & Best Practices for Using shuf
- Seed for Reproducibility: For testing and debugging purposes, you might want to generate the same random sequence every time. Use the `–random-source=FILE` option along with a file containing random data. For example, you could use `/dev/urandom` as the source. However, note that the output is deterministic *for that specific input file* and not a true random seed in the traditional sense. If you want a truly reproducible sequence, you’ll need to use a different tool like `jot` combined with a seed:
jot -r 10 1 100 --seed=123 | shuf -n 5
- Handling Large Files:
shuf
reads the entire input into memory before shuffling. For extremely large files, this can be problematic. Consider using alternative approaches like splitting the file into smaller chunks, shuffling each chunk separately, and then concatenating them. Or use tools specifically designed for large-scale data manipulation. - Combining with Other Commands:
shuf
is most powerful when combined with other command-line tools using pipes. Explore its potential by integrating it into your scripts and workflows. - Understanding Randomness: The quality of randomness produced by
shuf
depends on the underlying random number generator provided by your system. For security-sensitive applications, ensure that your system’s random number generator is properly configured and seeded.
Troubleshooting & Common Issues
- “shuf: command not found”: This usually indicates that
shuf
is not installed or not in your system’s PATH. Follow the installation instructions provided earlier in this article. Also, remember the macOS `gshuf` alias. - “shuf: memory exhausted”: This can occur when shuffling very large files. Consider the strategies for handling large files mentioned in the “Tips & Best Practices” section.
- Unexpected Output: Double-check your input data and options. Ensure that the input file exists and is in the correct format. Verify that you’re using the correct options for your desired outcome (e.g., `-n` for sampling, `-i` for range).
- Non-Random Output: If you suspect that
shuf
is not producing truly random output, investigate your system’s random number generator. In most cases, the default settings are sufficient, but for critical applications, it’s worth verifying.
FAQ: Your shuf Questions Answered
- Q: Can I use shuf to shuffle lines containing spaces?
- A: Yes,
shuf
correctly handles lines with spaces. It treats each line as a single unit for shuffling. - Q: How do I shuffle a file and replace the original file with the shuffled version?
- A: You can use the
mv
command after shuffling and redirecting the output to a temporary file:shuf original.txt > temp.txt && mv temp.txt original.txt
Be careful when using this command as it will overwrite the original file.
- Q: Is `shuf` suitable for generating cryptographic keys or random passwords?
- A: No,
shuf
is not designed for cryptographic purposes. Use dedicated tools likeopenssl
or/dev/urandom
for generating secure keys and passwords. - Q: How do I shuffle lines and keep the header row on top?
- A: First save the header, then shuffle the rest, and finally, combine them back:
header=$(head -n 1 file.txt) tail -n +2 file.txt | shuf > tmp.txt echo "$header" > shuffled_file.txt cat tmp.txt >> shuffled_file.txt rm tmp.txt
- Q: Can I use `shuf` to generate random IP addresses?
- A: Yes, you can by shuffling each octet (group of three digits) independently, then joining them with dots:
octet() { shuf -i 0-255 -n 1; } echo "$(octet).$(octet).$(octet).$(octet)"
This generates a single random IP address. You can loop to generate more. Note: The generated IP may or may not be routable or valid.
Conclusion: Embrace the Randomness!
shuf
is a simple yet remarkably powerful command-line tool for generating random permutations. Its ease of use and versatility make it an invaluable asset for anyone working with data on Linux or macOS systems. Whether you’re creating sample datasets, randomizing test data, or simply adding an element of chance to your scripts, shuf
has you covered. So, go ahead and explore its capabilities – you might be surprised at what you discover!
Ready to bring some randomness into your workflow? Try using the shuf
command today and discover its potential. For more information and detailed documentation, visit the official GNU Core Utilities page.