zoukankan      html  css  js  c++  java
  • shell学习(20)- xargs

    xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

    xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。

    xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

    xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。

    xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。 

    xargs命令重新格式化stdin接收到的数据,再将其作为参数提供给指定命令。xargs默认会执行echo命令。和find命令的-exec选项相比,两者在很多方面都相似。
     
     

    命令格式:

    somecommand |xargs -item  command

    参数:

    -a file 从文件中读入作为sdtin
    -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
    -p 当每次执行一个argument的时候询问一次用户。
    -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
    -t 表示先打印命令,然后再执行。
    -i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
    -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
    -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
    -L num 从标准输入一次读取 num 行送给 command 命令。
    -l 同 -L。
    -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
    -x exit的意思,主要是配合-s使用。。
    -P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。

    工作原理

    xargs命令接受来自stdin的输入,将数据解析成单个元素,然后调用指定命令并将这些元素作为该命令的参数。xargs默认使用空白字符分割输入并执行/bin/echo

    1.将多行输入转换成单行输出

    [kumufengchun@localhost ~/shell]$ cat example.txt
    1 2 3 4 5
    6 7 8
    9 0
    [kumufengchun@localhost ~/shell]$ cat example.txt | xargs
    1 2 3 4 5 6 7 8 9 0

    2.将单行输入转换成多行输出

    xargs的-n选项可以限制每次调用命令时用到的参数个数。下面的命令将输入分割成多行,每行N个元素

    [kumufengchun@localhost ~/shell]$ cat example.txt | xargs -n 3
    1 2 3
    4 5 6
    7 8 9
    0
    3.-d选项可以为输入数据指定自定义的分隔符
    [kumufengchun@localhost ~/shell]$ echo "split1xsplit2xsplit3xsplit4" | xargs -d x
    split1 split2 split3 split4
    
    [kumufengchun@localhost ~/shell]$ echo "split1xsplit2xsplit3xsplit4" | xargs -d x -n 2
    split1 split2
    split3 split4

    4.和find一起使用

    xargs命令可以同find命令很好地结合在一起。find的输出可以通过管道传给xargs,由后者执行-exec选项所无法处理的复杂操作。如果文件系统的有些文件名中包含空格,find命令的-print0选项可以使用0(NULL)来分隔查找到的元素,然后再用xargs对应的-0选项进行解析。下面的例子在Samba挂载的文件系统中搜索.docx文件,这些文件名中通常会包含大写字母和空格。其中使用了grep找出内容中不包含image的文件:

    find /smbMount -iname '*.docx' -print0 | xargs -0 grep -L image
    xargs和find可以配合完成任务。不过在结合使用的时候需要留心。考虑下面的例子:
    find . -type f -name "*.txt" -print | xargs rm -f
    这样做很危险,有可能会误删文件。我们无法预测find命令输出的分隔符究竟是什么(究竟是' '还是' ')。如果有文件名中包含空格符(' '),xargs会将其误认为是分隔符。例如,bashrc text.txt会被视为bashrc和text.txt。因此上面的命令不会删除bashrc text.txt,而是会把bashrc删除。使用find命令的-print0选项生成以空字符('')作为分隔符的输出,然后将其作为xargs命令的输入。
    下列命令会查找并删除所有的.txt文件:
    find . -type f -name "*.txt" -print0 | xargs -0 rm -f

    统计一个源代码目录中所有 php 文件的行数:

    find . -type f -name "*.php" -print0 | xargs -0 wc -l
        find . -type f -name '黑名单普通' -print0 | xargs -0 wc -l
        find . -type f -name '*黑名单普通*' -print0 | xargs -0 wc -l
        find . -type f -name '*黑名单普通*' -print0 | xargs -0 rm {};
        find . -type f -name '*黑名单普通*' -print0 | xargs -0 rm {} ;
        find . -type f -name '*黑名单普通*'| xargs rm {} ;
        find . -type f -name '*黑名单普通*' rm {} ;
        find . -type f -name "*黑名单普通*" rm {} ;
        find . -type f -name "*黑名单普通*" -print0 | xargs -0 rm -f

    5.-I选项

    xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次,使用-I的时候,命令以循环的方式执行。如果有3个参数,那么命令就会同{}一起被执行3次。{}会在每次执行中被替换为相应的参数

    cat arg.txt | xargs -I {} ./sk.sh -p {} -l
    
    -p aaa -l
    -p bbb -l
    -p ccc -l
     
    复制所有图片文件到 /data/images 目录下:
    ls *.jpg | xargs -n1 -I {} cp {} /data/images

    参考:https://www.runoob.com/linux/linux-comm-xargs.html

              《Linux_Shell脚本攻略.第3版》第二章

  • 相关阅读:
    JavaScript函数节流与函数去抖
    AngularJS 中文资料+工具+库+Demo 大搜集
    一个意想不到的Javascript内存泄漏
    mac添加Chromedriver
    selenium3+python自动化1——input标签上传文件
    python笔记1——xml文件的创建,读写,与增删改查
    C# 单例模式
    java的byte数组转换成在[0,255]范围内
    【转载】Stack Overflow: The Architecture
    C# 号码归属地查询算法(根据Android来电归属地二进制文件查询修改)
  • 原文地址:https://www.cnblogs.com/kumufengchun/p/11377540.html
Copyright © 2011-2022 走看看