shell-xargs
一、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相关推荐
- shell xargs的用法
杀死redis*命名的进程 ps aux | grep redis | grep -v grep | awk '{print $2}' | xargs kill -9
- Linux Shell脚本攻略-玩转xargs
玩转xargs Unix命令可以从标准输入(stdin)或命令行参数中接受数据.利用管道可以将一个命令的标准输出传入到另一个命令的标准输入 可以用别的方法来调用只能接受命令行参数的命令,最简单的方法就 ...
- linux xargs
我们可以用管道将一个命令的stdout(标准输出)重定向到另一个命令的stdin(标准输入).例如: cat foo.txt | grep "test" 但是,有些命令只能以命令行 ...
- linux常用命令【原创】
查看文件内容-while: cat 1.txt|while read line;do echo $line;done while read line; do echo $line; done < ...
- shell编程必须要掌握的命令-xargs
一,说xargs命令前,说一下什么是shell编程 什么是shell编程呢,说白了就是按一定的规则把各种命令组织起来,完成一定的事情.纯属个人理解,哈哈.不管是交互式的shell,还是非交互的shel ...
- xargs 主要用于不支持管道的shell命令*****
变量置换,主要用于不支持管道的shell命令,如:rm.sed等,但有些命令需要占位符"{}"需要注意. 比如: 删除文件- ls|xargs -i rm -rf {} 文件改名- ...
- shell基础二:查找技巧,find及xargs的使用
2019独角兽企业重金招聘Python工程师标准>>> 使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的 (在有些操作系统中只允许- e ...
- 几个常用的文本处理shell 命令:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk
内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq 消除重复行 用tr进行转换 cut 按列切分文本 paste 按列拼接文本 wc 统计行和字符 ...
- shell grep 变量_Shell应用:巧用xargs 轻松实现上万文件的筛选压缩
背景 Linux 下某个目录下有小文件好几万个,命名规则按日期每小时 N 个,想要过滤出指定日期的文件并添加到压缩文件中,记录下脚本化的过程如下. 正则过滤存在的问题 首先,直接进入该目录,由于文件数 ...
- [unix shell笔记] - 和find命令结合使用xargs命令
在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行.不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就 ...
最新文章
- BCH DEVCON 黑客马拉松即将登陆旧金山!
- python字典程序题_python字典练习题
- Robust 源代码分析之gradle-plugin
- mysql 连接 中文_大佬们E语言连接MYSQL输出中文乱码怎么破
- leetcode跳跃游戏C语言,LeetCode:跳跃游戏
- list取值_Redis中List及quicklist实现-2
- 图论算法(四)--最小生成树的Kruskal [ 加边 ] 、Prim [ 加点 ] 的解法(JAVA)
- 常用验证函数isset()/empty()/is_numeric()函数
- ajax应用中如何禁止缓存
- 微信小程序 不能跳转页面 跳转不生效
- SVN下载以及汉化安装包的使用
- 数据结构学习——浅谈哈希表开散列和闭散列
- 西门子PLC,STEP7 v5.5安装以及仿真软件Plcsim v5.4 sp5安装
- 土木工程模板计算机专业,土木工程毕业论文答辩自述模板
- C语言常见编译错误及分析
- 电子密码锁程序C语言,基于51单片机的电子密码锁程序
- Android api level对照表
- 告诉你60个经典的电脑使用技巧
- 让你的断舍离不再无处安放 享物说发起小红花联盟
- launcher矩形图标