grep是什么?怎么用?

经常读一些介绍unix命令的文章,但是文章所举的例子普遍价值不大,这就导致了看完了文章后我们并不知道如何有效地运用这些unix命令。

写在前面

三年前,作为面试官,我负责招聘unix系统管理员。那次来竞聘该岗位的共有8个人,其中两人是技术一流的自由职业者。我认为系统管理员没必要把所有的配置方法熟记于心,需要某个软件的时候,只要你想把它玩转并且玩得更酷,多读些文章,你便会自然而然地熟悉它的各种用法与配置。于是,我让这些应聘者解决下面两个问题:

  1. 创建一个例行任务,它在每个偶数点(比如2点、12点)和3点执行;
  2. 通过/var/run/dmesg.boot文件打印处理器信息。

让我吃惊的是,8位应聘者中没有一个人能解决上述问题,其中两人竟对grep命令一无所知。

介于此,我们就好好说说grep。

首先,以下所有的操作都是基于grep 2.5.1-FreeBSD:

有必要先交待下grep版本,因为某些用法只限定于特定的版本:

好了,言归正传,我们经常会这样grep文件:

还可以这样做:

这样也是可以的(虽然我很讨厌这种操作方式):

你肯定会遇到这样的场景:统计文件中带有某些关键字的行出现的次数。grep+wc可以帮到你:

条条大路通罗马,下面是另一条路:

下面我们新建一个测试用的文档:

继续grep的搜索之旅。

-w选项指定要搜索的单词:

如果想搜以特定字符开头(结尾)的单词,可以这样:

如果想搜以特定字符开头(结尾)的行,可以这样:

想要显示目标行的上下文吗?

到底是显示上文还是下文?

我们还可以这样玩grep:

或者取非:

grep是个强大的指令,除上述列举的之外,它还支持许多限定符、通配符以及正则表达式。下面是一些例子:

只获取IP地址相关的行:

上面的方法可行,但下面这种方法更好:

希望去掉注释行?

只要IP:

哎呀,被注释掉的127.0.0.1又回来了,这是指令执行顺序不当导致的,怎么破?

下面看下-v(反向查找)选项的使用。

假设要执行指令“ps –afx | grep ttyv ”:

OK,但是我们不需要“48798 2 S+ 0:00.00 grep ttyv”一行,使用-v:

看着不爽?现在呢?

别忘了| (或)符号:

殊途同归:

许多人都会在grep中用正则表达式,但你仍会忘了用POSIX字符集,即便它们也非常有用。

POSIX:

找有大写字母的行:

搜索结构不够醒目?高亮显示:

grep1

更多的grep小窍门。第一个稍显专业,我已经15年没用过了。

选择包含six,seven或者eight的行,很简单:

那么现在只选择包含six,seven或者eight若干次的行。这种用法叫回溯引用:

第二个窍门,这个更有用一些。打印504前后有tab的行(如果PCRE能够支持这个特性就好了)。

POSIX字符集在此失效了:

[CTRL+V][TAB]生效:

我漏讲什么了吗?grep具备递归搜索文件/目录功能。如果我们想在源码目录中搜索允许Intel使用外部SFPs的代码,但是又没清楚完整地记着函数名allow_unsupported_stp和unsupported_allow_sfp。肿么办?这正是grep的菜:

希望你还没晕,因为这些grep用法只是grep的冰山一角呢!

最后祝大家 Happy grepping!

5 收藏 4 评论

关于作者:honpey

(新浪微博:@Honpey) 个人主页 · 我的文章 · 1

相关文章

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部