Need Randomness? Unleash the Power of Shuf!
In the world of data manipulation, sometimes you need to introduce a little chaos – controlled chaos, that is. The shuf
command-line utility provides the perfect solution for generating random permutations of your input data. Whether you’re shuffling lines in a file, creating random samples, or simply need a bit of unpredictability in your scripts, shuf
is your go-to tool. It’s a simple yet powerful utility that can significantly streamline your workflows.
Overview: Shuffling Made Simple

shuf
, part of the GNU Core Utilities, is a command-line gem designed to output random permutations of its input. It reads input from files or standard input and then writes a randomized version to standard output. The ingenuity lies in its straightforward approach: it efficiently handles both small and large datasets without requiring complex configurations. Unlike custom scripting solutions that can be resource-intensive and prone to errors, shuf
offers a robust and optimized solution. Its power rests in its simplicity and its broad application, making it an essential tool in any Linux/Unix user’s arsenal. Think of it as a deck of cards – shuf
efficiently reshuffles the deck for you.
Installation: Getting Shuf

The good news is that shuf
is generally pre-installed on most Linux and Unix-like systems as part of the GNU Core Utilities. However, if for some reason it’s missing or you want to ensure you have the latest version, you can usually install or update it via your system’s package manager.
Here are some examples:
- Debian/Ubuntu:
sudo apt update sudo apt install coreutils
- Fedora/CentOS/RHEL:
sudo dnf install coreutils
- macOS (using Homebrew):
brew install coreutils # You may need to use gshuf instead of shuf on macOS to avoid conflicts alias shuf='gshuf'
After installation, verify that shuf
is available by running:
shuf --version
This command should print the version information for the shuf
utility.
Usage: Step-by-Step Examples

Now, let’s explore the various ways you can use shuf
to introduce randomness into your data:
1. Shuffling Lines in a File
This is the most common use case. To shuffle the lines in a file named data.txt
, simply run:
shuf data.txt
This will print the lines of data.txt
in a random order to your terminal. The original data.txt
file remains unchanged.
2. Shuffling from Standard Input
shuf
can also read from standard input. This allows you to pipe data from other commands directly into shuf
. For example, to shuffle the output of the ls
command (listing files in the current directory):
ls | shuf
This will display the list of files in a randomized order.
3. Selecting a Random Sample
The -n
option allows you to specify the number of lines you want to select randomly from the input. This is useful for creating random samples. To select 3 random lines from data.txt
:
shuf -n 3 data.txt
This will print 3 randomly selected lines from the file. If the file has fewer than 3 lines, it will print all the lines in a random order.
4. Generating a Random Sequence of Numbers
shuf
can generate a random sequence of numbers using the -i
option. This option takes two arguments: the start and end of the range. For example, to generate a random permutation of numbers from 1 to 10:
shuf -i 1-10
This will print the numbers 1 through 10 in a random order, each on a new line.
5. Controlling the Output with -e and Echo
The `-e` option treats each argument as a separate input line. This is especially useful when combined with `echo` to generate a list of items to shuffle:
echo "apple" "banana" "cherry" | xargs -n 1 | shuf
OR even more simply:
shuf -e "apple" "banana" "cherry"
This will randomly output one of “apple”, “banana”, or “cherry” on each line.
6. Shuffling with a Specific Seed for Reproducibility
For testing or demonstration purposes, you might want to reproduce the same random sequence. The --random-source
option allows you to specify a file containing random data, essentially setting a seed. Note that truly setting a seed like in other programming languages isn’t directly possible with shuf
in the traditional sense. However, you can achieve a similar effect by using a consistent random source (though the practical implications are limited, especially for security-sensitive applications, as repeatedly using the same small “random source” would quickly become predictable). This approach primarily ensures consistency across different invocations of `shuf` *given the same input data and the same ‘random’ source file*.
First, create a “random” file, keeping in mind the note about limited practical security:
head -c 1024 /dev/urandom > my_random_source.bin
Then use it:
shuf --random-source=my_random_source.bin data.txt
**Important Note:** Using the same file as a random source repeatedly does *not* guarantee identical output across different versions of `shuf` or even different operating systems. The underlying algorithms used by `shuf` might vary, leading to different shuffling results. The primary use case is to ensure the *same* shuffled order when running `shuf` *multiple times on the same system with the same input data*. If you need cryptographic randomness, use a dedicated library or tool designed for that purpose.
7. Dealing with Very Large Files
shuf
handles large files efficiently. However, performance can be improved if you know the approximate size of the input beforehand. If you are working with a very large file and only need a small sample, using -n
to limit the output is crucial for efficiency. Without -n
, shuf
will read the entire file into memory before shuffling, which can be slow and resource-intensive for extremely large files.
Tips & Best Practices

* **Understand the Input:** Be aware of the format and size of your input data. This will help you choose the appropriate options and optimize performance.
* **Use `-n` for Sampling:** If you only need a subset of the data, use the -n
option to specify the number of lines to select.
* **Pipe and Redirect:** Combine shuf
with other command-line tools using pipes (|
) and redirection (>
) to create powerful data processing pipelines.
* **Be Mindful of Randomness:** While shuf
provides a good level of randomness for most use cases, it’s not suitable for cryptographic applications. If you need truly random numbers for security purposes, use a dedicated random number generator.
* **macOS consideration:** Remember to use `gshuf` if you are using the GNU version of `shuf` installed via Homebrew on macOS.
Troubleshooting & Common Issues
* **`shuf: standard input: Cannot allocate memory`:** This error typically occurs when shuf
is trying to read a very large input from standard input without the -n
option to limit the output. Try to use -n to limit amount of the input.
* **Incorrect Output:** If you are not getting the expected output, double-check your command-line options and input data. Make sure you are using the correct file paths and that the input data is in the expected format.
* **`command not found: shuf`:** If you get this error, it means that the shuf
command is not installed or is not in your system’s PATH. Refer to the Installation section above for instructions on how to install shuf
.
FAQ
* **Q: Can I shuffle columns instead of rows?**
* A: shuf
is designed for shuffling lines (rows). To shuffle columns, you would need to use a more complex approach involving tools like awk
or cut
to transpose the data, shuffle the transposed data, and then transpose it back.
* **Q: Is `shuf` cryptographically secure?**
* A: No. While the randomness is adequate for many purposes, `shuf` is not designed for cryptographic applications. Use a dedicated cryptographic library or tool for secure random number generation.
* **Q: How can I shuffle a list of files and then process them one by one?**
* A: You can combine `shuf` with a loop in your shell script:
for file in $(ls | shuf); do
# Process the file here
echo "Processing: $file"
done
* **Q: Can I use shuf to create a random password?**
* A: While you *can* use `shuf` in combination with other tools (like `head` and `/dev/urandom`) to *contribute* to password generation, directly relying solely on `shuf` for secure password creation is **not recommended**. Use dedicated password generation tools for strong, cryptographically secure passwords. Something like: `head /dev/urandom | tr -dc A-Za-z0-9!@#$%^&*()_+|~=`{}[]:;?><,./' | head -c 16 ; echo` which is far more suitable.
* **Q: How do I ensure that the same random order is generated every time I run shuf?**
* A: While `shuf` itself doesn't have a direct seed option, you can achieve a similar effect (limited in scope, see above) by using the `--random-source` option with a fixed file. Be aware of the limitations of this approach described earlier; it's primarily for *consistent* results on the *same* system, *not* cryptographic reproducibility.
Conclusion
shuf
is a versatile and powerful command-line tool for generating random permutations of data. Its simplicity and efficiency make it an indispensable part of any Linux/Unix user’s toolkit. Whether you’re shuffling lines in a file, creating random samples, or adding a touch of randomness to your scripts, shuf
has you covered. So, go ahead and give it a try! Explore the options, experiment with different use cases, and discover how shuf
can streamline your data manipulation workflows. Visit the GNU Core Utilities page for the official documentation and more information.