0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用grep命令

CHANBAEK 来源:myfreax 作者:myfreax 2022-12-06 16:43 次阅读

grep命令的全称是全局正则表达式打印,它是Linux中功能最强大且最常用的命令之一。

grep在一个或多个输入文件中搜索与指定模式匹配的行,并将匹配行写入标准输出。如果未指定文件,grep则从标准输入读取内容。

grep读取的标准输入通常是另一个命令的输出。在本教程中,我们将通过实际示例向您展示如何使用grep命令,并详细说明最常用的GNU grep选项。

grep 命令

在开始使用grep命令之前,让我们先回顾一下grep基本语法。grep命令表达式采用形式grep [OPTIONS] PATTERN [FILE...]

方括号中的选项是可选的。其中OPTIONS可以零个或多个选项。Grep提供了个用于控制其行为的选项。

PATTERN搜索模式,可以是正则表达式。FILE零个或多个输入文件名。要能够搜索文件,运行命令的用户必须对该文件具有读取权限。

搜索字符串

grep命令的最基本用法是在文件中搜索字符串。例如,要搜索etc/passwd文件包含字符串bash的行,请运行命令grep bash etc/passwd

如果字符串包含空格,则需要将其用单引号或双引号引起来,例如搜索Gnome Display Manager,请运行命令grep "Gnome Display Manager" etc/passwd

grep bash etc/passwd
grep "Gnome Display Manager" etc/passwd
root:x:0:0:root:/root:/bin/bash
myfreax:x:1000:1000:myfreax:/home/myfreax:/bin/bash

grep排除与反转匹配

要显示与模式不匹配的行,请使用-v/--invert-match选项。例如,要打印etc/passwd文件中不包含字符串nologin的行。

请运行命令grep -v nologin etc/passwd

grep -v nologin etc/passwd
root:x:0:0:root:/root:/bin/bash
colord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
myfreax:x:1000:1000:myfreax:/home/myfreax:/bin/bash

grep 搜索标准输出

除了指定搜索文件之外,您还可以将另一个命令的标准输出传递给grep,然后仅打印与指定模式匹配的行。

例如命令ps -ef | grep www-data将查找系统以www-data用户运行的进程,可以运行ps命令然后通过管道传递给grep进行搜索没。

你可能没有注意到命令ps -ef | grep www-data的标准输出还包含当前grep进程的行。

如果您不希望显示该行,则可将标准输出再次通过管道传递到另一个grep实例排除grep进程的输出。例如命令ps -ef | grep www-data | grep -v grep

ps -ef | grep www-data
ps -ef | grep www-data | grep -v grep
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
root     18272 17714  0 16:00 pts/0    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

递归搜索

要使用递归搜索模式,请使用-r/--recursive选项。这将搜索指定目录中的所有文件,并跳过递归遇到的符号链接。

如果需要要跟踪所有符号链接,请使用-R/--dereference-recursive选项。

例如命令grep -r myfreax.com /etc将在/etc目录内搜索包含myfreax.com字符串的所有文件。

命令将以文件的路径为前缀的打印匹配的行,并使用冒号分隔:。你也可以使用-R选项搜索所有符号链接的文件。

grep -r myfreax.com /etc
grep -R myfreax.com /etc

仅显示文件名

要取消默认的grep命令打印的输出,仅打印包含匹配模式的文件名,可以使用-l/--files-with-matches选项。

例如命令grep -l myfreax.com *.conf将在当前工作目录中搜索所有以.conf结尾的文件。并仅打印包含字符串myfreax.com的文件名称。

你也可以组合-l选项与-R选项进行递归搜索文件。

grep -l myfreax.com *.conf
grep -Rl myfreax.com /tmp
tmux.conf
haproxy.conf

不区分大小写

默认情况下grep命令区分大小写。这意味着将大写和小写字符视为不同的字符。

要在搜索时忽略大小写,请使用-i/--ignore-case选项。例如命令grep Zebra /usr/share/words将搜索Zebra,不显示任何输出。

但是,如果使用-i选项执行不区分大小写的搜索,则它将同时匹配大小写字母。

grep Zebra /usr/share/words
grep -i Zebra /usr/share/words
zebra
zebra's
zebras

搜索全词

搜索gnu时,grep还将打印gnu嵌入在较大字词的行,例如cygnusmagnum。要仅返回指定字符串是整个单词的行,请使用-w/--word-regexp选项。

单词字符包括字母数字字符a-zA-Z0-9和下划线_。所有其他字符都被视为非单词字符,例如$等。

如果使用-w选项运行与上述相同的命令,grep命令则将仅返回gnu作为单独单词的行。

grep gnu /usr/share/words
grep -w gnu /usr/share/words
gnu

显示行号

要显示与模式匹配的行号,请使用-n/--line-number选项。使用此选项时,grep将匹配项打印到标准输出,并以找到的行号作为前缀。

例如命令grep -n 10000 etc/services,将在etc/services文件搜索包含bash字符的行。

以下输出显示在10423和10424行中找到的包含10000的行。

grep -n 10000 etc/services
10423:ndmp            10000/tcp
10424:ndmp            10000/udp

匹配统计

要打印与标准输出匹配的行数,请使用-c/--count选项。在以下示例中,我们统计以/usr/bin/zsh为默认shell的帐户数量。

grep -c '/usr/bin/zsh' etc/passwd
4

多模式与字符串搜索

grep允许可以使用或运算符组合两个或多个搜索模式。

默认情况下,grep将模式解释为基本正则表达式。诸如|之类的元字符会失去其特殊含义,必须使用其反斜杠版本。

如果使用扩展的正则表达式选项-E/--extended-regexp,则不应对或运算符|进行转义。

在下面的示例中,我们在Nginx错误日志文件中搜索单词fatalerrorcritical匹配的行。

grep 'fatal\\|error\\|critical' /var/log/nginx/error.log
grep -E 'fatal|error|critical' /var/log/nginx/error.log

静默模式

-q/--quiet选项指示grep不向终端写入任何内容,通常是标准输出。如果搜索到匹配的行,grep命令的退出代码将会是0。

这在检查文件是否包含指定字符串,并根据结果执行某些操作的shell脚本中使用grep时,这会很有用。

这是在if语句中使用grep静默模式作为测试命令的示例。

if grep -q PATTERN filename
then
    echo pattern found
else
    echo pattern not found
fi

正则表达式基础

GNU Grep具有两个正则表达式功能集,即Basic基本和Extended扩展。默认情况下,grep将模式解释为基本正则表达式。

^符号表示匹配行首,$符号匹配行尾,. 符号以匹配任意单个字符,[ ]中括号匹配指定范围的字符,[^ ]以匹配非中括号内的任意字符。

要转义字符的特殊含义,请使用反斜杠符号\\,例如要匹配符号$,你将以这样的形式转义\\$符号。

例如命令grep "^kangaroo" file.txt,将匹配字符串行首是kangaroo的行。命令grep "kangaroo$" file.txt匹配行尾是kangaroo$的行。

grep "^kangaroo" file.txt
grep "kangaroo$" file.txt

命令grep "kan..roo" file.txt匹配kan接着是两个任意字符,然后是roo的行。命令grep "acce[np]t" file.txt将会匹配acceptaccent的行。

模式co[^l]a将匹配包含co任何字符串a的行,例如cocacobalt等,但不匹配包含cola的行。

grep "kan..roo" file.txt
grep "acce[np]t" file.txt
grep "co[^l]a" file.txt

扩展的正则表达式

要将模式解释为扩展的正则表达式,请使用-E/--extended-regexp选项。扩展的正则表达式包括所有基本元字符。以及用于创建更复杂搜索模式的其他元字符。

在指定文件中提取电子邮件地址

grep -E -o "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}\\b" file.txt

在指定的文件提取IP地址

grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

-o选项用于仅打印匹配的字符串。

打印匹配行前半与后半部分

要在匹配行之前打印指定数量的行,请使用-B/--before-context选项。要在匹配的行之后打印指定数量的行,请使用-A/--after-context选项。

例如,要在匹配的行之前打印前五行,请运行命令grep -B 5 root etc/passwd

命令grep -A 5 root etc/passwd在匹配的行之后显示尾随五行。这个有点类似在指定位置截断。

grep -B 5 root etc/passwd
grep -A 5 root etc/passwd

结论

grep命令允许您在文件内部使用搜索模式。如果找到匹配项,则grep将打印包含指定模式的行。请访问Grep用户手册页面,了解Grep的更多信息

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209328
  • 命令
    +关注

    关注

    5

    文章

    683

    浏览量

    22011
  • grep
    +关注

    关注

    0

    文章

    22

    浏览量

    4723
收藏 人收藏

    评论

    相关推荐

    Linux中grep命令的12个实际例子

    Linux中grep命令的12个实际例子
    发表于 02-08 09:38 697次阅读

    [4.4]--Linux中grep命令

    Linux
    jf_90840116
    发布于 :2023年02月19日 20:39:28

    grep命令搜索字符串之技巧

    insight就能派上用场。但source insight有时候会莫名其妙的无法搜索字符串,可能是工程文件遭到破坏,必须重新创建工程才可以。其实我们也可以用linux下文本搜索工具grep,作者在工作当中
    发表于 12-17 23:34

    linux下的grep命令有什么区别?

    下面两个命令有什么区别1.grep . "abc" *2.grep . "abc"
    发表于 09-17 16:59

    12个 Linux 中 grep 命令的超级用法实例

    install grep #Debian/Ubuntu $ sudo yum install grep #RHEL/CentOS/Fedora我发现使用现实世界中的真实例子让你投身其中是让你接触grep
    发表于 05-12 08:00

    linux grep命令详解

    工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。  Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是
    发表于 03-31 10:05

    Linux 中 grep 命令的超级用法实例

    你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧。
    的头像 发表于 03-17 09:01 4637次阅读

    使用grep命令需要了解的12个实例

    grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具。无论何种原因,如果你的系统没有预装它的话,你可以很容易的通过系统的包管理器来安装它(Debian/Ubuntu系中的apt-get和RHEl/CentOS/Fedora系中的yum)。
    发表于 05-12 10:16 1114次阅读

    全面解析Linux的grep命令中正则表达式的用法

    Linux 附带有 GNU grep 命令工具,它支持扩展正则表达式extended regular expressions,而且 GNU grep 在所有的 Linux 系统中都
    发表于 04-02 14:46 525次阅读

    Linux中用grep命令来搜索单词及统计匹配的行数

    使用 grep 命令来搜索多个单词要使用 grep 命令来搜索多个字符串或单词,我们该怎么做?例如我想要查找 /path/to/file 文件中的 word1、word
    发表于 04-02 14:46 632次阅读

    Linux在在文件中查找文本的Grep命令

    grep命令是(global regular expression print,全局正则表达式输出)的缩写,它是Linux中功能最强大且最常用的命令之一。
    的头像 发表于 06-21 12:06 3312次阅读

    linux的scp命令怎么用_linux的grep命令用法

    在linux中,scp命令用于Linux之间复制文件和目录,即在一台Linux服务器中将本地的文件上传到一台远端服务器,或将远端服务器的文件下载到本地。scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令
    发表于 09-04 15:36 4422次阅读
    linux的scp<b class='flag-5'>命令</b>怎么用_linux的<b class='flag-5'>grep</b><b class='flag-5'>命令</b>用法

    如何使用grep命令的多种搜索模式及搜索多个字符串

    今天向大家介绍一个非常有用的技巧,那就是使用 grep 命令查找多个字符串。简单介绍一下,grep 命令可以理解为是一个功能强大的命令行工具
    的头像 发表于 09-07 11:24 2544次阅读

    grep命令常用的选项详解

    说明:在Rocky8系统中,grep默认帮我们把匹配到的字符串标注了红色,这点还是挺贴心的。其实大家可以用which命令看一下grep,你会发现grep其实是
    的头像 发表于 11-30 11:43 4533次阅读

    如何使用grep对标准输出进行过滤

    grep命令的全称是全局正则表达式打印,它是Linux中功能最强大且最常用的命令之一。
    的头像 发表于 12-12 17:30 2473次阅读