xargs 的作用是产生命令需要的参数,主要是用于在命令结合管道的使用中给一些不支持管道的命令提供输入参数。

例如:利用find找出~ 目录下由特殊权限的文件,并用ls命令列出文件列表:

[whx@localhost ~]$ find ~ -perm +7000 | ls-l
total 128
drwxr-xr-x. 2 whx whx 4096 Jul 19 09:44 Desktop
drwxr-xr-x. 2 whx whx 4096 Jul 19 09:44 Documents
drwxr-xr-x. 2 whx whx 4096 Jul 19 09:44 Downloads
-rwSrwSr-T. 1 whx whx 4057 Aug 24 19:21 man.config.b
-rw-rw-r--. 1 whx whx 4057 Aug 24 19:21 man.config.c
…

上面的命令虽然列出了文件列表,其中包含了具有特殊权限的文件,但是我们的本意是只列出具有特殊权限的文件列表,而不是该目录下的所有文件。导致这个结果不符合预期结果的原因是ls命令不支持管道。这种情况下可以是xargs来将管道符前面的输出转换为ls的输入参数。

 

[whx@localhost~]$ find ~ -perm +7000 |xargs ls -l
-rwSrwSr-T. 1 whx whx 4057 Aug 24 19:21/home/whx/man.config.b

 

利用xargs将管道符前命令的输出作为finger的输入参数:

[whx@localhost ~]$ cut -d ':' -f 1/etc/passwd | head -n 2 | xargs finger
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
Never logged in.
New mail received Thu Aug 24 19:09 2017(PDT)
    Unread since Wed Jul 19 10:33 2017 (PDT)
No Plan.
 
Login: bin                              Name: bin
Directory: /bin                         Shell: /sbin/nologin
Never logged in.
No mail.
No Plan.

添加 -p参数在执行xargs后的命令是输出提示信息询问用户是否执行该命令:

[whx@localhost ~]$ cut -d ':' -f 1/etc/passwd | head -n 2 | xargs -p finger
finger root bin ?...y
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
Never logged in.
New mail received Thu Aug 24 19:09 2017(PDT)
    Unread since Wed Jul 19 10:33 2017 (PDT)
No Plan.
 
Login: bin                              Name: bin
Directory: /bin                         Shell: /sbin/nologin
Never logged in.
No mail.
No Plan.

 

添加-n 2参数表示finger命令每次执行时只有2个参数,即每次值输出2个用户的信息,finger命令每次执行之前会询问用户是否执行,每输出2个用户信息后敲击回车,会再次询问用户,知道输入参数中用户信息全部被finger命令输出为止。

[whx@localhost ~]$ cut -d ':' -f 1/etc/passwd | xargs -p -n 2 finger           
finger root bin ?...y
finger daemon adm ?...Login: root                               Name: root
Directory: /root                        Shell: /bin/bash
Never logged in.
New mail received Thu Aug 24 19:09 2017(PDT)
    Unread since Wed Jul 19 10:33 2017 (PDT)
No Plan.
 
Login: bin                              Name: bin
Directory: /bin                         Shell: /sbin/nologin
Never logged in.
No mail.
No Plan.
 
finger lp sync ?...y
finger shutdown halt ?...Login: lp                              Name: lp
Directory: /var/spool/lpd               Shell: /sbin/nologin
Never logged in.
No mail.
No Plan.
 
Login: sync                             Name: sync
Directory: /sbin                        Shell: /bin/sync
Never logged in.
No mail.
No Plan.

 

添加-e参数设置遇到某个字符串时让xrags停止工作。

例如从上面的命令可以看出第二个用户名为bin,所以不添加-e’bin’ 参数时下面的命令会一次输出4个用户的信息,并且每次执行都会询问用户是否执行finger命令,但是设置-e’bin‘参数使得xargs遇到bin这个字符串时停止工作。所以这条命令只输出了第一个用户的信息就结束了。

[whx@localhost ~]$ cut -d ':' -f 1/etc/passwd | xargs -p -e'bin' -n 4 finger
finger root ?...y
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
Never logged in.
New mail received Thu Aug 24 19:09 2017(PDT)
    Unread since Wed Jul 19 10:33 2017 (PDT)
No Plan.