文章目录
  1. 1. 背景知识
    1. 1.1. grep vs sed vs awk
    2. 1.2. 正则表达式
    3. 1.3. grep的种类
  2. 2. 常用参数
  3. 3. 案例学习

背景知识

grep是linux中常用的文本处理的工具,与之类似的工具有sed和awk,它们分别适用于不同的场景。同时要想很好的使用grep等文本处理工具,需要对正则表达式有一定的了解。

grep vs sed vs awk

grep主要用于对文本、文件进行搜索,查找出符合要求的字符串并输出相关的内容。

sed和awk则是更强大文本处理工具,适用于更复杂的场景。sed是一个基于字符流的处理工具(stream editor),不仅可以查找文字还可以对文本进行操作,比如说修改、删除、插入等。awk则是更加强大的工具,它本身是一个完整的编程语言,可用于对数据的提取处理然后生成一些报表,主要针对类csv格式的文件。

正则表达式

to be written

grep的种类

  • grep | grep使用简单的模式和正则表达式进行搜索。
  • egrep | egrep使用拓展版的正则表达式,包含更多的正则表达式功能。
  • fgrep | fgrep是加速版的grep,主要适用于简单的模式匹配。
  • zgrep, zegrep, zfgrep | 与grep, egrep, fgrep 效果相同,只是可以接受一个由compress或gzip压缩出来的压缩包进行搜索。在现在的操作系统中,多种的grep使用的是同一个binary,而不是不同的binary。比如说grep -E其实等效于egrep,grep -F等效于fgrep。

常用参数

-A num, --after-context=num - 打印出找到的匹配行后num行。这个跟-B-C类似功能,主要用于查看上下文。

-B num, --before-context=num - 打印出找到的匹配行前num行。

-C[num, --context=num] - 打印出找到的匹配行前后num行,相当于-A num -B num

-c, --count - 统计出匹配的总行数,同一行有两个匹配也只算一行。

--colour=[when, --color=[when]] - 将匹配的字符标记为彩色,when可以是’never’,‘auto’或’always’。

-e pattern, --regexp=pattern - 制定在搜索中使用的匹配模式,多用于指定多个匹配模式的情况。

-H - 在每一行前面打印出匹配的文件名,在多个文件的情况下这个是默认选项。

-h - 在多个文件的情况下不打印出匹配的文件名。

-n - 打印出匹配所在行的行数。

-i, --ignore-case - 查找时忽略大小写。

-R, -r, --recursive - 递归的去查找子目录下的文件。

-v, --invert-match - 打印出不匹配的行。

-w, --word-regexp - 只匹配整个单词。

案例学习

实验文件,随便找了一个莎士比亚的十四行诗:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ cat demofile
sonnet 18

Shall I compare thee to a summer's day?
Thou art more lovely and more temperate:
Rough winds do shake the darling buds of May,
And summer's lease hath all too short a date:

Sometime too hot the eye of heaven shines,
And often is his gold complexion dimm'd;
And every fair from fair sometime declines,
By chance or nature's changing course untrimm'd

But thy eternal summer shall not fade
Nor lose possession of that fair thou owest;
Nor shall Death brag thou wander'st in his shade,
When in eternal lines to time thou growest:

So long as men can breathe or eyes can see,
So long lives this and this gives life to thee.
$ cp demofile demofile2
  1. 在文件中搜索某个字符串。

    1
    2
    3
    4
    $ grep "and" demofile
    Thou art more lovely and more temperate:
    Nor shall Death brag thou wander'st in his shade,
    So long lives this and this gives life to thee.
  2. 匹配整个单词。

    上面的例子中搜索and这个字符串匹配了wander这个单词,如果我们只想搜and这个单词可以使用-w参数。

    1
    2
    3
    $ grep -w "and" demofile
    Thou art more lovely and more temperate:
    So long lives this and this gives life to thee.
  3. 忽略大小写

    1
    2
    3
    4
    5
    6
    $ grep -i -w "and" demofile
    Thou art more lovely and more temperate:
    And summer's lease hath all too short a date:
    And often is his gold complexion dimm'd;
    And every fair from fair sometime declines,
    So long lives this and this gives life to thee.
  4. 使用正则表达式

    只要把匹配的字符串换成需要的正则表达式即可。比如说需要搜索以And开头的行。

    1
    2
    3
    4
    $ grep "^And" demofile
    And summer's lease hath all too short a date:
    And often is his gold complexion dimm'd;
    And every fair from fair sometime declines,
  5. 显示上下文

    有时候搜出来需要看看上下文,可以利用上面提到的-B-A-C来实现。

    比如想要找出包含”nature”的句子并打印出上下两行。

    1
    2
    3
    4
    5
    6
    $ grep -C2 "nature" demofile
    And often is his gold complexion dimm'd;
    And every fair from fair sometime declines,
    By chance or nature's changing course untrimm'd

    But thy eternal summer shall not fade
  6. 统计出匹配的总行数

    比如说想要统计出现”to”的行数

    1
    2
    $ grep -c "to" demofile
    5

    如果想要统计出现的总次数的话,grep本身没有办法满足这个需求,需要使用sed或awk来实现。或者结合wc来实现。

    1
    2
    $ grep -o "to" demofile| wc -l
    5
  7. 高亮匹配文字

    高亮匹配文字可以让肉眼可以第一时间的看到匹配结果,利用–color=auto/always来实现。此处nature高亮状。

    1
    2
    $ grep --color=auto "nature" demofile
    By chance or nature's changing course untrimm'd
  8. 简单匹配多个模式

    查找多个字符串可以使用|字符来进行简单的匹配。比如说"heaven|nature"表示匹配heaven或者nature。因为这个是正则表达式的拓展部分,所以需要使用-E或者egrep。

    1
    2
    3
    $ grep -E "heaven|nature" demofile
    Sometime too hot the eye of heaven shines,
    By chance or nature's changing course untrimm'd
  9. 复杂匹配多个模式

    需要找出符合多个模式的匹配。比如说,找出以”When”开头或者包含”fade”的行。

    1
    2
    3
    $ grep -e "^When" -e "fade" demofile
    But thy eternal summer shall not fade
    When in eternal lines to time thou growest:
  10. 找出不满足条件的匹配

    在一些情况下我们需要找出不满足某个条件的行,这个时候就可以用-v来实现了。

    比如说想找出首字母不是大写字母的行。

    1
    2
    $ grep -v "^[A-Z]" demofile
    sonnet 18
  11. 打印出匹配所在行的行数

    1
    2
    3
    $ grep -e "^When" -e "fade" -n demofile
    13:But thy eternal summer shall not fade
    16:When in eternal lines to time thou growest:
  12. 打印出文件名

    进行多个文件搜索的情况下,默认会打印出文件名。

    1
    2
    3
    4
    5
    $ grep -e "^When" -e "fade" demofile demofile2
    demofile:But thy eternal summer shall not fade
    demofile:When in eternal lines to time thou growest:
    demofile2:But thy eternal summer shall not fade
    demofile2:When in eternal lines to time thou growest:

[EOF]

文章目录
  1. 1. 背景知识
    1. 1.1. grep vs sed vs awk
    2. 1.2. 正则表达式
    3. 1.3. grep的种类
  2. 2. 常用参数
  3. 3. 案例学习