Bash Shell管道中进行搜索

Bash Shell管道中进行搜索,你要搜索的文本并不在文件中,而是在某个命令或命令管道的输出中。

解决方案

将输出导入 grep 即可。

some pipeline | of commands | grep

讨论

如果没有提供文件名,grep 会从标准输入读取。大多数经过良好设计可用于 shell 脚本编程的实用工具会这么做。这也是它们能够作为 shell 脚本的构建块(building block)发挥作用的原因之一。

如果还想用 grep 搜索上一个命令中的错误信息,那么要确保在管道之前将该命令的错误输出重定向到标准输出。

gcc bigbadcode.c 2>&1 | grep -i error

此命令尝试编译一些假想的代码。将输出通过管道(|)传给 grep 之前,我们先重定向命令的标准错误到标准输出(2>&1),然后由 grep 搜索字符串 error,不区分其大小写(-i)。

对 grep 的结果再执行 grep 也不是不可能的事。为什么要这么做?这是为了进一步缩小搜索范围。假设你想要找出 Bob Johnson 的电子邮件地址。

$ grep -i johnson mail/*
... too much output to think about; there are lots of Johnsons in the world ...
$ !! | grep -i robert
grep -i johnson mail/* | grep -i robert
... more manageable output ...
$ !! | grep -i "the bluesman"
grep -i johnson mail/* | grep -i robert | grep -i "the bluesman"
Robert M. Johnson, The Bluesman <rmj@noplace.org>

你可以将第一个 grep 命令再输入一遍,但这个示例还展示了历史运算符 !! 的威力。!! 可以重复上一个命令,无须重新输入。然后就像示例那样在 !! 之后添加新的命令。shell 会显示所执行的命令,因此你会看到 !! 替换后的结果。

你可以按照这种方法简单快速地构建一个比较长的 grep 管道,查看中间步骤的结果,并决定如何用其他 grep 表达式改善搜索过程。也可以用单个 grep 配合精巧的正则表达式来完成相同任务,不过我们发现以增量方式构建管道要来得更加容易。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!