Need Randomness? Unleash the Power of ‘shuf’
In the world of data manipulation and scripting, the need for randomness often arises. Whether you’re generating test data, selecting random samples, or creating unique identifiers, having a reliable tool for shuffling data is essential. Enter shuf, a simple yet powerful command-line utility that allows you to generate random permutations of input with ease. This article explores the ins and outs of shuf, demonstrating its functionality through practical examples and offering best practices for its effective use.
Overview

shuf, short for “shuffle,” is a command-line utility that is part of the GNU Core Utilities package. It is designed to read input from various sources, such as files or standard input, and produce a randomized permutation of that input as standard output. What makes shuf ingenious is its simplicity and efficiency. It’s a single-purpose tool that performs its task admirably, making it an invaluable asset in any programmer’s or system administrator’s toolkit. It excels at tasks where you need to introduce randomness into your workflows. For instance, selecting a random subset of lines from a large log file for analysis, or generating a set of unique, randomized passwords from a dictionary file.
Installation

shuf is typically pre-installed on most Linux and Unix-like systems. If, for some reason, it’s missing, you can easily install it using your system’s package manager. The package it belongs to is often called coreutils.
Debian/Ubuntu:
sudo apt update
sudo apt install coreutils
CentOS/RHEL/Fedora:
sudo yum install coreutils
macOS (using Homebrew):
brew install coreutils
Note: on MacOS, the command is installed as gshuf, not shuf. You can alias it using alias shuf=gshuf in your .bashrc or .zshrc.
After installation, verify that shuf is available by running:
shuf --version
This command should display the version information of the shuf utility.
Usage
The basic syntax of the shuf command is:
shuf [OPTION]... [INPUT-FILE]
If no input file is specified, shuf reads from standard input.
Example 1: Shuffling Lines from a File
Let’s start with a simple example. Suppose you have a file named names.txt containing a list of names, one name per line:
cat names.txt
Alice
Bob
Charlie
David
Eve
To shuffle the lines in this file and print the result to the console, use the following command:
shuf names.txt
The output will be a random permutation of the names, for example:
Bob
Alice
Eve
David
Charlie
Each time you run this command, you’ll get a different random order.
Example 2: Shuffling Standard Input
shuf can also read from standard input. You can pipe the output of another command to shuf to shuffle its results. For example, to shuffle a list of numbers generated by the seq command:
seq 1 10 | shuf
This will generate the numbers 1 through 10 in a random order. A possible output would be:
4
2
7
1
9
5
8
3
6
10
Example 3: Specifying a Range
The -i option allows you to specify a range of numbers to shuffle. The syntax is -i LO-HI, where LO is the lower bound and HI is the upper bound of the range.
shuf -i 1-5
This command shuffles the numbers from 1 to 5 (inclusive). A possible output:
3
1
5
2
4
Example 4: Sampling Without Replacement
The -n option allows you to select a specified number of lines from the input. This is useful for creating random samples. By default, shuf samples *without* replacement, meaning that an element is selected only once.
shuf -n 3 names.txt
This will select 3 random names from the names.txt file. For example:
Charlie
Alice
Bob
Notice how it only outputs 3 names, even though the file contains 5. If you ask for more samples than are available, it will output the maximum number of samples possible (in this case, all the lines in the input file).
Example 5: Sampling With Replacement
To sample with replacement (allowing the same element to be selected multiple times), use the -r option in conjunction with -n. This can lead to duplicate outputs.
shuf -n 3 -r names.txt
A possible output could be:
Alice
Charlie
Alice
Notice that “Alice” appears twice in the output.
Example 6: Writing to a File
You can redirect the output of shuf to a file using the > operator.
shuf names.txt > shuffled_names.txt
This will create a new file named shuffled_names.txt containing the randomized names.
Example 7: Generating Random Passwords
shuf can be used to generate random passwords. First, create a file containing a set of characters (e.g., letters, numbers, symbols):
cat characters.txt
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
0
1
2
3
4
5
6
7
8
9
!
@
#
$
%
^
&
*
Then, use shuf with the -n and -r options to select a random set of characters with replacement:
shuf -n 12 -r characters.txt | tr -d '\n'
The tr -d '\n' command removes the newline characters, creating a single password. The output will be a 12-character random password, such as:
g3$v8x@p2j6k
Tips & Best Practices
- Understand Sampling: Be aware of the difference between sampling with and without replacement. Use
-rfor sampling with replacement, and omit it for sampling without replacement. Sampling without replacement ensures uniqueness. - Seed Randomness: For reproducibility, you can set a specific seed using the
--random-source=FILEoption. This option is typically used with a file like/dev/urandomor a custom file containing random bytes to provide the source of randomness. Note: true reproducibility is generally not desired in security-sensitive scenarios, like password generation. - Handle Large Files:
shufreads the entire input into memory before shuffling. For very large files, this could lead to memory issues. Consider splitting the file into smaller chunks or using alternative tools likesort -R(though this might have performance limitations for very large files). - Combine with Other Tools:
shufshines when combined with other command-line utilities likegrep,awk, andsedto perform more complex data manipulations. - Error Handling: While
shufis generally robust, ensure your input data is clean and well-formatted to avoid unexpected behavior. For instance, ensure lines are properly delimited if you intend to shuffle lines from a file.
Troubleshooting & Common Issues
shuf: memory exhausted: This error occurs whenshuftries to load a very large input into memory. Try processing the data in smaller chunks or using a different tool.- Unexpected output: Make sure the input data is in the expected format. For example, if you’re shuffling lines from a file, ensure each line is properly terminated with a newline character.
- Inconsistent results: If you’re not seeding the random number generator, the results will be different each time you run
shuf. This is expected behavior, but if you need reproducible results, use the--random-sourceoption. - Missing
shufcommand: Ifshufis not found, ensure that the GNU Core Utilities package is installed correctly and that the system’s PATH environment variable includes the directory whereshufis located (usually/usr/binor/usr/local/bin). - Permissions errors: If you are trying to read a file that you do not have permissions to read,
shufwill throw an error. Ensure you have the correct read permissions on the input file.
FAQ
- Q: Can
shufhandle binary files? - A: While
shufcan process binary files, the results may not be meaningful unless the binary data represents text or structured data that can be logically shuffled. Usually,shufis used for shuffling lines of text. - Q: How can I shuffle lines based on a specific delimiter other than newline?
- A:
shufis designed to work with newline-delimited lines. To handle other delimiters, you might need to preprocess the data using tools liketrto replace the delimiter with newlines, then shuffle, and finally revert the change. - Q: Is
shufcryptographically secure for generating random numbers? - A: No,
shufis not designed for cryptographic purposes. Use tools like/dev/urandomoropenssl randfor generating cryptographically secure random numbers. - Q: How do I shuffle the characters within each line of a file, rather than shuffling the lines themselves?
- A: You’d need to use a more complex script, potentially involving tools like
sed,awk, and a scripting language like Python or Perl, to iterate through each line and shuffle its characters individually. - Q: Can `shuf` be used in shell scripts?
- A: Absolutely. `shuf` is perfectly suited for use in shell scripts to introduce randomness into various tasks, such as selecting random files for processing, choosing random configuration options, or creating randomized test scenarios.
Conclusion
shuf is a versatile and practical command-line tool for generating random permutations of input data. Its simplicity and efficiency make it a valuable addition to any programmer’s or system administrator’s arsenal. From shuffling lines in a file to generating random passwords, shuf provides a straightforward solution for introducing randomness into your workflows. Experiment with shuf and discover how it can simplify your data manipulation tasks. For more information and advanced options, visit the official GNU Core Utilities documentation.