How to Run Commands from Standard Input Using Tee and Xargs in Linux

Channel: Linux Commands Linux
Abstract: the second command converts muti-line output into single line using xargs. $ ls -1 *.shuse the commands below. $ ls *.sh | xargs wc -l #count numb

While using the command line, you can directly pass the output of one program (for example a tool that generates some system information or statistics) as input for another program (such as text-filtering or pattern searching tools like grep, sed or awk, for further processing), using a pipeline.

Read Also: Learn The Basics of How Linux I/O (Input/Output) Redirection Works

Two of the most important command line utilities that can be used with pipelines to build command lines are:

  • xargs – reads streams of data from standard input, then generates and executes command lines.
  • tee – reads from standard input and writes simultaneously to standard output and one or many files. It’s more of a redirection command.

In this simple article, we will describe how to build and execute multiple commands from standard input using pipes, tee and xargs commands in Linux.

The simplest syntax for using a pipe, which you might have already seen in commands in many of out Linux tutorials, is as follows. But you can build a longer command line with several commands.

$ command1 args | command2 args 
OR
# command1 args | command2 args | command3 args ...

Below is an example of using a pipeline to pass the output of dmesg command to head command.

$ dmesg | head
Pass Command Output to Another Command How to Use xargs to Run Commands

In this example, the second command converts muti-line output into single line using xargs.

$ ls -1 *.sh
$ ls -1 *.sh | xargs
Run Commands Using Xargs

To count the number of lines/words/characters in each file in a list, use the commands below.

$ ls *.sh | xargs wc -l	    #count number of lines in each file
$ ls *.sh | xargs wc -w	    #count number of words in each file
$ ls *.sh | xargs wc -c	    #count number of characters in each file
$ ls *.sh | xargs wc	    #count lines, words and characters in each file
Count File Words Using Xargs

The command below finds and recursively deletes the directory named All in the current directory.

$ find . -name "All" -type d -print0 | xargs  -0 /bin/rm -rf "{}"

The find command with option -print0 action enables printing of the full directory path on the standard output, followed by a null character and -0 xargs flag deals with space in filenames.

You can find other practical xargs command usage examples in these articles:

  1. How to Copy a File to Multiple Directories in Linux
  2. Rename All Files and Directory Names to Lowercase in Linux
  3. 4 Ways to Batch Convert Your PNG to JPG and Vice-Versa
  4. 3 Ways to Delete All Files in a Directory Except One or Few Files with Extensions
How to Use Tee with Commands in Linux

This example shows how to send command output to standard output and save to a file; the command below allows you to view top running processes by highest memory and CPU usage in Linux.

$ ps -eo cmd,pid,ppid,%mem,%cpu --sort=-%mem | head | tee topprocs.txt
$ cat  topprocs.txt
Save Command Output to File

To append data in an existing file(s), pass the -a flag.

$ ps -eo cmd,pid,ppid,%mem,%cpu --sort=-%mem | head | tee -a topprocs.txt 

You can find more information in tee and xargs man pages.

$ man xargs
$ man tee

That’s all! Do not forget to check out our special article: A – Z Linux Commands – Overview with Examples.

In this article, we described how to generate command lines using pipelines; xargs and tee commands. You can ask any questions or share any thoughts via the feedback form below.

Ref From: tecmint
Channels: Linux Tricks

Related articles