管道 |
管道是一种通信机制,通常用于进程间的通信(也可通过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,所以处理包含空格的文件名,也不会报错。
网友评论