日期:2014-05-16  浏览次数:20797 次

关于管道命令中grep的问题

find /etc -type f | grep '\*'
find /etc -type f |xargs grep '\*'
ifconfig eth0 | grep 'inet addr'

想问下,第一行的命令执行为什么没结果?grep本身不就是管道命令吗?
第三行为什么不加就可以?
------解决方案--------------------
引用:

find /etc -type f 
------解决方案--------------------
 grep '\*'
find /etc -type f 
------解决方案--------------------
xargs grep '\*'
ifconfig eth0 
------解决方案--------------------
 grep 'inet addr'

想问下,第一行的命令执行为什么没结果?grep本身不就是管道命令吗?
第三行为什么不加就可以?


find /etc -type f 
------解决方案--------------------
 grep '\*'
pipe之前的部分输出
/etc/a.sh
/etc/b.rc
那么此时grep的收入为这些"字符串"
如果/etc目录下有文件名中包含了*号,则grep 有输出;如果没有,则grep 没有输出

find /etc -type f 
------解决方案--------------------
xargs grep '\*'
pipe之前的部分输出
/etc/a.sh
/etc/b.rc
则因为xargs的存在
pipe之后的部分需要执行
grep  '\*'  /etc/a.sh
grep '\*'  /etc/b.rc
也就是说此时grep的输入为find 找到的各个文件;而不是find命令输出的文本
------解决方案--------------------
你这种写法加不加xargs根本就是两个不同的命令。
第一行
find /etc -type f 
------解决方案--------------------
 grep '\*'   
这是在find的结果中,找带*的行,这个结果是指find出来的"文件名"。如果文件名中没有*,那就没输出。
类似于echo 'file1 file2 ... ' 
------解决方案--------------------
 grep '\*'
第二行
find /etc -type f 
------解决方案--------------------
xargs grep '\*'
这是将find的结果,作为参数传给grep,也就是说让grep去这个结果的文件内容里去找带 '*'的行。相当于
grep '\*' file1 file2 ...
第三行
ifconfig eth0 
------解决方案--------------------
 grep 'inet addr'
这是在ifconfig的结果中查找'inet addr',如果你这时候带了xargs,会将ifconfig的结果作为一个个文件名去grep,你会得到一堆找不到文件的报错。