通道符和xargs命令

通道符“|“:是将前一个命令的输出做为后一个命令的标准输入。注意:这里的标准输入指的是:通道符右侧命令的处理内容,也就是说左侧的标准输出不能作为右侧命令的参数,只能作为命令的处理对象。

简单讲:只有通道符时,右侧命令将左侧输出作为处理内容。加上xargs后,将左侧输出作为参数。具体看下面wc命令的执行,就明白了。

写起来都很别扭,理解起来也费劲啊,还是举例子吧:

1、环境:假设当前目录下,tesy文件夹内有3个文件,t1.c,t2.c,t3.c

t1.c内容:

hello,I am t1

ok

t2.c内容:

this is t2

t3.c内容:

I am t3

I have 3 lines

look it

然后,我再当前目录建立一个文件t,内容如下:

t1.c

t2.c

t3.c

最后,我在当前目录执行: cat t | ls -l 

[root@noi ~]# cat t | ls -l
total 8
-rw-r--r-- 1 root root   30 Jun  8 12:11 t
drwxr-xr-x 2 root root 4096 Jun  8 12:10 tesy

也输出了内容,和我们的想法不一样,我们想的是将t文件内的文件列表传给ls命令,然后一一列出详细属性。但是显然输出的不对,那么这些到底是怎么运作的呢?

cat t命令产生的标准输出通过通道符传给了ls命令,但是ls命令抛弃了,因为ls命令不能处理流,它不是一个文本处理软件,然后ls独自运行,因为没有参数,所以最终执行的命令是:

ls -l

就将当前目录作为默认参数,显示出来。

然后运行:

cat t | xagrs ls -l
[root@noi ~]# cat t | xargs ls -l
-rw-r--r-- 1 root root 18 Jun  8 12:10 tesy/t1.c
-rw-r--r-- 1 root root 11 Jun  8 12:09 tesy/t2.c
-rw-r--r-- 1 root root 31 Jun  8 12:09 tesy/t3.c

看到没?正确执行了我们的意图。xargs命令将从cat t得到的标准输出,作为参数传递给ls命令,这样ls命令得到3个参数,最终执行: ls -l t1.c t2.c t3.c 

2、如果上题还有疑问,那么wc命令将最终为您解惑:

执行:

cat t | wc -l

wc命令将cat的输出作为处理内容,进行计算,最终输出3,表示有3行。

[root@noi ~]# cat t | wc -l
3

执行:

cat t | xargs wc -l

xargs将cat输出的3行作为wc的参数传递进来,于是最终执行: wc -l t1.c t2.c t3.c 

[root@noi ~]# cat t | xargs wc -l
 2 tesy/t1.c
 1 tesy/t2.c
 3 tesy/t3.c
 6 total

看到没?wc最终计算的是t1.c,t2.c,t3.c这三个文件,而不是t文件。这就是xargs的作用,将标准输出转为命令的参数,而不是命令的处理内容。

原文地址:https://www.cnblogs.com/litifeng/p/6962179.html