linux下xargs命令详解和实例

简介:

xargs是一条Unix和类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题;将多行输入转换为单行 (特殊功效)

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]]


xargs一般是和管道一起使用,选项: 


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

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

-I  格式: xargs  -I  rep-str  comand  rep-srt             

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

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

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


-r  如果没有要处理的参数传递给xargs,xargs 默认是带空参数运行一次,如果你希望无参数时,停止 xargs,直接退出,使用 -r 选项即可,其可以防止xargs 后面命令带空参数运行报错。


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


-n 控制每次输入的参数个数,参数以空白字符或<newline>换行符分割,-L 和 -n 标志是互相排斥的;最后指定的标志生效。


-L num 参数控制每次输入的行数 ,-l和-L功能一样,不建议使用。


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


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


-E  EOF 指定输入结束符 copy

1
2
3
4
5
6
7
#cat t.txt  
   tata-hi -fuck - ok  
   fuck _you _ you  
#xargs -a t.txt -E _  
   tata-hi -fuck - ok fuck _you  
#xargs -a t.txt -E -  
   tata-hi -fuck

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

1
2
3
4
5
#ls |grep Tata  
#ls |grep Tata |xargs -t   
/bin/echo   
   
#ls |grep Tata |xargs -t -r

find -print 和 -print0的区别:

-print 在每一个输出后会添加一个回车换行符,而-print0则不会。


实例:

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

1
rm `find /path -type f`

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

1
find /path -type f -print0 | xargs - 0  rm

这样要比如下使用find命令效率高的多。

1
find /path -type f -exec rm  '{}'  \;

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

1
command | xargs

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

1
2
3
4
$ cat example.txt 
1  2  3  4  5
6  7
8
1
2
$ cat example.txt | xargs 
1  2  3  4  5  6  7  8

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

1
2
3
4
5
$ cat example.txt | xargs -n  2
1  2
3  4
5  6
7  8

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

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

1
2
3
4
5
$ echo  "splitXhiXamosliXsplit"  | xargs -d  "X"  -n  1
split
hi
amosli
split

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

#定义一个echo命令每次在输出参数后都加上#

1
2
$ cat cecho.sh 
echo $* '#'

#需求1:输出多个参数

1
2
3
4
5
6
$ sh cecho.sh arg1 
arg1#
$ sh cecho.sh arg2 
arg2#
$ sh cecho.sh arg3 
arg3#

#需求2:一次性提供所有的命令参数

1
2
$ sh cecho.sh arg1 arg2 arg3
arg1 arg1 arg2 arg3#

#针对需求1、2,使用xargs代替,先用vi建一个新文件args.txt,如下:

1
2
3
4
$ cat args.txt 
arg1
arg2
arg3

#批量输出参数:

1
2
3
4
$ cat args.txt | xargs -n  1
arg1
arg2
arg3
1
2
3
$ cat args.txt | xargs -n  2  sh cecho.sh
arg1 arg2#
arg3#

#一次性输出所有参数:

1
2
$ cat args.txt | xargs sh cecho.sh ;
arg1 arg2 arg3#

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

1
2
3
4
5
6
$ sh cecho.sh -p args1 - 1
-p args1 - 1 #
$ sh cecho.sh -p args2 - 1
-p args2 - 1 #
$ sh cecho.sh -p args3 - 1
-p args3 - 1 #

使用xargs的解决方案:

1
2
3
4
$ 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来分隔输出,如下所示,否则可能会误删文件代码如下:

1
$ find . -type f -name  "*test*.txt"  -print0 | xargs - 0  rm -f


其他:

  • 假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接

    cat url-list.txt | xargs wget –c 

  • 查找所有的jpg 文件,并且压缩它

    find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz

  • 拷贝所有的图片文件到一个外部的硬盘驱动 

    ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory

  • args结合sed替换:

    find . -name "*.txt" -print0 | xargs -0 sed -i 's/aaa/bbb/g'

  • xargs结合grep:

    find . -name '*.txt' -type f -print0 |xargs -0 grep -n 'aaa'    #“-n”输出行号

  • cat file |(while read a;do echo $a;done)

    cat file |xargs -I {} cat {}

本文转自奔跑在路上博客51CTO博客,原文链接http://blog.51cto.com/qiangsh/1868476如需转载请自行联系原作者

qianghong000
相关文章
|
1月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
95 8
|
1月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
260 6
|
15天前
|
Linux Shell
Linux 10 个“who”命令示例
Linux 10 个“who”命令示例
44 14
Linux 10 个“who”命令示例
|
4天前
|
Ubuntu Linux
Linux 各发行版安装 ping 命令指南
如何在不同 Linux 发行版(Ubuntu/Debian、CentOS/RHEL/Fedora、Arch Linux、openSUSE、Alpine Linux)上安装 `ping` 命令,详细列出各发行版的安装步骤和验证方法,帮助系统管理员和网络工程师快速排查网络问题。
57 20
|
4天前
|
网络协议 Linux 应用服务中间件
kali的常用命令汇总Linux
kali的常用命令汇总linux
26 7
|
24天前
|
Linux 数据库
Linux中第一次使用locate命令报错?????
在Linux CentOS7系统中,使用`locate`命令时出现“command not found”错误,原因是缺少`mlocate`包。解决方法是通过`yum install mlocate -y`或`apt-get install mlocate`安装该包,并执行`updatedb`更新数据库以解决后续的“can not stat”错误。
31 9
|
22天前
|
监控 网络协议 Linux
Linux netstat 命令详解
Linux netstat 命令详解
|
28天前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
112 3
|
1月前
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
52 4
|
1月前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
33 1
下一篇
DataWorks