zoukankan      html  css  js  c++  java
  • linux shell 脚本攻略学习6-xargs详解

    xargs是一条Unix和类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

    例如,下面的命令:

    rm `find /path -type f`
    如果path目录下文件过多就会因为“参数列表过长”而报错无法执行。但改用xargs以后,问题即获解决。
    find /path -type f -print0 | xargs -0 rm
    本例中xargs将find产生的长串文件列表拆散成多个子串,然后对每个子串调用rm。-print0表示输出以null分隔(-print使用换行);-0表示输入以null分隔。这样要比如下使用find命令效率高的多。
    find /path -type f -exec rm '{}' ;

    xargs命令应该紧跟在管道操作符之后,它以标准输入作为主要的源数据流,并使用stdin并通过提供命令行参数来执行其他命令,例如:

    command | xargs
    实例应用1,将多行输入转换为单行输出:
    amosli@amosli-pc:~/learn$ cat example.txt 
    1 2 3 4 5
    6 7
    8
    amosli@amosli-pc:~/learn$ cat example.txt | xargs 
    1 2 3 4 5 6 7 8

    实例应用2,将单行输入转换为多行输出:

    amosli@amosli-pc:~/learn$ cat example.txt | xargs -n 2
    1 2
    3 4
    5 6
    7 8

    空格是默认的定界符,-n 表示每行显示几个参数

    还可以使用-d参数来分隔参数,如下:

    amosli@amosli-pc:~/learn$ echo "splitXhiXamosliXsplit" | xargs -d "X" -n 1
    split
    hi
    amosli
    split

    实例应用3,读取stdin,将格式化参数传递给命令

    #定义一个echo命令每次在输出参数后都加上#
    amosli@amosli-pc:~/learn$ cat cecho.sh 
    echo $*'#'
    
    #需求1:输出多个参数
    amosli@amosli-pc:~/learn$ sh cecho.sh arg1 
    arg1#
    amosli@amosli-pc:~/learn$ sh cecho.sh arg2 
    arg2#
    amosli@amosli-pc:~/learn$ sh cecho.sh arg3 
    arg3#
    
    #需求2:一次性提供所有的命令参数
    amosli@amosli-pc:~/learn$ sh cecho.sh arg1 arg2 arg3
    arg1 arg1 arg2 arg3#
    
    #针对需求1、2,使用xargs代替,先用vi建一个新文件args.txt,如下:
    amosli@amosli-pc:~/learn$ cat args.txt 
    arg1
    arg2
    arg3
    #批量输出参数:
    amosli@amosli-pc:~/learn$ cat args.txt | xargs -n 1
    arg1
    arg2
    arg3
    amosli@amosli-pc:~/learn$ cat args.txt | xargs -n 2 sh cecho.sh
    arg1 arg2#
    arg3#
    #一次性输出所有参数:
    amosli@amosli-pc:~/learn$ cat args.txt | xargs sh cecho.sh ;
    arg1 arg2 arg3#

    需求3,如何将参数嵌入到固定的命令行中?如下所示:

    amosli@amosli-pc:~/learn$ sh cecho.sh -p args1 -1
    -p args1 -1#
    amosli@amosli-pc:~/learn$ sh cecho.sh -p args2 -1
    -p args2 -1#
    amosli@amosli-pc:~/learn$ sh cecho.sh -p args3 -1
    -p args3 -1#

    使用xargs的解决方案:

    amosli@amosli-pc:~/learn$ cat args.txt | xargs -I {} sh cecho.sh -p {} -1
    -p arg1 -1#
    -p arg2 -1#
    -p arg3 -1#
    
    #-I {}批定了替换字符串,字符串{}会被从stdin读取到的参数所替换,使用-I时,能循环按要求替换相应的参数

    实例应用4,结合find使用xargs

    前面已经举过例子,这里要注意的是文件名称定界符要以字符null来分隔输出,如下所示,否则可能会误删文件

    amosli@amosli-pc:~/learn$ find . -type f -name "*test*.txt" -print0 | xargs -0 rm -f

    其他:

    cat file | ( while read arg; do cat $arg; done )
    cat file | xargs -I {} cat {}
     
     
  • 相关阅读:
    Spring Boot 2 快速教程:WebFlux 集成 Thymeleaf(五)
    Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)
    程序兵法:Java String 源码的排序算法(一)
    oracle等待事件以及解决方案
    记一次数据库参数compatible降级[转]
    R中统计假设检验总结(一)
    Kriging插值法
    数学建模小练习(1):插值【转】
    C++11 lambda表达式
    C++11 正则表达式——基础知识介绍
  • 原文地址:https://www.cnblogs.com/amosli/p/3486817.html
Copyright © 2011-2022 走看看