Linux shuf Command Tutorial for Beginners (with Examples)

If you ever played the game of cards, you'd likely be aware of the term shuffling. A bit hard to imagine, there's a Linux command line tool that exactly does that with lines in files. In this tutorial, we will discuss the basics of the 'shuf' command using some easy to understand examples.

But before we do that, it's worth mentioning that all examples here have been tested on an Ubuntu 18.04 LTS machine.

Linux shuf command

The shuf command in Linux lets you generate random permutations. Following is its syntax:

shuf [OPTION]... [FILE]

And here's is how the tool's man page explains it:

Write a random permutation of the input lines to standard output.

Following are some Q&A styled examples that should give you a better idea on how the shuf command works.

Q1. How to use shuf command?

Basic usage is very simple. Just pass a file name as input. Here's an example:

shuf test.txt

Now, the test.txt file contains the following lines:

1
2
3
4
5
6
7
8
9

But the shuf command above produced the following output:

3
4
6
5
1
8
2
7
9

So you can see the lines got shuffled.

Q2. How to limit the number of lines in output?

If you want to limit the number of lines in shuf output, use the -n command line option, which requires you to pass a number that represents the maximum count of lines you want in output.

For example:

shuf -n 3 test.txt

The above command produced the following output:

6
4
9

Q3. How to allow repetition of lines in output?

Suppose the input file contains 9 lines, but you want shuf to produce more lines than that in output (using the -n option discussed above). This can be done using the -r option.

-r, --repeat
              output lines can be repeated

So if you want shuf to produce 25 lines in output, then run the following command:

shuf -r -n 25 test.txt

Here's the output this command produced:

6
8
4
5
9
3
3
1
2
5
7
5
9
5
8
5
2
8
8
7
4
4
8
5
3

Q4. How to make shuf treat input arguments as lines?

For this, use the -e command line option. Here's an example:

shuf -e 1 2 3 4 5 6 7 8 9

Here's the output produced by this command:

9
1
7
8
6
2
3
5
4

Conclusion

Agreed, shuf is not the kind of tool you'd require every day, but there's no harm in learning about this utility especially since its learning curve is not that steep. Once you're done practicing whatever we've discussed here, head to the tool's man page to know more about it.

Share this page:

6 Comment(s)

Add comment

Please register in our forum first to comment.

Comments

By: phil

You can use the seq command to generate the sequence of number. seq 10 will generate the numbers 1 through 10 which you can pipe to shuf.

By: alex

Why would you even want to use simple numerical sequences as sample input for <code>shuf</code>, when there is the option -i to accomplish exactly that.

By: Pedro

Para GNU 8.26 no acaba de funcionar del todo bien,al realizar dentro de un bash#!/bin/bashvalor=$(shuf -ze -n6 {A..Z} {a..z} {1..9} )me escupe con el texto:AVISO: command substitution: ignored null byte in input.

**************************************************************

For GNU 8.26 it doesn't quite work quite right, when performing within a bash

#!/bin/bash

value = $ (shuf -ze -n6 {A..Z} {a..z} {1..9})

spits me out with the text:

WARNING: command substitution: ignored null byte in input.

 

 

By: alex

Remove the -z option from the command to get rid of the warning.

By: Alex

Just to be sure: does shuf -n 1 file have the same effect as shuf file | head -1 ? It's hard to check empirically ;-)

By: alex

Yes, the output from these two commands will be the same.