原创

如何使用Grep

Grep是一个命令行实用程序,可以使用常见的正则表达式语法搜索和过滤文本。它无处不在,动词“to grep”已经成为“搜索”的同义词。它grep是一个有用的工具,用于在选择的文件中查找所有出现的搜索词,过滤日志文件或流,或作为一部分脚本或命令链。

本教程需要一台已经设置好可以使用sudo命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器

使用Grep

本指南引用了GNU grep的最新版本,默认情况下所有的腾讯云CVM的镜像中都有包含。它也是几乎所有基于Linux的操作系统发行版中提供的软件包的公共基础选择的一部分。

Grep命令

grep的一个基础用法如下:

grep "string" ~/threads.txt

grep的第一个参数是搜索模式。第二个(可选)参数是要搜索的文件的名称。上面的序列将搜索~/threads.txt文件中出现的所有“string”。

如果要搜索多个文件,-r标志将启用目录树的递归搜索:

grep -r "string" ~/thread/

在特定文件上使用时,grep仅输出包含匹配字符串的行。当以递归模式运行时,grep输出文件的完整路径,后跟冒号以及与模式匹配的行的内容。默认情况下,grep中的模式是基本的正则表达式。如果您需要更具表现力的正则表达式语法,grep能够接受具有以下标志的备用格式的模式:

标志

用法

-E

使用扩展正则表达式语法。相当于已弃用的egrep命令。

-P

使用Perl正则表达式语法。

Grep提供了许多强大的选项来控制其输出:

标志

用法

-o

仅输出每行的匹配段,而不是每个匹配行的完整内容。

-n

打印每个匹配行的行号。

-C 2

除匹配的行外,还显示2个(或其他数量)上下文行。

除了从文件中读取内容外,grep还可以从标准输入中读取和过滤文本。任何命令或流的输出都可以通过管道输出到grep命令。然后,grep根据指定的匹配模式过滤此输出,并仅输出匹配的行。例如,给定以下命令:

ls --help | grep "dired"

这会过滤ls命令帮助文本的输出并查找“dired”,并将它们输出到标准输出:

-D, --dired generate output designed for Emacs' dired mode

正则表达式概述

虽然简单的模式匹配对于某些过滤任务已经足够,但grep真正的强大之处在于它能够使用正则表达式进行复杂的模式匹配。正则表达式中的大多数字符与字面上的输入数据匹配; 但是,有一些序列具有特殊意义:

符号

结果

匹配任何角色。

*

匹配前一个字符的零个或多个实例。

+

匹配前一个字符的一个或多个实例。

[]

匹配括号内的任何字符。

()

创建一个子表达式,可以将其组合以生成更复杂的表达式。

|

OR运算符; (www | ftp)匹配“www”或“ftp”。

^

匹配一行的开头。

$

匹配线的末尾。

\

规避以下角色。由于.匹配任何字符,以匹配您需要使用的文字句点\.。

使用Grep 过滤日志

一个grep流行的用途是从系统日志中提取有用的信息:

grep -Eoc "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.* 200"  /srv/www/example.com/logs/access.log

在此命令中,grep过滤所有以IP地址开头的行的Apache访问日志,后跟多个字符,一个空格,然后是字符200(其中200表示成功的HTTP连接)。-c选项仅输出匹配数的计数。要获取访问者的IP地址的输出以及请求成功请求的文件的路径,请省略-c标志:

grep -Eo "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.* 200"  /srv/www/example.com/logs/access.log

花括号指定模式的实例数。{1,3}要求前一个字符至少出现一次,但不超过三次。字符类[0-9]将与一个或多个数字匹配。您还可以生成类似的输出,但报告访问内容的尝试失败:

grep -Eo "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.* 404"  /srv/www/example.com/logs/access.log

以下命令将生成尝试连接到Web服务器的所有IP地址的列表。使用-o选项,只有匹配的字符串被发送到标准输出。uniq使用管道运算符(|)通过实用程序过滤此输出以过滤掉重复的条目:

grep -Eo "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /srv/www/example.com/logs/access.log | uniq

下一个示例使用替代模式来匹配不同日志中的IP地址。以下命令在最近的/var/log/auth.log文件中搜索无效的登录尝试:

grep -Eo "Invalid user.*([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/auth.log

您可以将上述命令拆分为两层,以输出登录尝试失败的IP地址列表到您的系统:

grep "Invalid user" /var/log/auth.log | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" | uniq

grep可以过滤命令的输出,例如tail -F提供对特定日志事件的实时监控:

tail ~/.procmail/procmail.log -F | grep "Subject"

在这种情况下,请tail遵循~/procmail/procmail.log文件。此输出传递给grep,它过滤流并仅打印包含字符串“Subject”的行。

使用Grep过滤命令

grep可以用来过滤长时间的帮助文件。这个命令过滤tar帮助文本,以更有效地找到处理bzip文件的选项::

tar --help | grep "bzip"

grep对于ls列出具有大量文件的目录内容时的输出也很有用:

ls /usr/lib | grep "xml"

使用zgrep grep压缩文件

zgrep命令的功能与上面的grep命令完全相同; 它在grep命令的基础增加了压缩和解压的功能:

zgrep -Eo "Invalid user.*([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/auth.log.2.gz

zgrep由于读取压缩文件的额外开销,操作所需的时间比grep操作长。

总结

怎样,你学会了嘛?赶快购买服务器尝试下吧! 想要学习更多相关知识,请访问腾讯云云+社区


参考文献:《How to Grep for Text in Files》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用JavaScript和D3.js实现数据可视化

    D3.js是一个JavaScript库。它的全称是Data-Driven Documents(数据驱动文档),并且它被称为一个互动和动态的数据可视化库网络。20...

    独木桥先生
  • 如何在Ubuntu系统上搭建MySQL数据库

    MySQL原本是一个开放源代码的关系数据库管理系统,原开发者为瑞典的MySQL AB公司,2009年,甲骨文公司(Oracle)收购MySQL,成为Oracle...

    独木桥先生
  • 如何在Ubuntu 14.04上配置Apache内容缓存

    缓存是一种通过允许以允许更快访问的方式临时存储共同请求的内容来提高服务器性能的方法。这通过减少一些资源密集型操作来加速处理和交付。

    独木桥先生
  • 常用Linux命令整理

    1、匹配文本内容,常用grep -E '查找的内容' 文件名。更多用法参考:https://www.cnblogs.com/leo-li-3046/p/5690...

    用户5325874
  • Linux常用命令03 - grep

    grep 命令代表“全局正则表达式 print” ,它是 Linux 中最强大和最常用的命令之一。

    叉叉敌
  • Linux - 常用命令:grep

    参数 -c 只输出匹配行的个数。 -i 不区分大小写(只适用于单字符)。 -h 查询多文件时不显示文件名。 -l 查询多文件时只输出包含匹配字符的文件名。 -n...

    以谁为师
  • 【Go 语言社区】linux 下Go服务器部署(也同样适合C++等)

    作为服务器开发人员,GO语言内网测试数据及调试肯定很简单,如果你在Windows下开发 直接编成EXE执行就可以,然后部署外网在打包成linux的执行文件(交...

    李海彬
  • spring boot 部署为jar

    前言 一直在ide中敲代码,使用命令行mvn spring-boot:run或者gradlew bootRun来运行spring boot项目。想来放到prod...

    Ryan-Miao
  • Linux三剑客之grep

    版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

    耕耘实录
  • linux grep工作常用

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

    bear_fish

扫码关注云+社区

领取腾讯云代金券