所在位置:

Linux下grep命令的12个例子【翻译】

你曾经处理过要在文件中查找特定的字符串或者模式,但不知道从哪里开始查找吗?那么,这里的 grep 命令是你的救星!

grep 是一个非常强大的文件模式查找器,配备在每一个发布的 Linux中。如果,不管什么原因没有在你的系统里安装这个 grep,你可以很容易通过包管理器( 在 Debian/Ubuntu 使用 apt-get 和 在 RHEL/CentOS/Fedora 使用 yum )来安装

$ sudo apt-get install grep         #Debian/Ubuntu
$ sudo yum install grep             #RHEL/CentOS/Fedora

我发现有一种非常简单地方式可以让你尝试grep就是立即使用一些真实例子的使用。

搜索和查询文件

假如你已经在你的机器上安装了一个新的Ubuntu,你准备想给 Python 脚本一个快照。你上网搜索教程,但是你看到有两个不同的 Python 版本在使用,并且你不知道你的 Ubuntu 系统上安装的是哪一个,或者是否安装了任何模块。简单地运行下面的命令:

# dpkg -l | grep -i python
简单地输出
ii  python2.7                        2.7.3-0ubuntu3.4                    Interactive high-level object-oriented language (version 2.7)
ii  python2.7-minimal                2.7.3-0ubuntu3.4                    Minimal subset of the Python language (version 2.7)
ii  python-openssl                   0.12-1ubuntu2.1                     Python wrapper around the OpenSSL library
ii  python-pam                       0.4.2-12.2ubuntu4                   A Python interface to the PAM library

首先,我们运行 dpkg -l 命令来列出在你的系统上安装了哪些 deb 包。其次,我们可以把结果通过管道传输给 grep -i python 命令,它是一个简单地状态 “使用grep和过滤并用python返回一切东西”。这个 -i 选项就是忽略大小写,因为 grep 是大小写敏感的。使用 -i 选项是一个非常好的习惯,除非你想尝试更具体地搜索。

搜索和过滤文件

这个 grep 能够在单个和多个文件中搜索和过滤。让我们来看一下这个场景:

你在处理 Apache Web 服务器中出了点问题,虽然你已经找了很多的讨论来请求帮助。最主要的核心是那些回复你的人叫你发 /etc/apache2/sites-available/default-ssl 文件的内容。如果你能移除所有的注释行,对于想帮助你和想阅读它的人来说,不是更容易么?嗯,你可以的!运行这个:

# grep –v “#”  /etc/apache2/sites-available/default-ssl

这个 -v 选项告诉 grep 要反向输出,意味着不是打印匹配的行,而是刚刚相反,要打印所有不匹配表达式的行,在这种情况下,就是 # 注释行。

仅仅查找所有 .mp3 文件

这个 grep 从标准的输入来进行过滤是非常有用的。例如,让我们来说一下你有一个目录里面包含了有很多不同的格式音乐文件。你想从艺术家 JayZ 来查找所有的 mp3文件,但是你不想有任何混音曲目,使用一个 find 命令和两个管道的grep命令就能够实现:

# find . –name “*.mp3” | grep –i JayZ | grep –vi “remix”

在这个例子中,我们使用find命令打印所有以 *.mp3 后缀的文件,用管道传输给 grep -i 来进行过滤,并且打印所有以 "JayZ" 命名的文件和另外一个 grep -vi 的管道来过滤不打印所有以 "remix" 字符串( 在任何况下 )的文件。

建议阅读: 35 Practical Examples of Linux Find Command

显示搜索字符串的之前或者之后的行数

另一个选项是 -A 和 -B 开关,用来显示匹配的行和显示匹配字符串不是这一行的之前就是这一行之后的行数。虽然使用 man page 帮助给出更多的解释,但是我发现最容易记住的选项是 -A = after, 和 -B = before:

# ifconfig | grep –A 4 eth0
# ifconfig | grep  -B 2 UP

打印匹配周围的行数

这 grep's -C 选项跟上面的选项是非常相似的,但是不是打印之前或者之后字符串的行数,而是打印之前和之后的行数:

# ifconfig | grep –C 2 lo

打印匹配的行数

跟把 grep 的字符串传给管道来统计单词类似(wc 程序) grep's 内置了一个选项对于你来说也能执行相同的操作:

# ifconfig | grep –c inet6

用给定的字符串来搜索文件

当调试文件在编译错误的时候,这个 -n 选项对于 grep 来说是非常有用的。它显示给定搜索字符串的文件中的行数:

# grep –n “main” setup..py

在所有目录中递归搜索字符串

如果你想在当前目录中包含子目录来搜索一个字符串,你可以指定 -r 选项来递归搜索:

# grep –r “function” *

搜索整体模式

传递 -w 选项给 grep 可以在字符串实现整体模式搜索,例如,使用:

# ifconfig | grep –w “RUNNING”

将会打印包含该模式的行,另一个方面,如果你尝试:

# ifconfig | grep –w “RUN”

没有任何东西返回因为我们不是在搜索一种模式,而是整个单词。

在压缩字符串中搜索

值得注意的是 grep's 的衍生物。首先是 跟 acat 类似的 zgrep,是在压缩文件上使用的。它以相同的选项查找和使用相同的方式:

# zgrep –i error /var/log/syslog.2.gz

在文件中匹配正则表达式

这个 egrep 是另外一个衍生物,代表的是 "扩展全局正则表达式"。它识别额外的表达式元字符像 + ? | 和 ()。

建议阅读: Grep、Egrep和Fgrep在Linux中的区别?

egrep 用来查找源代码文件和其它的代码片段是非常有用的,它可以通过用 grep 指定 -E 选项来调用正则。

# grep –E

查找固定模式字符串

这个 fgrep 用来搜索固定模式字符串的文件或者文件列表。它等同于 grep -F。一个常用的方式是使用 fgrep 传递一个模式文件给它:

  1. Search a Fixed Pattern String
# fgrep –f file_full_of_patterns.txt file_to_search.txt

这只是一个开始,正如你所能看到的一样,它对于各种用途是无价的。除了我们可以实现简单地单行命令,grep 也可以用来写强大的 cron 任务和强大的 shell 脚本。

建议阅读:在字符类和括号表达式中使用的 11个 'Grep' 命令

在帮助的页面,使用有创造力地去实现一些选项,利用 grep 的表达式来服务你自己的用途。

原文

【上一篇】grep的基本用法

【下一篇】sed的基本用法