Need Randomness? Unleash the Power of “shuf”!
In the world of command-line tools, sometimes the simplest utilities are the most surprisingly powerful. shuf
is one such gem. This unassuming tool, part of the GNU Core Utilities, lets you shuffle lines in a file or generate random sequences with ease. Whether you’re creating random test datasets, selecting a lucky winner, or need to introduce randomness into your scripts, shuf
is the answer.
Overview

The shuf
command is designed to generate random permutations of input lines. It reads input either from a specified file or from standard input, shuffles the lines, and writes the shuffled output to standard output. What makes shuf
so smart and ingenious is its simplicity and efficiency. It performs a crucial task with minimal overhead, making it ideal for scripting and automation.
Imagine you have a list of names and you want to randomly select a winner for a contest. shuf
can effortlessly handle this. Or, perhaps you’re working with a large dataset and need a random subset for testing. shuf
makes this a breeze. Its versatility extends to tasks like generating random passwords, creating randomized training data for machine learning models, and even simulating card games.
Installation

Since shuf
is part of the GNU Core Utilities, it’s likely already installed on most Linux and Unix-like systems. If, for some reason, it’s not installed, you can easily install it using your system’s package manager.
Debian/Ubuntu:
sudo apt-get update
sudo apt-get install coreutils
CentOS/RHEL/Fedora:
sudo yum install coreutils
# or on newer systems
sudo dnf install coreutils
macOS (using Homebrew):
brew install coreutils
# To avoid conflicts with macOS's built-in tools, the binaries are prefixed with 'g'.
# So, you would use 'gshuf' instead of 'shuf'.
After installation, verify that shuf
is working by typing:
shuf --version
This should display the version information for shuf
.
Usage
shuf
offers a range of options to customize its behavior. Let’s explore some common use cases with practical examples.
1. Shuffling Lines from a File
This is the most basic usage. Suppose you have a file named names.txt
containing a list of names, one name per line:
Alice
Bob
Charlie
David
Eve
To shuffle the names and print them to the console, use:
shuf names.txt
The output will be a random permutation of the names, like:
David
Charlie
Alice
Bob
Eve
Each time you run the command, the order will be different.
2. Shuffling Standard Input
shuf
can also take input from standard input (stdin). This is useful when piping output from another command.
seq 1 10 | shuf
This command generates a sequence of numbers from 1 to 10 using seq
, and then shuffles them using shuf
. The output will be a random order of the numbers 1 through 10.
3. Specifying a Range
The -i
option allows you to specify a range of numbers to shuffle. The syntax is -i START-END
.
shuf -i 1-10
This is equivalent to the previous example using seq
, but directly using shuf
.
4. Limiting the Output
The -n
option lets you specify the number of lines to output. This is useful for selecting a random sample from a larger dataset.
shuf -n 3 names.txt
This command will randomly select and print 3 lines from the names.txt
file.
5. Repeating Output
The -r
option allows you to repeat lines in the output. This means a line can appear more than once.
shuf -n 5 -r names.txt
This command will print 5 lines from names.txt
, with repetition allowed. You might see the same name appear multiple times in the output.
6. Using a Specific Seed
For reproducibility, you can use the --random-source=FILE
or `–seed=NUMBER` option to specify a seed for the random number generator. This ensures that you get the same shuffled output every time you run the command with the same seed.
shuf --seed=123 names.txt
Running this command multiple times will produce the same shuffled order of names.
Alternatively, you can use a file containing random data as the random source. This can be useful for creating unpredictable random sequences.
shuf --random-source=/dev/urandom names.txt
7. Creating a Random Password
You can combine shuf
with other command-line tools to create a random password generator. Here’s an example:
head /dev/urandom | tr -dc A-Za-z0-9!@#$%^&*()_+|~=`{}[]:;?><,./- | head -c 16 | shuf | paste -sd ""
This command does the following:
head /dev/urandom
: Reads random bytes from/dev/urandom
.tr -dc A-Za-z0-9!@#$%^&*()_+|~=`{}[]:;?><,./-
: Filters out all characters except alphanumeric characters and common symbols.head -c 16
: Takes the first 16 characters.shuf
: Randomizes the order of those 16 characterspaste -sd ""
: Joins the characters back together
This generates a strong, random password.
Tips & Best Practices
- Use
-n
for sampling: When dealing with large files, use the-n
option to extract a random sample without processing the entire file. - Seed for reproducibility: Always use the
--seed
option when you need repeatable results, such as for testing or debugging. - Combine with other tools:
shuf
works best when combined with other command-line utilities likeseq
,awk
, andsed
for complex data manipulation tasks. - Be mindful of large files: While
shuf
is efficient, shuffling very large files can still be resource-intensive. Consider using streaming approaches or sampling techniques to reduce memory usage. - Understand randomness sources: Using
/dev/urandom
for generating random passwords provides a better source of randomness than pseudo-random number generators with a simple seed.
Troubleshooting & Common Issues
- "shuf: standard input: Resource temporarily unavailable": This error can occur when
shuf
is expecting input from stdin but receives none. Double-check your pipes and input sources. - Unexpected output when using
-r
: If you are using the-r
option (repeat), be aware that lines can appear multiple times in the output. This is the intended behavior, but it can be surprising if you're not expecting it. - macOS issues: Remember that on macOS, the GNU Core Utilities are often prefixed with
g
(e.g.,gshuf
instead ofshuf
). - Insufficient permissions: If you are trying to read from or write to a file that you do not have permission to access,
shuf
will return an error. Ensure you have the necessary permissions.
FAQ
- Q: Can
shuf
shuffle directories? - A: No,
shuf
is designed to shuffle lines of text. To shuffle a list of files in a directory, you'd need to combine it with other tools likels
orfind
. - Q: Is
shuf
truly random? - A:
shuf
uses a pseudo-random number generator (PRNG). While it's suitable for most purposes, for cryptographic applications, consider using a stronger random source like/dev/urandom
with the--random-source
option. - Q: How can I shuffle lines in place (i.e., modify the original file)?
- A:
shuf
doesn't directly support in-place shuffling. You can achieve this by redirecting the output to a temporary file and then replacing the original file with the temporary file. For example:shuf input.txt > temp.txt && mv temp.txt input.txt
- Q: What happens if I try to shuffle an empty file?
- A: If you try to shuffle an empty file,
shuf
will simply produce no output. - Q: Can I use shuf to generate random numbers within a specific range?
- A: Yes, you can use the `-i` option followed by the range of numbers you want to generate (e.g., `shuf -i 1-100`).
Conclusion
shuf
is a deceptively simple yet incredibly useful command-line tool for introducing randomness into your workflows. Its ability to shuffle lines from files, standard input, or generate random sequences makes it a valuable asset for data manipulation, scripting, and more. Embrace the power of randomness – give shuf
a try in your next project! For more information and advanced usage scenarios, visit the official GNU Core Utilities documentation.