管道和xargs的问题

***大家好,我是Linux初学者,对于管道和xargs的区别一直不是很清晰,最近查了很多博客,通过总结各位大牛的文章,发表一下我对管道和xargs的见解。***
举个经典的例子:首先当前目录处于/root,里面有anaconda-ks.cfg, a.txt, install.log, install.log.syslog,四个文件。键入以下命令:

echo ‘--help‘ | ls 单纯的管道
echo ‘--help‘ | xargs ls xargs命令

第一条命令的结果:
anaconda-ks.cfg, a.txt, install.log, install.log.syslog

第二条命令的结果:(太长了,截一点,具体可以动手自己试试)
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.

这说明了什么?大家都知道echo是输出指定字符串,ls是显示目标列表。

说明了第一条命令是通过管道传过来纯文本,ls识别不了。可以这样理解,ls命令后面要跟的就是一个实体的目录,比如一个箱子,而前面命令结果给的是一大堆文字,他不认识;第二个命令,是将前面命令的结果作为参数给后面命令使用,那不就是ls的--help帮助命令嘛。
如果还不是很清晰,再来一条试试。
/data目录下有a.txt b.txt c.txt
find /data -type f -name ‘.txt‘ | grep ‘.txt‘
find /data -type f -name ‘
.txt‘ | xargs grep ‘.txt‘

         第一条命令的结果是
         /data/a.txt
         /data/b.txt
         /data/c.txt
         第二条命令的结果是什么都没有

         为什么会这样呢?
         其实大家通过多尝试,可以总结出,管道相当于把前面命令处理的结果当作了纯文本文字传递给了后面的命令,grep是对文本过滤的命令,所以第一条命令过滤出了带有“.txt”字样的文本;而xargs相当于把前面命令处理的结果当作文件传递给后面命令处理,你想想,grep能处理文件码?不能是吧,所以什么结果都不会显示。
         总结:使用管道还是xargs取决于你后面的命令要处理什么,如果是纯文本文字,用管道;如果是文件,用xargs。

         附言:我也是个新手,这些是看了很多博客总结出来的,有可能不是很对,哪有错误希望大家多指出,写文章是为了加强理解和记忆,希望在未来的路上,我们共同努力,能够打拼出一片属于自己的天下。
                                                                                                                         伟
                                                                                                                         2018/10/17

原文地址:http://blog.51cto.com/13849532/2301016

时间: 2024-11-20 11:38:14

管道和xargs的问题的相关文章

linux(5)--补充(管道| / 重定向> / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)

本节中正则表达式的工具程序 grep,sed和awk是重点,也是难点!!! 先补充一下一. 管道| / 重定向> / xargs 如:1. 管道和重定向的区别:具体可以见 http://www.cnblogs.com/chengmo/archive/2010/10/21/1856577.html以此为例: cat test.sh test1.sh 2>/dev/null | grep -n 'echo' 此时若test.sh 不存在,报错信息不会输出到屏幕中,而是转入 /dev/null中,如

管道和xargs的理解

最近学习了linux的一些命令,看到一连串的管道符合xargs就懵球子了.就仔仔细细的学了学二者的区别 先总体说一下区别: 管道符 |  的意思就是说,将前一个命令的标准输出作为后面一个命令的标准输入. xargs 的意思就是说,把标准输入格式化为一行,作为后面的命令的命令行参数. 下面我们举个栗子 : 看懂了没? cat file.txt 我们看到文件里面是什么内容,然后我们再次 cat file.txt | xargs 一下,发现结果都变成一行了,这就是所谓的格式化为一行. 接下来我们看,c

老男孩教育每日一题-2017年5月18日-说说|(管道)与|xargs(管道xargs)的区别

1.题目 2.参考答案 find  |xargs ls -ld##把前一个命令的结果,通过管道传递给后面的命令(ls -ld),传递的是文件名find  | 命令    ##把前一个命令的结果,通过管道传递给后面的命令,传递的是普通的文本,文字,字符串 测试方法1-sed -i参数 sed -i参数修改文件内容,后面必须要加上文件名否则会报错.no input file [[email protected] ~]# find  /oldboy/ -type f  -name "*.sh"

管道和xargs区别

一直弄不懂,管道不就是把前一个命令的结果作为参数给下一个命令吗,那在 | 后面加不加xargs有什么区别 NewUserFF 写道: 懒蜗牛Gentoo 写道: 管道是实现"将前面的标准输出作为后面的标准输入" xargs是实现"将标准输入作为命令的参数" 你可以试试运行: 代码: echo "--help"|cat echo "--help"|xargs cat 看看结果的不同. 试过了,依然不是很确定的明白到底是什么意思,

管道命令xargs

在研究hadoop的过程中,遇到一个小难题. 问题描述:我需要将文件夹A下的文件拷贝到文件夹B中,但是以hadoop开头的文件不要拷贝. 问题解决:ls  A|grep -v hadoop|xargs -t -I {} cp {} /B 解释:grep -v 是反选.xargs命令的功能是将管道传来的的信息作为参数赋予马上要执行的命令. 如果该命令是单参数指令,例如rm,那么很简单: ls A|xargs rm  即可. 如果该命令是多参数指令,例如cp.那可如何是好? 可以赋予-I(是大写的i

对find,xargs,grep和管道的一些深入理解

转自于:http://fatmouse.xyz/2016/05/10/2016-05-10-find-grep-xargs-and-pipe/ 问题 相信大家都知道在目录中搜索含有固定字符串文件的命令: 1 find . -name '*.py' |xargs grep test 刚开始的时候,我不熟悉xargs命令,所以直接使用的命令是 1 find . -name '*.py' |grep test 结果并不是自己所期望的.此命令只是找出文件名*.txt有test的情况. 这里我就研究一下,

管道命令总结

管道命令 概念 管道命令只会处理stdout,忽略stderr 管道命令后面接的第一个数据必定是命令,这个命令必须能够接收stdin 选取命令 作用:取出我们想要的数据          cut 用途:将一行信息的某一段切出来 缺点:处理多空格相连的数据比较差                    cut -d '分隔字符' -f fields -d               后面接分割字符,与-f一起使用 -f                依据-d将一段信息切割成数段,用-f取出第几段 例

stdin的数据中接收处理工具——xargs

前些天在帮助朋友的服务器上修改了一些脚本,而后来他问我在脚本中xargs是什么,因此在这里就简单的说一说xargs. 在实际生产环境中,往往只用一种指令去处理数据,一般都是不够的,那要使我们能更为高效的处理数据就要使用到管道(|),利用管道把几种指令拼接起来,以用来更好.更高效的处理数据,而管道的实现方式是把上一个指令的stdout的数据放到下一个指令的stdin的数据中,但是在系统中有一些指令,如:rm.ls.cp.mv等等这些指令是不会接收来自stdin的数据,那我们就无法把rm.ls.cp

find的使用及xargs

1.参数介绍 pathname: find命令所查找的目录路径.例如用.来表示当前目录,用/来表示系统根目录. -print: find命令将匹配的文件输出到标准输出. -exec: find命令对匹配的文件执行该参数所给出的shell命令.相应命令的形式为'command' { } \;,注意{ }和\:之间的空格. -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行. #-print 将查找