grep 文本查找工具

简介

grep一种文本字符查找工具,会以行为单位查找可以匹配字符的行,并且默认情况下显示整行。

我们所要做的就是:书写特定的字符,来匹配我们想要的内容。

字符分为两类: 一就是普通的字符,二是一种我们称之为‘元字符’的具有特殊意义的高上大字符。 而这种由普通字符或元字符所组合起来的,用于表达、匹配特定字符的字符串, 我们就称之为 “正则表达式”“正则表示法”等等...  正则表达有很多规范,这里只说grep用的, 因为别的也不会

对了要注意一点: 元字符跟通配符是完全不同的两种表示方法, 通配符是bash提供的,而正则表示式却是一部分软件所提供的一种更加强大的字符串搜索功能。

正文

  1. 命令介绍
  2. 基本正则表达式
  3. 扩展的正则表达式
  4. POSIX字符组
  5. 后话

一、命令介绍

grep有两个扩展功能,分别用选项 -E ,-F 来启用。  而为了方便区分这两个功能,就又形成了另外两个命令, 分别是 egrep , fgrep.   一个是支持扩展的正则表达式,一个是只支持普通字符。

grep [options] ‘pattern’ [file,.....]

常用选项:
             -v 显示没有匹配到的内容。
             -o 只显示匹配到的字符,而不是整行。
             -i 不区分大小写。 ignore-case.
             -E 支持扩展的正则表达式。
             -A #  同时显示匹配到的行的下边#行。
             -B #  同时显示匹配到的行的上边#行。
             -C #  同时显示匹配到的行的上下#行。

--color=auto 所匹配到的字符自动以颜色显示。

grep中想要匹配的内容,我们称之为 模式(pattern)。
    这个命令支持管道 所以file数据可有可无。

二、基本正则表达式

以下这些都是元字符。正则表达式有很多规范, 我们只说linux的。

字符匹配:
           .  点号 任意单个字符。
          []  指定里面的任意单个字符,  如: [acdb],a,c,d,b,这四个单字符都会匹配,
         [^]  不匹配里面的任意单个字符。  跟上面完全相反,这四个单字符都不会匹配。

次数匹配:前面的字符的次数。
           *   任意次前面的字符。前面的那个字符和*相当于是一体的,

.*   只是一种应用方法,代表任意个任意字符。
          \?   前面字符的0次或1次。          0次相当于没有前面的字符, 次数匹配都是这样。
       \{m\}   前面的字符的m次。
     \{m,n\}   前面的字符的m-n次。            如: \{2,3\}    2-8次前面的字符。
      \{m,\}   前面的字符至少m次。            没有上限,只有下限。
     \{0,n\}   前面的字符至多只有n次。        有上限,下限是0个 就是前面的字符可有可无的。
                          
              
     位置锚定:用于指定字符出现的位置。
           ^   指定行首
           $   指定行尾
          ^$   这个只是一种应用方法, 代表空白行。 行首跟着行尾  空白行。
       \<char  查找以字符开头的单词。 用 \b 也行。 \bchar 。 char是字符的意思。
       char\>  查找以字符结尾的单词。 用\b 也行。   char\b

组:

\(\)  用于把单个字符组合成多个字符, 以组的方式再来次数匹配。 而且可以被引用。下边

\#   后向引用,也叫向后引用。

#为数字,可以引用第#个组的匹配结果,也就是第#个小括号,

注意引用的是组所匹配到的结果,而不是把组的功能都给复制过来。

下面列举一些例子让大家熟悉下规则:

1.  我们想要查找有 people 的行,不区分大小写。

[[email protected] ~]# grep --color=auto -i "people" text.tx
              People in the park                                       #看到了吗,People
              [[email protected] ~]#

怎么样简单吧, 为了方便使用,下面的例子我就把--color选项直接加到grep的别名中了。

#alias grep=‘grep --color=auto‘

2. 尝试一下 . 这个小点的功能。 我们查找下以 f 开头,中间两个任意字符,以 m 结尾的都有哪些。

[[email protected] ~]# grep "f..m" text.tx
              But from behind the walls of doubt
              [[email protected] ~]#

3. 我记得第一个 要么是g 要么是m ,中间是两个一样的,结尾一个d,怎么查  []   \{m\}

还有 \{m,n\} .. 都是一样的意思,只不过是从几到几的一个范围,而不是指定几个。

[[email protected] ~]# grep  "[gm].\{2\}d" text.tx

good morning everyone
              I had a dream, I had an awesome dream
              As we go down life‘s lonesome highway
              [[email protected] ~]#

结果怎么是这样的呢, 这是因为 . 是任意字符, 而\{2\} 是代表2个前面的字符,也就是两个任意字符了,次数匹配也就这意思了。那么有没有办法让中间的一样呢,办法是有的,用组和后向引用,虽然感觉上有点大材小用。                     \(\)    \# 后向引用

[[email protected] ~]# grep  "[gm]\(.\)\1d" text.tx
              good morning everyone
              [[email protected] ~]#

看看,我们要的是这个结果吧。 上面的意思就是 小括号里面的 . 所匹配到的是什么结果,后面\1也就是什么结果, 在个例子中,小括号是 o , 那么 \1 也就是 o.

4. 查找下行开头是A 或者 As 。        ^   \?

[[email protected] ~]# grep "^As\?" text.tx
              And what they played
              A voice was crying out
              As we go down life‘s lonesome highway
              [[email protected] ~]#

怎么样,了解乎。  \? 表示前面的字符可有可无。

5. 再查找个单词试试,way , 找这个单词,很简单吧, 那我们就来试试。

[[email protected] ~]# grep "way" text.tx
             Say it for always
             That‘s the way it should be
             Say it for always
             That‘s the way it should be

Say it for always

.........
             [[email protected] ~]#

What? 搞什么仙人板板,  把有关way的字符串都给拉出来了。 那么   \<  \>

[[email protected] ~]# grep "\<way\>" text.tx
             That‘s the way it should be
             That‘s the way it should be
             When you feel you‘ve lost your way
             That‘s the way it should be
             That‘s the way it should be
             [[email protected] ~]#

\<  \> 指定单词用的, 这两个符号的两边只允许出现空格或者标点符号。

7. 查找以组为单位的重复字符。在这里是2到无限多个 组的次数匹配,  \(\)  \{m,\}

[[email protected] ~]# grep "\(way\)\{2,\}" text.tx
             Say it for alway waywayway ways
             [[email protected] ~]#

这个意思就是, 组 way, 重复两次到无限多次。

6. 再看看行尾是怎么回事,  查找行尾是 . 的,有意思吧,注意 . 可是元字符,意思就不用我说了吧, 那怎么让它变成普通字符, \  转义字符,             $

[[email protected] ~]# grep "\.$" text.tx
             it‘s fine day today.
             There are many birds flying in the sky.
             [[email protected] ~]#

     在里要说明一下这个转义字符是干什么用的呢   \ 。因为元字符里面也有的要用这个。

\ 的功能就是把有意义的字符,转成普通的。 把有意义的普通字符转成有意义的, 当然如果是彻彻底底的普通字符,再转也没用。

打个比喻吧, 就好像 变形金刚一样, 看着是普通车,但他是大机器人, 看他是大机器人,也可以变成车, 如果真是破车,那也变不了。

而在正则表达式里的加\的元字符, 是因为规范的问题所导致的, 在grep所用的正则表达式里,那些加\的元字符,都是普通字符, 需要加上\来转义,来变形,  不加的话,它就是普通字符。

而在egrep 所用的扩展的正则表达式中, 除了\< \>和后向引用 还要用转义外, 其它的都不要用转义了,

这又是另外的一种规范, 如果非要加转义符, 反而又变成普通字符了。 废话就不说了,看看扩展的正则表达式。

三、扩展的正则表达式

元字符:
                    . 任意单个字符
                   [] 范围内的任意单个字符
                   [^] 范围外的任意单个字符

次数匹配:
                      *  匹配任意次前面的字符
                      ?  匹配0或1次前面的字符
                      +  匹配至少1次前面的字符。
                     {m} 匹配其前面的字符m次。
                   {m,n} 匹配其前面的字符m-n次。
                    {m,} 匹配其前面的字符至少m次。
                   {0,n} 至多1次。
                              
               位置锚定:
                         ^  行首
                         $  行尾
                 \<  或 \b  词首
                 \>  或 \b  词尾

分组:

()  分组
                       |    或者, 词组的或,两边的词组。
                      (|)  中括号中的或者。 可以自己指定。

除了有的转义字符没有了外,还加了几个不同的元字符。     下面说明一下:

+  我想朋友们看上面的字符介绍,应该也明白了吧。

*  前面的字符 从0到无限多个,  0代表没有。

而 + 是从1到无限多个。    这个例子就不列了。

关于 |  和 (|) 还有

1. 找到say 或者 for 或者 way 。

[[email protected] ~]# egrep --color=auto -i "say|for|way" text.tx
           Say You Say Me
           For you and for me
           Say you, say me
           Say it for alway waywayway ways
           That‘s the way, it should be
           Say you, say me

........

因为是扩展的正则表达式,所以要用egrep 或者 是 grep -E。

这个例子这个样子的查找还可以, 如果要查找开头是某某字符,中间可能是这三个,就不行了。 因为把字符加在前面,就是前面那一串字符的了,跟后面的没有关系。

2. 那好吧,查找行首以you开头的 say  for  way.          ^ .*  (|)

[[email protected] ~]# egrep --color=auto -i "^you.*(say|for|way)" text.tx
          You‘ve got someone there to say
          [[email protected] ~]#

因为匹配了 .*  这可是代表任意个任意字符啊。 所以, you 在行首, say在行尾,中间都匹配给了.*了。    虽然只匹配了一行, 不过意思也就是这个样子。

3. 对歌词作者说声: Sorry ,   把这么好的歌词给改的千疮百孔。

[[email protected] ~]# egrep --color=auto -i "(say|for).*\1" text.tx
         Say You Say Me
         For you and for me
         Say you, say me
         Say you, say me
         Say you, say me
         Say you, say me
         Say you, say me
         Say you, say me
         Say you, say me
         Say you, say me
         [[email protected] ~]#

这个也是组加后向引用, 后向引用只匹配前面组里的结果, 前面匹配到say,后面也就是say.  for也是一样。

四、POSIX字符组,代表某些特定的字符, 这里只列出一部分常用的。

[:upper:]  大写字母              [:lower:]  小写字母
               [:alpha:]  所有字母              [:digit:]  所有数字
               [:alnum:]  所有字母和数字        [:space:]  空格
               [:punct:]  标点符号

Linux/Unix下的POSIX规范     这里说明了一些 POSIX字符组和正则表达式的一些规范。

[:upper:] = A-Z   不过更规范,不容易出现字符匹配错误。

[:upper:] 这是一个固定的格式,等于A-Z 如果要匹配它,还要加上 []

如:  开头大写字母,加ay

[[email protected] ~]# grep "[[:upper:]]ay" text.tx   
            Say You Say Me
            Say you, say me
            Say it for alway waywayway ways
            Say you, say me
            Say it together, naturally
            Say you, say me

.......

开头不是大写字母,加ay

[[email protected] ~]# grep "[^[:upper:]]ay" text.tx

123ay
            0ay

;ay
            .ay

it‘s fine day today.
            Say you, say me

Playing game in the dark

至于其它的意思都一样, 只是代表某一组字符。

五、后话

呼,可算是写完了, 越写越心烦啊, 可能是因为写的太少了吧,真是得要多练练。

这种文章网上已经是多如牛毛,所以我也不指望能多帮助大家,只是略尽绵力,

同时也是锻炼下自己,文中如有错误或者问题,还请朋友们指出。

grep 文本查找工具

时间: 2024-10-05 19:29:31

grep 文本查找工具的相关文章

grep文本查看工具及正则表达式

grep文本查看工具及正则表达式 grep:搜索及过滤文本工具: (根据用户所指定的"模式"搜索,过滤条件"对目标文件进行过滤性匹配):grep自带正则表达式引擎工具. 所谓模式:由正则表达式所得元字符及普通文本字符所编写出来的过滤条件"模式" grep:三种支持模式: grep:基本正则表达式 egrep:支持扩展正则表达式 fgrep :不支持正则表达式 三种支持模式因其可以(grep -E:切换扩展,egrep-G:切换基本,分别有以-F切换fgre

Linux命令学习:grep文本搜索工具

Mark: 本系列博文只是记录作者在Linux学习过程中的点点滴滴,新手可能参考,高手们就略过吧!!! Linux学习总结:grep文本搜索工具 功能:根据用户指定的文本模式(搜索条件)对目标文件进行逐行搜索,并把匹配的行打印出来,它的全称为"Global Regular Expression Print",全局正则表达式,它默认是开放给所有用户. 语法格式:Grep [option] pattern file Option:命令选项,具体包含: -v: --revert-match

6.shell脚本基础和grep文本处理工具企业应用

6.1shell脚本基础-bash变量和逻辑运行 bash特性及bash脚本编程初步 终端:附着在终端接口程序: GUI:KDE,GNome,Xfce CLI:/etc/shells bash的特性 命令行展开:~,{} 命令别名:alias,unalias 命令历史: history 文件名通配:glob 快捷键:Ctrl+a, e, u, k, l 命令补全: $PATH 路径补全: bash特性之:命令hash 缓存此前命令的查找结构:key-vlaue key:搜索值 value:值 h

grep文本处理工具

grep是一款文本过滤工具,基于正则表达式进行模式匹配sed:stream editor 流编辑器awk:linux上实现为gawk,文本报告生成器(格式化文本)文本搜索工具,根据用户指定的模式,对目标文本逐行进行匹配检查,打印匹配到的行基于Perl的正则表达式使用格式:grep [选项] 匹配模式 file对象选项说明: –color=auto:对匹配到的文本着色,高亮显示    -i:忽略字符大小写    -o:仅显示匹配到的字符串本身    -v:方向匹配,匹配到的文本行不显示,不能匹配到

grep文本搜索工具与正则表达式

一.文本搜索工具grep (一)grep简介 Linux上常用的三个文本处理工具被人们称为Linux文本处理三剑客,他们分别是: 1.grep(egrep,fgrep):文本搜索工具,基于"pattern"对给定的文本进行搜索操作. 2.sed:stream editor,流编辑器,行编辑工具,文本编辑工具. 3.awk:GNU awk,文本格式化工具,文本报告生成器. 他们都是很优秀的文本处理工具.现在,我就重点介绍下grep. grep:global search regular

文本查找工具find命令

在Linux系统上操作时,有时会忘记一个文件放在哪个目录下,这是可以用到文件查找工具去查找到相应的文件,文件查找工具有locate.find两个工具 文件查找: 1.locate:   locate命令是通过linux上构建的一个索引数据库来查询的,遍历整个数据库去搜索所匹配的文件,而且这个索索引数据库是Linux系统自己维护和更新的,索引的构建是在系统比较空闲的时候自动进行的周期性任务. 虽然数据库的更新是系统自动更新的,但也可以通过手动updatedb更新,但是更新的时候需要遍历整个根目录(

正则表达式和grep文本搜索工具

正则表达式和文本搜索工具介绍 正则表达式:如果想搜索/etc/passwd文件中以root开头的行,对与人来说很容易理解,但是对与计算机来说就无法理解,这个时候就需要使用正则表达式来表达过滤条件了,让用户实现对文本的智能搜索.正则表达式就是由元字符及正常字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配等功能. 正则表达式的特点是: 1. 灵活性.逻辑性和功能性非常的强: 2. 可以迅速地用极简单的方式达到字符串的复杂控制. grep:支持正则表达式,是一个文本搜索工具,

grep文本处理工具、正则表达式

grep是一个文本检索工具,号称linux文本处理三大剑客之一,通常会结合正则表达式使用,支持基本正则表达式和扩展的正则表达式,功能很强大,给我们搜索文本带来了很大的便利,默认情况下,它是贪婪模式,能匹配多长就匹配多长,会将匹配到的整行显示出来.另外两大剑客:sed.awk. grep常用选项: grep -i:忽略大小写 [[email protected] ~]# grep -i tom /etc/passwd tom:x:506:506::/home/tom:/bin/bash Tom:x

文本查找工具find

which:查找二进制或执行命令路径     [[email protected] ~]# which free    结果: /usr/bin/free locate:非实时的 模糊查询 每日更新 (通过一个内置数据库,系统文件在数据库中有一个映射,瞬间查找前一天夜里自动更新的目标文件) -b 匹配基名 -c 统计有多少符合条件 updatedb 手动更新 find:实时.文件遍历.精确匹配.速度略慢 -a :与 -o :或 -not:非 优先级最低,结合使用要使用分组 \( \) -fls