一、com

标准输入与管道命令

Unix 命令都带有参数,有些命令可以接受"标准输入"(stdin)作为参数。
$ cat /etc/passwd | grep root
上面的代码使用了管道命令(|)。管道命令的作用,是将左侧命令(cat /etc/passwd)的标准输出转换为标准输入,提供给右侧命令(grep root)作为参数。
因为grep命令可以接受标准输入作为参数,所以上面的代码等同于下面的代码。
$ grep root /etc/passwd
但是,大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数。举例来说,echo命令就不接受管道传参。
$ echo “hello world” | echo
上面的代码不会有输出。因为管道右侧的echo不接受管道传来的标准输入作为参数。

此时就需要xargs来将前一个命令的输出转化为参数传递给下一个命令。因为有些命令不支持管道,所以xargs就成为唯一的选择了

个人理解,命令参数就是直接跟在命令后面的,标准输入就是某些命令自带的交互界面,输入后用CTRL+D来提交。

所以,管道符 | 所传递给程序的不是简单地在程序名后面输入的参数,它们会被程序内部的读取功能如scanf和gets等接收,而xargs则是将内容作为普通的参数传递给程序,相当于直接跟在命令后面。
有些命令是不接受标准输入的,比如kill,rm,ls等命令,只能用xargs。
有些命令用管道和xargs效果是不一样的,比如wc

xargs命令的作用,是将标准输入转为命令行参数。

$ echo “hello world” | xargs echo hello world
上面的代码将管道左侧的标准输入,转为命令行参数hello world,传给第二个echo命令。
xargs命令的格式如下。
$ xargs [-options] [command]
真正执行的命令,紧跟在xargs后面,接受xargs传来的参数。
xargs的作用在于,大多数命令(比如rm、mkdir、ls)与管道一起使用时,都需要xargs将标准输入转为命令行参数。
$ echo “one two three” | xargs mkdir
上面的代码等同于mkdir one two three。如果不加xargs就会报错,提示mkdir缺少操作参数。

将前一个命令的标准输出传递给下一个命令,作为它的参数,当然,在传递的过程中,可以做一些格式处理。比如某文件中的内容是按行存储的,xargs将此文件内容转成按空格分隔的然后传给后续命令。

xargs也可以将单行或多行文本输入转换为其他格式,比如单行变多行,多行变单行。

xargs的默认命令是echo,空格是默认定界符。

二、语法

一般与管道“|”结合使用

front command | xargs -option latercommand
front command: 前一个命令
-option: xargs的选项
later command: 后一个命令

三、usage

{0}xargs 的单独使用

xargs后面的命令默认是echo。
$ xargs # 等同于 $ xargs echo
大多数时候,xargs命令都是跟管道一起使用的。但是,它也可以单独使用。
输入xargs按下回车以后,命令行就会等待用户输入,作为标准输入。你可以输入任意内容,然后按下Ctrl d,表示输入结束,这时echo命令就会把前面的输入打印出来。
$ xargs hello (Ctrl + d) hello
再看一个例子。
$ xargs find -name “.txt" ./foo.txt ./hello.txt
上面的例子输入xargs find -name以后,命令行会等待用户输入所要搜索的文件。用户输入"
.txt”,表示搜索当前目录下的所有 TXT 文件,然后按下Ctrl d,表示输入结束。这时就相当执行find -name *.txt。

{1}-d 设置分隔符

默认情况下,xargs将换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。
$ echo “one two three” | xargs mkdir
上面代码中,mkdir会新建三个子目录,因为xargs将one two three分解成三个命令行参数,执行mkdir one two three。
-d参数可以更改分隔符。
$ echo -e “a\tb\tc” | xargs -d “\t” echo a b c
上面的命令指定制表符\t作为分隔符,所以a\tb\tc就转换成了三个命令行参数。echo命令的-e参数表示解释转义字符。

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

{1} -n 指定每行个数

将单行输入转换成多行输出。

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

{3} -0: 如果输入的 stdin 含有特殊字符,例如 `, , 空白键等等字符时,这个 -0 参数可以将他还原成一般字符。

$ echo "/ / "|xargs echo
/ /
$ echo "/ / "|xargs -0 echo
/ /

{4} 体验性

-e: 这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到这个字符串时,就会停止继续工作!

-p: 询问是否运行 later command 参数,在执行每个指令的 argument 时,都会询问使用者的意思,用于验证传参是否正确;

-t : 表示先打印命令,然后再执行

使用xargs命令以后,由于存在转换参数过程,有时需要确认一下到底执行的是什么命令。
-p参数打印出要执行的命令,询问用户是否要执行。
$ echo ‘one two three’ | xargs -p touch touch one two three ?..
上面的命令执行以后,会打印出最终要执行的命令,让用户确认。用户输入y以后(大小写皆可),才会真正执行。
-t参数则是打印出最终要执行的命令,然后直接执行,不需要用户确认。
$ echo ‘one two three’ | xargs -t rm rm one two three

{}

由于xargs默认将空格作为分隔符,所以不太适合处理文件名,因为文件名可能包含空格。
find命令有一个特别的参数-print0,指定输出的文件列表以null分隔。然后,xargs命令的-0参数表示用null当作分隔符。
$ find /path -type f -print0 | xargs -0 rm
上面命令删除/path路径下的所有文件。由于分隔符是null,所以处理包含空格的文件名,也不会报错。
还有一个原因,使得xargs特别适合find命令。有些命令(比如rm)一旦参数过多会报错"参数列表过长",而无法执行,改用xargs就没有这个问题,因为它对每个参数执行一次命令。
$ find . -name “*.txt” | xargs grep “abc”
上面命令找出所有 TXT 文件以后,对每个文件搜索一次是否包含字符串abc。

四、case

同find结合

xargs 命令可以同 find 命令很好地结合在一起。 find 的输出可以通过管道传给 xargs, 由后者执行 -exec 选项所无法处理的复杂操作。如果文件系统的有些文件名中包含空格, find 命令的-print0 选项可以使用 0 (NULL)来分隔查找到的元素,然后再用 xargs 对应的 -0 选项进行解析。

find /sbin -perm +700 |ls -l       #这个命令是错误的,因为ls不支持管道
find /sbin -perm +700 |xargs ls -l   #这样才是正确的
[root@dns-node2 tmp]# find ./ -iname "*.sh" |xargs -0 grep sleep -L
grep: ./testSet.sh

shell-xargs相关推荐

  1. shell xargs的用法

    杀死redis*命名的进程 ps aux | grep redis | grep -v grep | awk '{print $2}' | xargs kill -9

  2. Linux Shell脚本攻略-玩转xargs

    玩转xargs Unix命令可以从标准输入(stdin)或命令行参数中接受数据.利用管道可以将一个命令的标准输出传入到另一个命令的标准输入 可以用别的方法来调用只能接受命令行参数的命令,最简单的方法就 ...

  3. linux xargs

    我们可以用管道将一个命令的stdout(标准输出)重定向到另一个命令的stdin(标准输入).例如: cat foo.txt | grep "test" 但是,有些命令只能以命令行 ...

  4. linux常用命令【原创】

    查看文件内容-while: cat 1.txt|while read line;do echo $line;done while read line; do echo $line; done < ...

  5. shell编程必须要掌握的命令-xargs

    一,说xargs命令前,说一下什么是shell编程 什么是shell编程呢,说白了就是按一定的规则把各种命令组织起来,完成一定的事情.纯属个人理解,哈哈.不管是交互式的shell,还是非交互的shel ...

  6. xargs 主要用于不支持管道的shell命令*****

    变量置换,主要用于不支持管道的shell命令,如:rm.sed等,但有些命令需要占位符"{}"需要注意. 比如: 删除文件- ls|xargs -i rm -rf {} 文件改名- ...

  7. shell基础二:查找技巧,find及xargs的使用

    2019独角兽企业重金招聘Python工程师标准>>> 使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的 (在有些操作系统中只允许- e ...

  8. 几个常用的文本处理shell 命令:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk

    内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq 消除重复行 用tr进行转换 cut 按列切分文本 paste 按列拼接文本 wc 统计行和字符 ...

  9. shell grep 变量_Shell应用:巧用xargs 轻松实现上万文件的筛选压缩

    背景 Linux 下某个目录下有小文件好几万个,命名规则按日期每小时 N 个,想要过滤出指定日期的文件并添加到压缩文件中,记录下脚本化的过程如下. 正则过滤存在的问题 首先,直接进入该目录,由于文件数 ...

  10. [unix shell笔记] - 和find命令结合使用xargs命令

    在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行.不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就 ...

最新文章

  1. BCH DEVCON 黑客马拉松即将登陆旧金山!
  2. python字典程序题_python字典练习题
  3. Robust 源代码分析之gradle-plugin
  4. mysql 连接 中文_大佬们E语言连接MYSQL输出中文乱码怎么破
  5. leetcode跳跃游戏C语言,LeetCode:跳跃游戏
  6. list取值_Redis中List及quicklist实现-2
  7. 图论算法(四)--最小生成树的Kruskal [ 加边 ] 、Prim [ 加点 ] 的解法(JAVA)
  8. 常用验证函数isset()/empty()/is_numeric()函数
  9. ajax应用中如何禁止缓存
  10. 微信小程序 不能跳转页面 跳转不生效
  11. SVN下载以及汉化安装包的使用
  12. 数据结构学习——浅谈哈希表开散列和闭散列
  13. 西门子PLC,STEP7 v5.5安装以及仿真软件Plcsim v5.4 sp5安装
  14. 土木工程模板计算机专业,土木工程毕业论文答辩自述模板
  15. C语言常见编译错误及分析
  16. 电子密码锁程序C语言,基于51单片机的电子密码锁程序
  17. Android api level对照表
  18. 告诉你60个经典的电脑使用技巧
  19. 让你的断舍离不再无处安放 享物说发起小红花联盟
  20. launcher矩形图标

热门文章

  1. 《程序员修炼之道-从小工到专家》读书笔记
  2. Python-OpenCV图像处理(一):读取并指定窗口大小显示图片
  3. 做一名计算机老师应具备的素质,浅谈计算机教师应具备的素质
  4. ES6特性:箭头函数转换,闭包
  5. 安卓和php接口数据传输加密,安卓与PHP间的RSA(openssl)交互加密的坑
  6. ZigBee2节干电池工作半年分析估算
  7. 查看Windows、Office 是否永久激活
  8. 谷歌翻译 网页嵌入代码_在网页上嵌入Google地图
  9. ps怎样给图片加logo
  10. JAVA的可变类与不可变类