网站建设有那几个类型,如何优化网络延迟,微信小程序开发定制公司,前端开发是做什么为什么要用xargs#xff0c;问题的来源 在工作中经常会接触到xargs命令#xff0c;特别是在别人写的脚本里面也经常会遇到#xff0c;但是却很容易与管道搞混淆#xff0c;本篇会详细讲解到底什么是xargs命令#xff0c;为什么要用xargs命令以及与管道的区别。为什么要用x…为什么要用xargs问题的来源 在工作中经常会接触到xargs命令特别是在别人写的脚本里面也经常会遇到但是却很容易与管道搞混淆本篇会详细讲解到底什么是xargs命令为什么要用xargs命令以及与管道的区别。为什么要用xargs呢我们知道linux命令可以从两个地方读取要处理的内容一个是通过命令行参数一个是标准输入。例如cat、grep就是这样的命令举个例子 1 echo main | cat test.cpp 这种情况下cat会输出test.cpp的内容而不是main字符串如果test.cpp不存在则cat命令报告该文件不存在并不会尝试从标准输入中读取。echo main | 会通过管道将 echo 的标准输出(也就是字符串main)导入到 cat 的标准输入也就是说此时cat的标准输入中是有内容的其内容就是字符串main但是上面的内容中cat不会从它的标准输入中读入要处理的内容。(注:标准输入是有一个缓冲区的就像我们在程序中使用scanf函数从标准输入中读取一样实际上是从标准输入的缓冲区中读取的)。其实基本上linux的命令中很多的命令的设计是先从命令行参数中获取参数然后从标准输入中读取反映在程序上命令行参数是通过main函数 int main(int argc,char*argv[]) 的函数参数获得的而标准输入则是通过标准输入函数例如C语言中的scanf读取到的。他们获取的地方是不一样的。例如 1 echo main | cat 这条命令中cat会从其标准输入中读取内容并处理也就是会输出 main 字符串。echo命令将其标准输出的内容 main 通过管道定向到 cat 的标准输入中。 1 cat 如果仅仅输入cat并回车则该程序会等待输入我们需要从键盘输入要处理的内容给cat此时cat也是从标准输入中得到要处理的内容的因为我们的cat命令行中也没有指定要处理的文件名。大多数命令有一个参数 - 如果直接在命令的最后指定 - 则表示从标准输入中读取例如 1 echo main | cat - 这样也是可行的会显示 main 字符串同样输入 cat - 直接回车与输入 cat 直接回车的效果也一样但是如果这样呢 1 echo main | cat test.cpp - 同时指定test.cpp 和 - 参数此时cat程序还是会显示test.cpp的内容。但是有一个程序的策略则不同它是grep例如 1 echo main | grep main test.cpp - 该命令的输出结果是:test.cpp:int main()(standard input):main 此时grep会同时处理标准输入和文件test.cpp中的内容也就是说会在标准输入中搜索 main 也会在文件 test.cpp (该文件名从grep命令行参数中获得)中搜索 main。也就是说当命令行中 test.cpp 和 - 两个参数同时存在的时候不同的程序处理不同。我们看到了cat与grep处理就不同。但是有一点是一样的首先在命令行中查找要处理的内容的来源(是从文件还是从标准输入还是都有)如果在命令行中找不到与要处理的内容的来源相关的参数则默认从标准输入中读取要处理的内容了。 另外很多程序是不处理标准输入的例如 kill , rm 这些程序如果命令行参数中没有指定要处理的内容则不会默认从标准输入中读取。所以 1 echo 516 | kill 这种命里是不能执行的。 1 echo test | rm -f 这种也是没有效果的。 这两个命令只接受命令行参数中指定的处理内容不从标准输入中获取处理内容。想想也很正常kill 是结束进程rm是删除文件如果要结束的进程pid和要删除的文件名需要从标准输入中读取这个也很怪异吧。 但是像 cat与grep这些文字处理工具从标准输入中读取待处理的内容则很自然。 但是有时候我们的脚本却需要 echo 516 | kill 这样的效果例如 ps -ef | grep ddd | kill 这样的效果筛选出符合某条件的进程pid然后结束。这种需求对于我们来说是理所当然而且是很常见的那么应该怎样达到这样的效果呢。有几个解决办法 1. 通过 kill ps -ef | grep ddd #这种形式这个时候实际上等同于拼接字符串得到的命令其效果类似于 kill $pid 2. for procid in $(ps -aux | grep some search | awk {print $2}); do kill -9 $procid; done #其实与第一种原理一样只不过需要多次kill的时候是循环处理的每次处理一个 3. ps -ef | grep ddd | xargs kill #OK使用了xargs命令铺垫了这么久终于铺到了主题上。xargs命令可以通过管道接受字符串并将接收到的字符串通过空格分割成许多参数(默认情况下是通过空格分割) 然后将参数传递给其后面的命令作为后面命令的命令行参数 回到顶部 xargs是什么与管道有什么不同 xargs与管道有什么不同呢这是两个很容易混淆的东西看了上面的xargs的例子还是有点云里雾里的话我们来看下面的例子弄清楚为什么需要xargs echo --help | cat 输出--help echo --help | xargs cat 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Usage: cat [OPTION]... [FILE]... Concatenate FILE(s), or standard input, to standard output. -A, --show-all equivalent to -vET -b, --number-nonblank number nonempty output lines -e equivalent to -vE -E, --show-ends display $ at end of each line -n, --number number all output lines -s, --squeeze-blank suppress repeated empty output lines -t equivalent to -vT -T, --show-tabs display TAB characters as ^I -u (ignored) -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB --help display this help and exit --version output version information and exit With no FILE, or when FILE is -, read standard input. Examples: cat f - g Output fs contents, then standard input, then gs contents. cat Copy standard input to standard output. Report cat bugs to bug-coreutilsgnu.org GNU coreutils home page: http://www.gnu.org/software/coreutils/ General help using GNU software: http://www.gnu.org/gethelp/ For complete documentation, run: info coreutils cat invocation 可以看到 echo --help | cat 该命令输出的是echo的内容也就是说将echo的内容当作cat处理的文件内容了实际上就是echo命令的输出通过管道定向到cat的输入了。然后cat从其标准输入中读取待处理的文本内容。这等价于在test.txt文件中有一行字符 --help 然后运行 cat test.txt 的效果。 而 echo --help | xargs cat 等价于 cat --help 什么意思呢就是xargs将其接受的字符串 --help 做成cat的一个命令参数来运行cat命令同样 echo test.c test.cpp | xargs cat 等价于 cat test.c test.cpp 此时会将test.c和test.cpp的内容都显示出来。 回到顶部 xargs的一些有用的选项 相信到这里应该都知道xargs的作用了那么我们看看xargs还有一些有用的选项 1. -d 选项默认情况下xargs将其标准输入中的内容以空白(包括空格、Tab、回车换行等)分割成多个之后当作命令行参数传递给其后面的命令并运行之我们可以使用 -d 命令指定分隔符例如echo 112233 | xargs echo 输出112233默认情况下以空白分割那么112233这个字符串中没有空白所以实际上等价于 echo 112233 其中字符串 112233 被当作echo命令的一个命令行参数echo 112233 | xargs -d echo 输出11 22 33指定以符号分割参数所以等价于 echo 11 22 33 相当于给echo传递了3个参数分别是11、22、33 2. -p 选项使用该选项之后xargs并不会马上执行其后面的命令而是输出即将要执行的完整的命令(包括命令以及传递给命令的命令行参数)询问是否执行输入 y 才继续执行否则不执行。这种方式可以清楚的看到执行的命令是什么样子也就是xargs传递给命令的参数是什么例如echo 112233 | xargs -p -d echo 输出echo 11 22 33 ?...y 这里询问是否执行命令 echo 11 22 33 输入y并回车则显示执行结果否则不执行 11 22 33 执行结果 3. -n 选项该选项表示将xargs生成的命令行参数每次传递几个参数给其后面的命令执行例如如果xargs从标准输入中读入内容然后以分隔符分割之后生成的命令行参数有10个使用 -n 3 之后表示一次传递给xargs后面的命令是3个参数因为一共有10个参数所以要执行4次才能将参数用完。例如echo 11223344556677889900 | xargs -d -n 3 echo 输出结果11 22 3344 55 6677 88 9900等价于echo 11 22 33echo 44 55 66echo 77 88 99echo 00实际上运行了4次每次传递3个参数最后还剩一个就直接传递一个参数。 4. -E 选项有的系统的xargs版本可能是-e eof-str该选项指定一个字符串当xargs解析出多个命令行参数的时候如果搜索到-e指定的命令行参数则只会将-e指定的命令行参数之前的参数(不包括-e指定的这个参数)传递给xargs后面的命令echo 11 22 33 | xargs -E 33 echo 输出11 22可以看到正常情况下有3个命令行参数 11、22、33 由于使用了-E 33 表示在将命令行参数 33 之前的参数传递给执行的命令33本身不传递。等价于 echo 11 22 这里-E实际上有搜索的作用表示只取xargs读到的命令行参数前面的某些部分给命令执行。注意-E只有在xargs不指定-d的时候有效如果指定了-d则不起作用而不管-d指定的是什么字符空格也不行。echo 11 22 33 | xargs -d -E 33 echo 输出 11 22 33echo 11223344556677889900 aa 33 bb | xargs -E 33 -d -p echo 输出 11 22 33 44 55 66 77 88 99 00 aa 33 bb ## -0 选项表示以 \0 为分隔符一般与find结合使用 find . -name *.txt输出./2.txt./3.txt./1.txt 默认情况下find的输出结果是每条记录后面加上换行也就是每条记录是一个新行find . -name *.txt -print0输出./2.txt./3.txt./1.txt 加上 -print0 参数表示find输出的每条结果后面加上 \0 而不是换行find . -name *.txt -print0 | xargs -0 echo 输出./2.txt ./3.txt ./1.txtfind . -name *.txt -print0 | xargs -d \0 echo 输出./2.txt ./3.txt ./1.txtxargs的 -0 和 -d \0 表示其从标准输入中读取的内容使用 \0 来分割由于 find 的结果是使用 \0 分隔的所以xargs使用 \0 将 find的结果分隔之后得到3个参数 ./2.txt ./3.txt ./1.txt 注意中间是有空格的。上面的结果就等价于 echo ./2.txt ./3.txt ./1.txt实际上使用xargs默认的空白分隔符也是可以的 find . -name *.txt | xargs echo 因为换行符也是xargs的默认空白符的一种。find命令如果不加-print0其搜索结果的每一条字符串后面实际上是加了换行转载于:https://www.cnblogs.com/atai/p/9671212.html