Fundamentals of Unix Tutorial PIPE Commands and REDIRECTION Commands – CH 7 The content of this tutorial also applies to linux. Piping UNIX supports and makes extensive use of the ability to connect commands to one another. By piping commands together, you can use the output of one command as the input for another. The pipe symbol is | (a vertical bar). To pipe commands together you simply place a pipe between each command on the command line. For example command1 | command2 | command3 Although you can pipe many commands together, you'll rarely need to do so. Examples of using pipes to connect commands Here are some examples you can learn from and adapt for your own uses. If you don't completely understand the commands are that are being piped, look them up in other parts of this tutorial or in the glossary of the CiscoSun online curriculum. Example: ls -alFs | more This command sends the output of the ls command with the options alFs to the more command. The options used with ls indicate that all files, including hidden ones will be listed, in long form, marking directories with a slash (/), executables (programs) with an asterisk (*), and the size of each file will be listed as well. Normally such a list would scroll by too quickly to view, but by piping the output through the more command you can view one page at a time. Example: who | wc -l This command takes the output from the who command which lists everyone currently logged in to the system and passes the information to the wc command which, using the -l option, counts the number of lines that the who command generated. Since who generates a line for each person logged in, the number of lines is equal to the number of people logged in to the system. Example: who | grep Chris Similar to the first example, this command pipes the output of the who command to the grep command which searches for instances of the letters "Chris". If grep finds a line containing the letters, grep prints the line(s) to the screen. This command would tell you how many people with the user name Chris are logged in. Example: Connecting several commands together: ps –ef | grep joe | sort +5 –6 | less The first command, ps –ef, outputs information about the processes currently running. This information becomes the input to the command grep joe which searches for any lines that contain the username "joe". The output from this command is then sorted on the sixth field of each line, with the output being displayed one screenful at a time using the less pager (similar to more). Redirection Normally everything you do on the keyboard is sent to the computer screen for your viewing pleasure. That is, when you type a command, the letters you type are sent to the screen so you can see what you're typing. The results of the command are also sent to the screen so you can see what happened. Your typing on the keyboard is the "input" and what you see on the screen is the "output." To UNIX, a computer screen and a file are forms of output. The screen is the standard output, normally abbreviated as "stdout." With redirection you can send output to files instead of the screen, or you can use what's in a file as the input for a command. With redirection you can change where the computer gets input, and where it puts output. You use the symbols < , > , >> , and 2> to redirect input and output. Examples of using redirection Redirecting standard output: To redirect the standard output from a command use the > (greater than) symbol followed by the name of the output file. If the file that you redirect standard output to does not already exist it will be created. Example: ls -la > mydir This command lists all the files and directories in long form, and sends them to the file mydir. If the file mydir does not exist, it will be created. If it does exist it will be overwritten with the new data. When you execute this command, you will not see anything appear on the screen (unless there is an error – that is described below). Example: grep Smith /etc/passwd > popular This redirects the standard output from the grep command so that it goes to the file popular. This file will contain all the lines containing occurrences of the string “Smith” that were found in the /etc/passwd file. Example: cat section1 section2 section3 > Chapter1 This example connects (concatenates) several files in order, and outputs them as one file, Chapter1. The cat command reads files section1 through section3 in turn and appends them to (tacks them onto the end of) the file Chapter1. The contents of section2 are appended to section1 and so on. Example: who > people This prints the list of active users to the file people. Example: sort file1 > sorted_list This sorts the contents of file1 and saves the sorted list as sorted_list. Appending standard output: To append the standard output from a command to a file, use two >> (greater than) symbols followed by the name of the file. If the file does not exist it is created. For example: Example: ls >> mydir This appends the data from a short form directory listing to the data (if any) already in the file mydir. Example: If you wanted to add one more section to the file Chapter1, created earlier, you'd append the text using the command cat section4 >> Chapter1 to make sure the text that already exists in the file isn't disturbed. Redirecting standard input: Redirecting input is just as easy. For example, say you want to mail someone the directory list you just made, called mydir. Instead of having to import it into a mail program, you can redirect the input for the mail command: Example: mail Tony < mydir This command uses the contents of the mydir file as the input for the mail command. The effect of this is to mail the contents of this file to the user Tony. Redirecting error output: Even though you send the standard output to a file, if an error occurs the error message will be sent to your screen. This is because the standard error output, or “stderr”, is the screen. If you wish to redirect error messages to a file for troubleshooting purposes, use the 2> symbol. For example: cat file1 file2 file3 2> Error_Log Any errors that occur during the execution of this command will be included in Error_Log. Since we are troubleshooting, the output, if any, of the command will probably be incorrect. If there is any output, it will be directed to the screen, since we did not direct it to a file. We directed only the error messages to a file so we could have a record of them. Example of combining piping and redirection You can combine piping with redirection to create files that contain the output. Example: who | grep Chris > List_of_Chris In the example above, the list of lines from the who command containing the letters "Chris" is redirected from the screen (the standard output device) to the file List_of_Chris. You could view the resulting text file with a viewer such as the more command, or an editor such TED or Nedit, or the text editor in the Solaris CDE.