美文网首页
linux xargs,-exec,|管道的区别

linux xargs,-exec,|管道的区别

作者: 皮儿吃屁 | 来源:发表于2020-08-21 14:57 被阅读0次

管道 |

管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。

xargs

将前一个命令的输出作为命令行参数传给后面的命令。

-exec

  • 要结合{};来用, {}表示前面查询的结果;结束符\;这是固定的写法
  • 参数是一个一个传递的,传递一个参数执行一次
  • 文件名有空格等特殊字符也能处理

标准输入与管道命令

cat /etc/passwd | grep root

上面的代码使用了管道命令(|)。管道命令的作用,是将左侧命令(cat /etc/passwd)的标准输出转换为标准输入,提供给右侧命令(grep root)作为参数。
因为grep命令可以接受标准输入作为参数,所以上面的代码等同于下面的代码。

 grep root /etc/passwd

但是,大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数。举例来说,echo命令就不接受管道传参。

echo "hello world" | echo

上面的代码不会有输出。因为管道右侧的echo不接受管道传来的标准输入作为参数。

linux常用的可用于管道操作的命令

命令 作用 实例
cut 将一段信息的某一段切出来,处理的信息是以行为单位。 echo $PATH | cut -d ':' -f 3-5 //将path的值按照':'进行分割,后取出第3到5个值
grep 分析一行信息,如果有匹配的,就将该行拿出来。 cat /etc/passwd | grep root //列出输出中带有root的行
sort 可以依据不同的数据类型进行排序。 cat /etc/passwd | sort -t ':' -k 3 -n //根据 passwd中每行,按':'分隔符进行分隔后,按照第3个字段使用纯数字的方式进行排序。
uniq 重复的行只显示一个 last | cut -d ' ' -f1 | sort | uniq -c //列出登录者名字,并进行排序,进行统一处理,并计数。
wc 统计指定文件中的字节数、字数、行数,并将统计结果显示输出 cat /etc/man.config | wc //输出三个数字,分表代表行,字数,字符数
tee 双重定向,存到文件/设备的同时,输出到屏幕以便继续处理 ls -l / | tee -a file.list | more //把文件目录输出到file.list中,同时用more将其输出到屏幕

xargs与-exec的区别

  • exec是对每个找到的文件执行一次命令,除非这单个的文件名超过了几k,否则不
    会出现命令行超长出报错的问题。
  • 而xargs是把所有找到的文件名一股脑的转给命令。当文件很多时,这些文件名组合成的命
    令行参数很容易超长,导致命令出错。
find . -name '*.txt' -type f | xargs echo begin

xargs将参数一次传给echo,即执行:echo begin ./xargs.txt ./args.txt

find . -name '*.txt' -type f -exec echo begin {} \;

exec一次传递一个参数,即执行:echo begin ./xargs.txt;echo begin ./args.txt

  • find | xargs 这种组合在处理有空格字符的文件名时也会出错,因为这时执行的命令已经不知道哪些是分割符、哪些是文件名中的空格!
find /path -type f -print0 | xargs -0 rm

find命令有一个特别的参数-print0,指定输出的文件列表以null分隔。然后,xargs命令的-0参数表示用null当作分隔符。由于分隔符是null,所以处理包含空格的文件名,也不会报错。

相关文章

网友评论

      本文标题:linux xargs,-exec,|管道的区别

      本文链接:https://www.haomeiwen.com/subject/qzcujktx.html