您的位置:首页 > 运维架构 > Linux

每天一个linux命令(5):xargs命令

2016-03-30 15:14 591 查看
NAME
       xargs - build and execute command lines from standard input

DESCRIPTION

       This manual page documents the GNU version of xargs.  xargs reads items from the standard input, delimited by  blanks  (which  can  be

       protected  with double or single quotes or a backslash) or newlines, and executes the command (default is /bin/echo) one or more times

       with any initial-arguments followed by items read from standard input.  Blank lines on the standard input are ignored.

       Because Unix filenames can contain blanks and newlines, this default behaviour  is  often  problematic;  filenames  containing  blanks

       and/or  newlines are incorrectly processed by xargs.  In these situations it is better to use the -0 option, which prevents such prob-

       lems.   When using this option you will need to ensure that the program which produces the input for xargs also uses a null  character

       as a separator.  If that program is GNU find for example, the -print0 option does this for you.

       If  any invocation of the command exits with a status of 255, xargs will stop immediately without reading any further input.  An error

       message is issued on stderr when this happens.

--null

       -0     Input  items  are  terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every

              character is taken literally).  Disables the end of file string, which is treated like any other argument.  Useful  when  input

              items  might  contain  white  space, quote marks, or backslashes.  The GNU find -print0 option produces input suitable for this

              mode.

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

xargs是其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成为命令行参数,xargs能够处理管道或者stdin并将其转换成特定的命令参数。xargs也可以将单行或者多行文本输入转换成其他格式,例如多行变单行,单行变多行。xargs的默认命令是echo,空格是默认界定符。这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。

用法

xargs用作替换工具,读取输入数据重新格式化后输出。

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

例如,下面的命令:

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 '{}' \;

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

amosli@amosli-pc:~/learn$ find . -type f -name "*test*.txt" -print0 | xargs -0 rm -f
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: