Can the output of one command be piped to two other commands?
How can I pipe the output of one command to the input of two other commands simultaneously?
Solution 1:
It sounds like the tee
command will do what you want.
The key is to use
>( )
for process substitution. With tee
, use the following pattern:
tee >(proc1) >(proc2) >(proc3) | proc4
So if you wanted to use the output of ls
as input to two different grep
programs, save the output of each grep
to different files, and pipe all of the results through less
, try:
ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less
The results of the ls -A
will be "piped" into both grep
s. The file hidden-files
will have the contents from the output of the first grep
, and normal-files
will have the results of the second grep
. All of the files will be shown in the pager EDIT: what you see in less
.less
is the same exact output of ls -A
, not the result of the grep
s. If you want to modify the output from ls -A
to less
, (e.g. swapping the order so normal files are listed before hidden ones) then try this:
ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less
Without >/dev/null
, the output of grep
s would be appended to the output of ls -A
instead of replacing it.
source
Solution 2:
Use "tee".
Example:
grep someSearchString someFile | tee /dev/tty | wc -l > grepresult
This will send the output of the grep command to both the terminal and to wc (whose output is in turn redirected to the file grepresult).
"Tee" is explained in the Wikipedia article tee (command). Central is: "The tee command reads standard input, then writes its content to standard output and simultaneously copies it into the specified file(s) or variables.".