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

新手求教grep问题!
grep -v 是反匹配,匹配不到即为成功,
我也测试了一下:
dmraid -s -c | grep -iv "no raid disks"
我的机器里没有raid,因此这条语句不会有匹配。

但我在下面这句里却不对了,我本想匹配Windows的C盘根目录下有没有pagefile.sys的,我故意打成了pagefiles.sys:
ls pagefiles.sys | grep -iv "no such file"
却会有匹配:
ls: cannot access pagefiles.sys: no such file or directory

Debian 6.05 amd64。百思不得其解。

------解决方案--------------------
管道 | 只是将前一个的标准输出1通过管道重定向到后一个程序的标准输入0,,,而标准错误输出2并没被重定向。
第一个例子成功是因为dmraid -s -c正常,所以将信息输出到标准输出,被重定向到grep的输入了。
第二个例子在执行 ls pagefiles.sys时,因为不存在此文件,所以程序ls输出通过标准出错2输出了错误信息。grep通过标准输入什么都没收到,,所以grep是成功的,而ls出错了。

如你将第二个例子改成:
ls pagefiles.sys 2>&1 | grep -lv "no such file"
这下你的目的就达到了。。。
------解决方案--------------------
因为标准错误是打到2的,标准输出是打到1的。 你这里输出的不是grep拿到的,是直接ls输出的。

把描述符2 dup2到 1即可, 即dup2(1, 2),也即shell里的2>&1