在使用Linux命令行时,你可以使用管道(Pipe)直接传递一个程序(例如生成一些系统信息或统计信息的工具)的输出作为另一个程序的输入(例如文本过滤或模式搜索工具,包括grep、sed或awk,用于进一步处理),其实用性非常强。
目前可与管道一起使用以构建命令行的两个最重要的命令行实用程序是:
- xargs:从标准输入读取数据流,然后生成并执行命令行。
- tee:从标准输入读取并同时写入标准输出和一个或多个文件,其实它更像是一个重定向命令。
在Linux中将命令输出传递到另一个命令
首先将介绍如何在Linux系统中使用pipes、tee和xargs命令从标准输入构建和执行多个命令。
使用管道的最简单语法如下所示,或许之前你已经在其它教程中看到过。但是这里可以使用多个Linux命令构建一个更长的命令行,如下所示:
$ command1 args | command2 args 或者 $ command1 args | command2 args | command3 args ...
下面是使用管道将dmesg命令的输出传递给head命令的示例:
$ dmesg | head
Xargs:将命令输出传递给其它命令
在此示例中,ls命令输出将传递给另一个名为xargs的命令,该命令将多行输出连接到一行,如下所示:
$ ls -1 *.sh $ ls -1 *.sh | xargs
要计算列表中每个文件的行数/单词数/字符数,请使用以下命令:
$ ls *.sh | xargs wc -l #计算每个文件的行数 $ ls *.sh | xargs wc -w #统计每个文件的字数 $ ls *.sh | xargs wc -c #统计每个文件中的字符数 $ ls *.sh | xargs wc #计算每个文件中的行数、单词数和字符数
下面的All
命令查找并递归删除在当前目录中命名的目录,如下所示:
$ find . -name "All" -type d -print0 | xargs -0 /bin/rm -rf "{}"
如上所示,带有-print0
选项操作的find命令可以在标准输出上打印完整的目录路径,后跟空字符和xargs -0
标志处理文件名中的空格,以及用于删除目录的rm -rf命令。
Tee:将命令输出发送到其他命令并保存到文件
此示例显示如何将命令输出发送到标准输出并将其保存到文件中,下面的命令允许你查看Linux中内存和CPU使用率最高的运行进程。
$ ps -eo cmd,pid,ppid,%mem,%cpu --sort=-%mem | head | tee topprocs.txt $ cat topprocs.txt
要在现有文件中附加数据,请传递-a
标志。
$ ps -eo cmd,pid,ppid,%mem,%cpu --sort=-%mem | head | tee -a topprocs.txt
此外,你可以在tee和xargs手册页上找到更多信息。
$ man xargs $ man tee
总结
在上述内容中,主要介绍如何使用管道(xargs和tee命令)生成命令行,使用语法非常的简单,但用起来分成方便,感兴趣的小伙伴可以了解了解。
众所周知,Pipe是一个Unix/Linux系统中的命令行工具,它允许将一个命令的输出直接作为另一个命令的输入。通过使用管道,可以在不创建临时文件的情况下将多个命令链接在一起,实现更复杂的操作。管道使用竖线符号(|)来连接命令。当一个命令的输出通过管道传递给另一个命令时,第一个命令的输出将成为第二个命令的输入。这使得数据可以流经多个命令进行处理和转换。
通过合理地组合多个命令和管道,可以实现更复杂的数据处理和操作,提高命令行的效率和灵活性。所以管道是Unix/Linux系统中非常有用且强大的工具之一。