新手求教grep问题!

thy38 2012-09-03 11:17:44
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。百思不得其解。
...全文
108 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-09-04
  • 打赏
  • 举报
回复
因为标准错误是打到2的,标准输出是打到1的。 你这里输出的不是grep拿到的,是直接ls输出的。

把描述符2 dup2到 1即可, 即dup2(1, 2),也即shell里的2>&1
Linux-Torvalds 2012-09-04
  • 打赏
  • 举报
回复
那是ls的问题了,不是grep的关系了。
fdl19881 2012-09-04
  • 打赏
  • 举报
回复
得从程序实现上理解吧,,局限于SHELL可能就无法想通了。

你的第二个例子的结果 $?不为0
我给出来的结果的 $?为0
fdl19881 2012-09-04
  • 打赏
  • 举报
回复
管道 | 只是将前一个的标准输出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"
这下你的目的就达到了。。。

23,127

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧