简介

xargs 命令应该紧跟在管道操作符之后。它使用标准输入作为主要的数据源,将从 stdin 中

读取的数据作为指定命令的参数并执行该命令。

将多行输入转换成单行输出
[root@dns-node2 ~]# cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12 13
将单行输入转换成多行输出。

-n 指定每行个数

[root@dns-node2 ~]# cat example.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
10 11 12
13
指定分隔符

xargs 命令接受来自 stdin 的输入,将数据解析成单个元素,然后调用指定命令并将这些元

素作为该命令的参数。 xargs 默认使用空白字符分割输入并执行/ bin/echo 。

如果文件或目录名中包含空格(甚至是换行)的话,使用空白字符来分割输入就会出现问题。

比如My Documents目录就会被解析成两个元素: My 和 Documents ,而这两者均不存在。

天无绝人之路,这次也不例外。

我们可以定义一个用来分隔参数的分隔符。 -d 选项可以为输入数据指定自定义的分隔符

[root@dns-node2 ~]# echo "a1xb2xc3xd4" | xargs -d x
a1 b2 c3 d4

xargs 命令可以同 find 命令很好地结合在一起。 find 的输出可以通过管道传给 xargs, 由后

者执行 -exec 选项所无法处理的复杂操作。如果文件系统的有些文件名中包含空格, find 命令的

-print0 选项可以使用 0 (NULL)来分隔查找到的元素,然后再用 xargs 对应的 -0 选项进行解

析。

[root@dns-node2 tmp]# find ./ -iname "*.sh" |xargs -0 grep sleep -L
grep: ./testSet.sh
读取stdin,为命令传入格式化参数

先说下我们的需求:

1 我们有参数保存在参数文件里面,我们要从这个参数文件里面读取参数并且提供给某个命令使用,那我们可以使用xargs来结合使用

首先查看参数列表:

[root@dns-node2 tmp]# cat args.txt
timeout 3
interval 3
hostname 1.1.1.1

那下一步就是把这些参数都传给脚本

[root@dns-node2 tmp]# cat args.txt | xargs -n 2  ./testPrint.sh

通过-n 参数来控制传多少个参数给testPring.sh ,如果不写-n 那么就把所有参数传入给testPrint.sh ,否则就由-n来指定参数个数。-n 1就是传一个参数。

2 第二种情况是假设我们脚本需要2个参数,其中有一个参数时固定的,另外一个参数可变的。那怎么保持固定参数不变呢?通过-I参数来指定替换字符串。这个字符串会在 xargs 解析输入时被参

数替换掉。如果将 -I 与 xargs 结合使用,对于每一个参数,指定命令只会执行一次,此时如果结合-n使用的话,-n是无效的

[root@dns-node2 tmp]# cat args.txt | xargs -I {} ./testPrint.sh {} fixedArgs
timeout 3 fixedArgs#
interval 3 fixedArgs#
hostname 1.1.1.1 fixedArgs#

-I {} 指定了替换字符串。为该命令提供的各个参数会通过 stdin 读取并依次替换掉字符串 {} 。

使用 -I 的时候,命令以循环的方式执行。如果有3个参数,那么命令就会连

同 {} 一起被执行3次。 {} 会在每次执行中被替换为相应的参数。

结合find使用xargs

使用 find 命令的 -print0 选项生成以空字符( '\0' )作为分隔符的输出,然后将其作为

xargs 命令的输入

如果不使用-print0的话而在xargs 使用-0参数的话,因为两者发生矛盾了,大家可以看到下面第一条命令报错了

[root@dns-node2 tmp]# find . -type f -name "*.txt" | xargs -0 ls -l
ls: cannot access ./output.txt
./args.txt
: No such file or directory # 报错了?,没有使用-print0
[root@dns-node2 tmp]# find . -type f -name "*.txt" -print0 | xargs -0 ls -l
-rw-r--r-- 1 root root 38 Sep 16 22:49 ./args.txt
-rw-r--r-- 1 root root 8 Sep 4 22:28 ./output.txt
结合stdin ,巧妙运用while语句和子shell

xargs 会将参数放置在指定命令的尾部,因此无法为多组命令提供参数。我们可以通过创建子shell来处理这种复杂情况。子shell利用while循环读取参数并执行命令,有2种方法,就像这样:

1 方法1

[root@dns-node2 tmp]# ls *.sh | (while read arg; do cat $arg; done)

2 方法2

[root@dns-node2 tmp]# ls *.sh | xargs -I a cat a

在 while 循环中,可以将 cat $arg 替换成任意数量的命令,这样我们就可以对同一个参数

执行多条命令。也可以不借助管道将输出传递给其他命令。这种利用 () 创建子shell的技巧可以应

用于各种问题场景。子shell操作符内部的多条命令在执行时就像一个整体,因此:

$ cmd0 | ( cmd1;cmd2;cmd3) | cmd4

如果 cmd1 是 cd / ,那么就会改变子shell工作目录,然而这种改变仅局限于该子shell内部。

cmd4 则不受工作目录变化的影响。

shell的 -c 选项可以调用子shell来执行命令行脚本。它可以与 xargs 结合解决多次替换的问

题。下列命令找出了所有的C文件并显示出每个文件的名字,文件名前会加上一个换行符( -e 选

项允许进行转义替换)。在文件名之后是该文件中含有main的所有行:

[root@dns-node2 tmp]# ls *.sh | xargs -I {}  sh -c "echo -ne '\n {}: ';grep sleep {}"

最新文章

  1. 一款css3很美的iphone注册表单样式
  2. mysql中INSTR函数的用法
  3. 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
  4. tomcat 系统架构与设计模式 第二部分 设计模式 转
  5. 1、CentOS6.5系统安装及学习
  6. TableView基本使用
  7. Cocos2d-x教程第(11)讲-利用遮罩(蒙版)CCLayerColor制作新手引导界面(上)
  8. C#入门经典第十章类的成员-1
  9. FusionCharts使用问题及解决方法(五)-FusionCharts常见问题大全
  10. linux集群批量执行命令
  11. js零碎知识汇总
  12. 转载:深入浅出Zookeeper(一) Zookeeper架构及FastLeaderElection机制
  13. MXPlayer ac3音轨支持问题
  14. 物联网架构成长之路(17)-SpringCloud目前遇到的注意事项
  15. Python 递归函数 详解
  16. VC播放mp3的方法
  17. Python之Subprocess模块
  18. OVSSL企业证书认证
  19. Tomcat配置列表显示
  20. PHP--面向对象的设计原则

热门文章

  1. 个人推荐的Java邮件配置
  2. css3过渡动画 transition
  3. 设计模式--Proxy模式
  4. Elasticsearch 日期类型的自动监测,官方文档
  5. 解决关于VC++ 6.0打开文件时,程序停止的问题
  6. mcp2515屏蔽寄存器和过滤寄存器的学习
  7. Manjaro Linux使用1月滚粗记
  8. sql server 性能优化的几个专家工具
  9. 字典树(Trie)学习笔记
  10. 洛谷P3834题解