next up previous contents index
Next: 3.8.4 Non-destructive redirection Up: 3.8 UNIX Plumbing Previous: 3.8.2 Redirecting input and

3.8.3 Using pipes

  We've already demonstrated how to use sort as a filter. However, these examples assumed that you had data in a file somewhere, or were willing to type the data to standard input yourself. What if the data you wanted to sort came from the output of another command, such as ls? For example, using the -r option with sort sorts the data in reverse-alphabetical order. If you wanted to list the files in your current directory in reverse order, one way to do it would be:

/home/larry/papers# ls
english-list
history-final
masters-thesis
notes
/home/larry/papers# ls > file-list
/home/larry/papers# sort -r file-list
notes
masters-thesis
history-final
english-list
/home/larry/papers#

Here, we saved the output of ls in a file, and then ran sort -r on that file. But this is unwieldy and causes us to use a temporary file to save the data from ls.

    The solution is to use pipelining. Pipelining is another feature of the shell which allows you to connect a string of commands in a ``pipe'', where the stdout of the first command is sent directly to the stdin of the second command, and so on. Here, we wish to send the stdout of ls to the stdin of sort. The ``|'' symbol is used to create a pipe:

/home/larry/papers# ls sort -r
notes
masters-thesis
history-final
english-list
/home/larry/papers#

This command is much shorter, and obviously easier to type.

Another useful example---using the command

/home/larry/papers# ls /usr/bin

is going to display a long list a files, most of which will fly past the screen too quickly for you to read them. Instead, let's use more to display the list of files in /usr/bin.

/home/larry/papers# ls /usr/bin more

Now you can page down the list of files at your own leisure.

But the fun doesn't stop here! We can pipe more than two commands together. The command head is a filter which displays the first lines from an input stream (here, input from a pipe). If we wanted to display the last filename in alphabetical order in the current directory, we can use:

/home/larry/papers# ls sort -r head -1
notes
/home/larry/papers#

where head -1 simply displays the first line of input that it receives (in this case, the stream of reverse-sorted data from ls).  



next up previous contents index
Next: 3.8.4 Non-destructive redirection Up: 3.8 UNIX Plumbing Previous: 3.8.2 Redirecting input and



Matt Welsh
mdw@sunsite.unc.edu