Linux xargs命令详解

上一篇 / 下一篇  2015-03-04 17:14:40 / 个人分类:Linux

xargs  [-0prtx] [-E  eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null]

       [-d delimiter] [--delimiter delimiter]  [-I  replace-str]  [-i[replace-
       str]] [--replace[=replace-str]]   [-l[max-lines]]   [-L   max-lines]
       [--max-lines[=max-lines]] [-n max-args] [--max-args=max-args] [-s  max-
       chars]  [--max-chars=max-chars] [-P max-procs] [--max-procs=max-procs]
       [--interactive]     [--verbose]     [--exit]   [--no-run-if-empty]
       [--arg-file=file]   [--show-limits]   [--version]   [--help]   [command
       [initial-arguments]]


最经典应用模式:  somecommand |xargs -item  command   

不带command ,默认的使用echo 输出


用途:
    1.构造参数列表并运行命令,即将接收的参数传递给后面的command 命令执行

    2.将多行输入转换为单行 (特殊功效)

优点:

       1. 将输入参数整理后,去除<newline>换行符,以一个列表形式处理
       2. 避免参数过长引发的问题,使用xargs -n 参数适当控制,对于经常产生大量输出的命令如find、locate和grep来说非常有用

XARGS 一般是和管道一起使用: 

XXcomand  | xargs  -x  comand initial-args

-x 代表选项

选项:


-p 操作具有可交互性,每次执行comand都交互式提示用户选择

-i -i 选项告诉 xargs 可以使用{}代替传递过来的参数, 建议使用-I,其符合POSIX标准

-I 

 格式: xargs  -I  rep-str  comand  rep-srt             rep-str 为代替传递给xargs参数, 可以使 {} $ @ 等符号 ,其主要作用是当xargs   command 后有多个参数时,调整参数位置。例如:

          find  . -name  "*.txt "  |xargs -I {}  cp {} /tmp   


-t    启用命令行输出模式:其先回显要运行的命令,然后执行命令,打印出命令结果,跟踪与调试xargs的利器,也是研究xargs运行原理的好办法;


-r

   如果没有要处理的参数传递给xargsxargs 默认是带 空参数运行一次,如果你希望无参数时,停止 xargs,直接退出,使用 -r 选项即可,其可以防止xargs 后面命令带空参数运行报错。If the standard input does not contain any nonblanks, do not run the command, exit


-s size

   设置每次构造Command行的长度总大小,包括 command +init-param +传递参数,Size 参数必须是正整数 


-L num

   从标准输入一次读取num行送给Command命令 ,-l和-L功能一样,不建议使用。

-n
  xargs 的-n选项设置每次送给command命令的参数个数,参数以空白字符或<newline>换行符分割
   -L 和 -n 标志是互相排斥的;最后指定的标志生效。

  -x 如果有任何 Command 行大于 -s Size 标志指定的字节数,停止运行 xargs 命令,-L -I -n 默认打开-x参数

常见的经典用法:

    find . -name "*.txt" |xargs rm {} 

帮助理解各个参数的实例

-t  参数,打开调试功能,显示每次所组的命令,在调试中非常有用,可以看出xargs的执行原理

-L num 参数控制每次输入的行数,如下是控制每次输入2行

  1. [root@andes.com ~/tmp/dir]#ls -l  
  2. total 44  
  3. -rwx------ 1 root root 1026 Sep 27 05:28 data.txt  
  4. -rw-r--r-- 1 root root 1047 Sep 27 05:28 d.txt  
  5. -rwx------ 1 root root 2009 Sep 27 05:28 env2.txt  
  6. -rwx------ 1 root root 2009 Sep 27 05:28 env.txt  
  7. -rwx------ 1 root root 1998 Sep 27 05:28 export2.txt  
  8. -rwx------ 1 root root 1998 Sep 27 05:28 export.txt  
  9. -rwx------ 1 root root   28 Sep 27 05:28 fuck.txt  
  10. -rwx------ 1 root root 5373 Sep 27 05:28 set.txt  
  11. -rw-r--r-- 1 root root   21 Sep 27 05:28 s.txt  
  12. -rw-r--r-- 1 root root   35 Sep 27 10:13 t.txt  
  13. [root@andes.com ~/tmp/dir]#ls -l |xargs -t -L 2  
  14. /bin/echo total 44 -rwx------ 1 root root 1026 Sep 27 05:28 data.txt   
  15. total 44 -rwx------ 1 root root 1026 Sep 27 05:28 data.txt  
  16. /bin/echo -rw-r--r-- 1 root root 1047 Sep 27 05:28 d.txt -rwx------ 1 root root 2009 Sep 27 05:28 env2.txt   
  17. -rw-r--r-- 1 root root 1047 Sep 27 05:28 d.txt -rwx------ 1 root root 2009 Sep 27 05:28 env2.txt  
  18. /bin/echo -rwx------ 1 root root 2009 Sep 27 05:28 env.txt -rwx------ 1 root root 1998 Sep 27 05:28 export2.txt   
  19. -rwx------ 1 root root 2009 Sep 27 05:28 env.txt -rwx------ 1 root root 1998 Sep 27 05:28 export2.txt  
  20. /bin/echo -rwx------ 1 root root 1998 Sep 27 05:28 export.txt -rwx------ 1 root root 28 Sep 27 05:28 fuck.txt   
  21. -rwx------ 1 root root 1998 Sep 27 05:28 export.txt -rwx------ 1 root root 28 Sep 27 05:28 fuck.txt  
  22. /bin/echo -rwx------ 1 root root 5373 Sep 27 05:28 set.txt -rw-r--r-- 1 root root 21 Sep 27 05:28 s.txt   
  23. -rwx------ 1 root root 5373 Sep 27 05:28 set.txt -rw-r--r-- 1 root root 21 Sep 27 05:28 s.txt  
  24. /bin/echo -rw-r--r-- 1 root root 35 Sep 27 10:13 t.txt   
  25. -rw-r--r-- 1 root root 35 S  

-n num  控制每次输入的参数个数

假设你希望使用 rm 命令(该命令将作为 xargs 命令的参数)删除文件。然而,rm 只能接受有限数量的参数。如果你的参数列表超出该限制怎么办?xargs 的 -n 选项限制单个命令行的参数个数。

  1. [root@andes.com ~/tmp/dir]#ls   
  2. data.txt  d.txt  env2.txt  env.txt  export2.txt  export.txt  fuck.txt  set.txt  s.txt  t.txt  
  3. [root@andes.com ~/tmp/dir]#ls |xargs -t -n 2 file   
  4. file data.txt d.txt   
  5. data.txt: ISO-8859 text  
  6. d.txt:    ISO-8859 text  
  7. file env2.txt env.txt   
  8. env2.txt: ASCII text, with very long lines  
  9. env.txt:  ASCII text, with very long lines  
  10. file export2.txt export.txt   
  11. export2.txt: ASCII text, with very long lines  
  12. export.txt:  ASCII text, with very long lines  
  13. file fuck.txt set.txt   
  14. fuck.txt: ASCII text  
  15. set.txt:  ASCII text, with very long lines  
  16. file s.txt t.txt   
  17. s.txt: ASCII text  
  18. t.txt: ASCII text  
  19. [root@andes.com ~/tmp/dir]#  

-E  EOF 指定输入结束符

  1. [root@andes.com ~/tmp/dir]#cat t.txt  
  2. tata-hi -fuck - ok  
  3. fuck _you _ you  
  4. [root@andes.com ~/tmp/dir]#xargs -a t.txt -E _  
  5. tata-hi -fuck - ok fuck _you  
  6. [root@andes.com ~/tmp/dir]#xargs -a t.txt -E -  
  7. tata-hi -fuck  


-r  xargs 默认是空参数comand也要执行一次,如使用-r参数遇到空参数则直接退出,不会再执行一次,避免程序执行错误。

  1. [root@andes.com ~/tmp/dir]#ls   
  2. data.txt  d.txt  env2.txt  env.txt  export2.txt  export.txt  fuck.txt  set.txt  s.txt  t.txt  
  3. [root@andes.com ~/tmp/dir]#ls |grep Tata  
  4. [root@andes.com ~/tmp/dir]#ls |grep Tata |xargs -t   
  5. /bin/echo   
  6.   
  7. [root@andes.com ~/tmp/dir]#ls |grep Tata |xargs -t -r  
  8. [root@andes.com ~/tmp/dir]#  
范例一:将 /etc/passwd 内的第一栏取出,仅取三行,使用 finger 这个命令将每个
        账号内容秀出来
[root@www ~]# cut -d':' -f1 /etc/passwd |head -n 3| xargs finger
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
Never logged in.
No mail.
No Plan.
......底下省略.....
# 由 finger account 可以取得该账号的相关说明内容,例如上面的输出就是 finger root
# 后的结果。在这个例子当中,我们利用 cut 取出账号名称,用 head 取出三个账号,
# 最后则是由 xargs 将三个账号的名称变成 finger 后面需要的参数!

范例二:同上,但是每次运行 finger 时,都要询问使用者是否动作?
[root@www ~]# cut -d':' -f1 /etc/passwd |head -n 3| xargs -p finger
finger root bin daemon ?...y
.....(底下省略)....
# 呵呵!这个 -p 的选项可以让用户的使用过程中,被询问到每个命令是否运行!

范例三:将所有的 /etc/passwd 内的账号都以 finger 查阅,但一次仅查阅五个账号
[root@www ~]# cut -d':' -f1 /etc/passwd | xargs -p -n 5 finger
finger root bin daemon adm lp ?...y
.....(中间省略)....
finger uucp operator games gopher ftp ?...y
.....(底下省略)....
# 在这里鸟哥使用了 -p 这个参数来让您对于 -n 更有概念。一般来说,某些命令后面
# 可以接的 arguments 是有限制的,不能无限制的累加,此时,我们可以利用 -n
# 来帮助我们将参数分成数个部分,每个部分分别再以命令来运行!这样就 OK 啦!^_^

范例四:同上,但是当分析到 lp 就结束这串命令?
[root@www ~]# cut -d':' -f1 /etc/passwd | xargs -p -e'lp' finger
finger root bin daemon adm ?...
# 仔细与上面的案例做比较。也同时注意,那个 -e'lp' 是连在一起的,中间没有空格键。
# 上个例子当中,第五个参数是 lp 啊,那么我们下达 -e'lp' 后,则分析到 lp
# 这个字符串时,后面的其他 stdin 的内容就会被 xargs 舍弃掉了!
复制代码

  其实,在 man xargs 里面就有三四个小范例,您可以自行参考一下内容。 此外, xargs 真的是很好用的一个玩意儿!您真的需要好好的参详参详!会使用 xargs 的原因是, 很多命令其实并不支持管线命令,因此我们可以透过 xargs 来提供该命令引用 standard input 之用!举例来说,我们使用如下的范例来说明:

复制代码
范例五:找出 /sbin 底下具有特殊权限的档名,并使用 ls -l 列出详细属性
[root@www ~]# find /sbin -perm +7000 | ls -l
# 结果竟然仅有列出 root 所在目录下的文件!这不是我们要的!
# 因为 ll (ls) 并不是管线命令的原因啊!

[root@www ~]# find /sbin -perm +7000 | xargs ls -l
-rwsr-xr-x 1 root root 70420 May 25  2008 /sbin/mount.nfs
-rwsr-xr-x 1 root root 70424 May 25  2008 /sbin/mount.nfs4
-rwxr-sr-x 1 root root  5920 Jun 15  2008 /sbin/netreport
....(底下省略)....

TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-03-22  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 19433
  • 日志数: 12
  • 建立时间: 2015-01-30
  • 更新时间: 2015-06-04

RSS订阅

Open Toolbar