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

linux shell 脚本攻略学习6-xargs详解

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

例如,下面的命令:

rm`find/path-typef`


如果path目录下文件过多就会因为“参数列表过长”而报错无法执行。但改用xargs以后,问题即获解决。


find/path-typef-print0|xargs-0rm


本例中xargs将find产生的长串文件列表拆散成多个子串,然后对每个子串调用rm。-print0表示输出以null分隔(-print使用换行);-0表示输入以null分隔。这样要比如下使用find命令效率高的多。


find/path-typef-execrm'{}'\;


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

command|xargs


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


amosli@amosli-pc:~/learn$catexample.txt
12345
67
8


amosli@amosli-pc:~/learn$catexample.txt|xargs
12345678


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


amosli@amosli-pc:~/learn$catexample.txt|xargs-n2
12
34
56
78


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

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

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


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

#定义一个echo命令每次在输出参数后都加上#
amosli@amosli-pc:~/learn$catcecho.sh
echo$*'#'

#需求1:输出多个参数
amosli@amosli-pc:~/learn$shcecho.sharg1
arg1#
amosli@amosli-pc:~/learn$shcecho.sharg2
arg2#
amosli@amosli-pc:~/learn$shcecho.sharg3
arg3#

#需求2:一次性提供所有的命令参数
amosli@amosli-pc:~/learn$shcecho.sharg1arg2arg3
arg1arg1arg2arg3#

#针对需求1、2,使用xargs代替,先用vi建一个新文件args.txt,如下:
amosli@amosli-pc:~/learn$catargs.txt
arg1
arg2
arg3
#批量输出参数:
amosli@amosli-pc:~/learn$catargs.txt|xargs-n1
arg1
arg2
arg3
amosli@amosli-pc:~/learn$catargs.txt|xargs-n2shcecho.sh
arg1arg2#
arg3#
#一次性输出所有参数:
amosli@amosli-pc:~/learn$catargs.txt|xargsshcecho.sh;
arg1arg2arg3#


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

amosli@amosli-pc:~/learn$shcecho.sh-pargs1-1
-pargs1-1#
amosli@amosli-pc:~/learn$shcecho.sh-pargs2-1
-pargs2-1#
amosli@amosli-pc:~/learn$shcecho.sh-pargs3-1
-pargs3-1#


使用xargs的解决方案:

amosli@amosli-pc:~/learn$catargs.txt|xargs-I{}shcecho.sh-p{}-1
-parg1-1#
-parg2-1#
-parg3-1#

#-I{}批定了替换字符串,字符串{}会被从stdin读取到的参数所替换,使用-I时,能循环按要求替换相应的参数


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

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

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


其他:

catfile|(whilereadarg;docat$arg;done)
catfile|xargs-I{}cat{}





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: