linux中grep命令的用法

作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的。

首先谈一下grep命令的常用格式为:grep  [选项]  ”模式“  [文件]

grep家族总共有三个:grep,egrep,fgrep。

常用选项:

  -E :开启扩展(Extend)的正则表达式。

  -i :忽略大小写(ignore case)。

  -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。

  -n :显示行号

  -w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker

  -c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。

  -o :只显示被模式匹配到的字符串。

  --color :将匹配到的内容以颜色高亮显示。

  -A  n:显示匹配到的字符串所在的行及其后n行,after

  -B  n:显示匹配到的字符串所在的行及其前n行,before

  -C  n:显示匹配到的字符串所在的行及其前后各n行,context

  

  

模式部分:

  1、直接输入要匹配的字符串,这个可以用fgrep(fast grep)代替来提高查找速度,比如我要匹配一下hello.c文件中printf的个数:fgrep  -c  "printf"  hello.c

  2、使用基本正则表达式,下面谈关于基本正则表达式的使用:

    匹配字符:

      . :任意一个字符。

      [abc] :表示匹配一个字符,这个字符必须是abc中的一个。

      [a-zA-Z] :表示匹配一个字符,这个字符必须是a-z或A-Z这52个字母中的一个。

      [^123] :匹配一个字符,这个字符是除了1、2、3以外的所有字符。

      对于一些常用的字符集,系统做了定义:

      [A-Za-z] 等价于 [[:alpha:]]

      [0-9] 等价于 [[:digit:]]

      [A-Za-z0-9] 等价于 [[:alnum:]]

      tab,space 等空白字符 [[:space:]]

      [A-Z] 等价于 [[:upper:]]

      [a-z] 等价于 [[:lower:]]

      标点符号 [[:punct:]]

      

    匹配次数:

      \{m,n\} :匹配其前面出现的字符至少m次,至多n次。
      \? :匹配其前面出现的内容0次或1次,等价于\{0,1\}。
      * :匹配其前面出现的内容任意次,等价于\{0,\},所以 ".*" 表述任意字符任意次,即无论什么内容全部匹配。

      

    位置锚定:

      ^ :锚定行首

      $ :锚定行尾。技巧:"^$"用于匹配空白行。

      \b或\<:锚定单词的词首。如"\blike"不会匹配alike,但是会匹配liker

      \b或\>:锚定单词的词尾。如"\blike\b"不会匹配alike和liker,只会匹配like

      \B :与\b作用相反。

      

      

    分组及引用:

      \(string\) :将string作为一个整体方便后面引用

        \1 :引用第1个左括号及其对应的右括号所匹配的内容。

        \2 :引用第2个左括号及其对应的右括号所匹配的内容。

        \n :引用第n个左括号及其对应的右括号所匹配的内容。

        

  3、扩展的(Extend)正则表达式(注意要使用扩展的正则表达式要加-E选项,或者直接使用egrep):

    匹配字符:这部分和基本正则表达式一样

    匹配次数

      * :和基本正则表达式一样

      ? :基本正则表达式是\?,二这里没有\。

      {m,n} :相比基本正则表达式也是没有了\。

      + :匹配其前面的字符至少一次,相当于{1,}。

    位置锚定:和基本正则表达式一样。

    分组及引用

      (string) :相比基本正则表达式也是没有了\。

        \1 :引用部分和基本正则表达式一样。

        \n :引用部分和基本正则表达式一样。

    或者

      a|b :匹配a或b,注意a是指 | 的左边的整体,b也同理。比如 C|cat 表示的是 C或cat,而不是Cat或cat,如果要表示Cat或cat,则应该写为 (C|c)at 。记住(string)除了用于引用还用于分组。

注1:默认情况下,正则表达式的匹配工作在贪婪模式下,也就是说它会尽可能长地去匹配,比如某一行有字符串 abacb,如果搜索内容为 "a.*b" 那么会直接匹配 abacb这个串,而不会只匹配ab或acb。

注2:所有的正则字符,如 [ 、* 、( 等,若要搜索 * ,而不是想把 * 解释为重复先前字符任意次,可以使用 \* 来转义。

下面用一个练习来结束本次grep的学习:

在网络配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33 中检索出所有的 IP

1、检索出 0-255的范围

2、由0-255的数字组合成IP

3、简化

grep -E 和 grep -P

周五想写一个shell脚本,目的是想检测目标jenkins网站是否有新的构建版本产生,如果有新的版本产生,那么执行a.shell这个脚本,如果没有,那么pass

jenkins网站源代码大概如下(省略不重要的部分):

<html> ...
<a href="http://xxx.com">
#123
</a>
...</html>

目标数据就是<a>标签下面的#123(#123是单独的一行)

首先用curl http://xxx.com从网站截取网页源代码,之后直接使用管道+grep将想要获取的数据过滤出来,类似curl http://xxx.com | grep -E '#\d{3}'赋值给一个字符串,不过后来想用curl http://xxx.com -o 'test.file'先讲原网页的代码输出到文件中,然后使用grep -E '#\d{3}' test.file来取出目标数据。当然了,这两种方法目的都是一样的。然而使用第一种方法的时候,屏幕会输出curl的进程流,这个并不是我想看到的,查了下,加上-s参数(使用静默模式,不会输出到标准屏幕)即可解决。

但是新的问题又来了,grep -E '#\d{3}'得到的数据是空,过滤不出来数据?

后来在网上查了一些资料,发现不同的系统,所使用的正则表达式引擎是不一样的。

当时在CentOS下面,grep -E主要是用来支持扩展正则表达式,比如|&这些符号,用于grep多条件查询,并非是使用标准正则表达式。在shell下面man grep看了下,加上-P(使用Perl的正则引擎)即可过滤出目标数据

但是在MAC OS下面man grep是没有-P参数的,为什么?因为新的主流正则引擎已经默认加上了-P参数了。

作者:Zey
链接:https://www.jianshu.com/p/e1acfb7989b2 
来源:简书
著作权归作者所有。非商业转载请注明出处。

(0)

相关推荐

  • 如何在 Linux 中使用 grep 和正则表达式搜索文本模式

    介绍 该grep命令是Linux终端环境中最有用的命令之一.grep全称为global regular expression print(全局正则表达式打印).这意味着您可以grep用来查看接收到的输 ...

  • linux中find命令高级用法

    https://www.cnblogs.com/bianchengzhuji/p/10133821.html 在<Linux中的文件查找技巧>一文中,我们已经知道了文件查找的基本方法,今天 ...

  • linux中cd命令的15个示例

    在 Linux 中cd' (Change Directory) 命令对于新手和系统管理员来说是最重要和最广泛使用的命令之一.对于无头服务器上的管理员,'cd' 是导航到目录以检查日志.执行程序/应用程 ...

  • Linux中screen命令

    screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换.GNU Screen可以看作是窗口管理器的命令行界面版本.它提 ...

  • Linux中sed命令如何使用?Linux入门教程

    sed是一项Linux指令,也是Linux中的重要命令之一,在文本处理方面有着非常重要的作用,可处理文本的行与列.那么sed是什么?Linux中sed命令如何使用?具体内容请看下文: sed是什么? ...

  • Linux中 ip 命令的使用实例

    在以前的Linux系统版本中,我们一直使用' ifconfig '命令查看ip地址等信息.但是"ifconfig"已经不再被维护,并在近几年的Linux版本中已经被弃用. ifco ...

  • 编程语言关于linux中sed命令的示例代码分享详解

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处 ...

  • Linux 中强大且常用命令:find、grep

    http://www.shengchulai.com/blog-YBJEiyFQfx.htm 在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会 ...

  • linux中其他搜索命令(locate/which/whereis/grep)

    目录 locate which whereis grep locate 解释 命令名称:locate命令所在路径:/usr/bin/locate执行权限:所有用户功能描述:在文件资料库中查找文件 语法 ...

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

    [日期:2020-05-14]来源:Linux公社  作者:醉落红尘[字体:大 中 小]grep命令是(global regular expression print,全局正则表达式输出)的缩写,它是 ...