shell

您所在的位置:网站首页 管道就是将前一个命令的标准输出 shell

shell

2024-07-14 16:34| 来源: 网络整理| 查看: 265

一、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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3