Linux三剑客-grep命令

文章目录

前言

一、正则表达式的概念

二、正则表达式的分类

 三、grep命令介绍

四、命令语法及参数

五、参考实例

总结


前言

        grep命令常用于文本搜索,与sed和awk并称linux中的三剑客,并且搭配着正则表达式的一些参数,能做到更为强大的操作,不过说到grep怎么能不提下正则的内容。

一、正则表达式的概念

        正则表达式由一类特殊字符及文本所编写的模式,其中有些字符不表示其字面意义,而是代表控制和通配的功能。而它的意义是为了处理大量的字符串信息和文本文件信息。

正则表达式有一套规则和方法:

  • 正则工作时以单位进行,一次处理一行
  • 正则表达式化繁为简,提高工作效率
  • linux正则表达式,只有grep awk sed三个命令支持,其他无法使用

二、正则表达式的分类

正则分为基础正则表达式“BRE”和扩展正则表达式“ERE”

  • 基本正则表达式 BRE对应字符有 ^ $ . [] *
  • 扩展正则表达式 ERE在BRE基础上增加了 () {} ? + | 等字符

1)基本正则表达式BRE符号及作用

符号

作用

^

尖角号,用于字符最左侧,如“^oldboy”,匹配以oldboy单词开头的行

$

美元符,用于字符的最右侧,如“oldboy$”,匹配以oldboy单词结尾的行

^$

组合键,表示空行

.

匹配任意一个且只有一个字符,不能匹配空行

\

转义字符,让特殊含义的字符现出原形,还原本意,例如\.代表小数点

*

匹配前一个字符(连续出现)0次或者1次以上,重新0次代表为空,即匹配所有内容

.*

组合符,匹配所有内容

^.*

组合符,匹配任意多个字符开头的内容

.*$

组合符,匹配以任意多个字符结尾的内容

[abc]

匹配[]集合内的任意一个字符,a或者b或c,可以写[a-c]

[^abc]

匹配除了^后面的任意字符,a或b或c,^表示对[abc]的取反

2)扩展正则表达式ERE符号及作用 

  • 注意:扩展正则必须用grep -E参数或者egrep才能生效。

字符

作用

+

表示匹配前一个字符1次或者多次

[]+

表示匹配中括号内的内容一次或者多次,例:[:/]+ ,匹配括号内的“:"或者“/”字符一次或者多次

匹配前一个字符0次或者1次

|

表示或者,同时匹配多个字符串

()

分组过滤,被括起来的内容表示一个整体

a{n,m}

匹配前一个字符最少n次,最多m次

a{n,}

匹配前一个字符最少n次

a{n}

匹配前一个字符正好n次

a{,m}

匹配前一个字符最多m次

 三、grep命令介绍

        grep来自于英文词组“global search regular expression and print out the line”的缩写,意思是用于全面搜索的正则表达式,并将结果输出。人们通常会将grep命令与正则表达式搭配使用,参数作为搜索过程中的补充或对输出结果的筛选,命令模式十分灵活。

        与之容易混淆的是egrep命令和fgrep命令。如果把grep命令当作是标准搜索命令,那么egrep则是扩展搜索命令,等价于“grep -E”命令,支持扩展的正则表达式。而fgrep则是快速搜索命令,等价于“grep -F”命令,不支持正则表达式,直接按照字符串内容进行匹配。

四、命令语法及参数

1)先用help查看此命令的语法吧

grep 【参数】【模式】 文件

[root@localhost ~]# grep --help
用法: grep [选项]... PATTERN [FILE]...

正则表达式选择与解释:
  -E, --extended-regexp     PATTERN 是一个可扩展的正则表达式(缩写为 ERE)
  -F, --fixed-strings       PATTERN 是一组由断行符分隔的定长字符串。
  -G, --basic-regexp        PATTERN 是一个基本正则表达式(缩写为 BRE)
  -P, --perl-regexp         PATTERN 是一个 Perl 正则表达式
  -e, --regexp=PATTERN      用 PATTERN 来进行匹配操作
  -f, --file=FILE           从 FILE 中取得 PATTERN
  -i, --ignore-case         忽略大小写
  -w, --word-regexp         强制 PATTERN 仅完全匹配字词
  -x, --line-regexp         强制 PATTERN 仅完全匹配一行
  -z, --null-data           一个 0 字节的数据行,但不是空行

Miscellaneous:
  -s, --no-messages         suppress error messages
  -v, --invert-match        select non-matching lines
  -V, --version             display version information and exit
      --help                display this help text and exit

输出控制:
  -m, --max-count=NUM       NUM 次匹配后停止
  -b, --byte-offset         输出的同时打印字节偏移
  -n, --line-number         输出的同时打印行号
      --line-buffered       每行输出清空
  -H, --with-filename       为每一匹配项打印文件名
  -h, --no-filename         输出时不显示文件名前缀
      --label=LABEL         将LABEL 作为标准输入文件名前缀
  -o, --only-matching       show only the part of a line matching PATTERN
  -q, --quiet, --silent     suppress all normal output
      --binary-files=TYPE   assume that binary files are TYPE;
                            TYPE is 'binary', 'text', or 'without-match'
  -a, --text                equivalent to --binary-files=text
  -I                        equivalent to --binary-files=without-match
  -d, --directories=ACTION  how to handle directories;
                            ACTION is 'read', 'recurse', or 'skip'
  -D, --devices=ACTION      how to handle devices, FIFOs and sockets;
                            ACTION is 'read' or 'skip'
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive
                            likewise, but follow all symlinks
      --include=FILE_PATTERN
                            search only files that match FILE_PATTERN
      --exclude=FILE_PATTERN
                            skip files and directories matching FILE_PATTERN
      --exclude-from=FILE   skip files matching any file pattern from FILE
      --exclude-dir=PATTERN directories that match PATTERN will be skipped.
  -L, --files-without-match print only names of FILEs containing no match
  -l, --files-with-matches  print only names of FILEs containing matches
  -c, --count               print only a count of matching lines per FILE
  -T, --initial-tab         make tabs line up (if needed)
  -Z, --null                print 0 byte after FILE name

文件控制:
  -B, --before-context=NUM  打印以文本起始的NUM 行
  -A, --after-context=NUM   打印以文本结尾的NUM 行
  -C, --context=NUM         打印输出文本NUM 行
  -NUM                      same as --context=NUM
      --group-separator=SEP use SEP as a group separator
      --no-group-separator  use empty string as a group separator
      --color[=WHEN],
      --colour[=WHEN]       use markers to highlight the matching strings;
                            WHEN is 'always', 'never', or 'auto'
  -U, --binary              do not strip CR characters at EOL (MSDOS/Windows)
  -u, --unix-byte-offsets   report offsets as if CRs were not there
                            (MSDOS/Windows)

2)常用参数

-i忽略大小写
-c只输出匹配行的数量
-l只列出符合匹配的文件名,不列出具体的匹配行
-n列出所有的匹配行,显示行号
-h查询多文件时不显示文件名
-s不显示不存在、没有匹配文本的错误信息
-v显示不包含匹配文本的所有行,取反
-w匹配整词
-r递归搜索
-q静默模式,即不输出任何信息
-o仅显示匹配到的字符串本身
-E支持扩展的正则表达式

五、参考实例

1)文件搜索“root”的关键词,可以加个-n显示行号

[root@localhost ~]# grep "root" passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep "root" passwd -n
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# 

2)可以用正则的^尖括号,搜索以“sync”开头的行

[root@localhost ~]# grep "^sync" passwd
sync:x:5:0:sync:/sbin:/bin/sync
[root@localhost ~]# 

3)如何搜索到“root”和“ROOT”呢

[root@localhost ~]# grep -i  "root" passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ROOT

[root@localhost ~]# grep -E "(root|ROOT)" passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ROOT
[root@localhost ~]# 

用-i参数就能不区分大小写进行匹配,还可以用扩展正则-E搜索这两个关键词,结果都是一样的。

4)还可以用组合键“^$”(表示空行)来搜索某个文件的空行

[root@localhost ~]# grep '^$' passwd -n
3:
6:

[root@localhost ~]# grep '^$' passwd -n -v 
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
4:daemon:x:2:2:daemon:/sbin:/sbin/nologin
5:adm:x:3:4:adm:/var/adm:/sbin/nologin
7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8:sync:x:5:0:sync:/sbin:/bin/sync
9:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
10:halt:x:7:0:halt:/sbin:/sbin/halt
11:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
12:operator:x:11:0:operator:/root:/sbin/nologin
13:ROOT

还可以加个-v取反,显示出了空行以外的内容。

5)搜索文件中以.结尾的行 ,这里可以用$符号(表示字符的最右侧),“.”也是正则的符号,如果直接敲".$"会发生什么,可以看到的是'.$'输出了全文的信息(仅匹配一个字符,不匹配空行),那这里可以用“\”让这个“.”不转义。

[root@localhost ~]# grep ".$" passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin.
sync:x:5:0:sync:/sbin:/bin/sync.
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown.
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ROOT

[root@localhost ~]# grep "\.$" passwd 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin.
sync:x:5:0:sync:/sbin:/bin/sync.
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown.
[root@localhost ~]# 

6)使用组合符“.*”表示匹配所有内容(这种方式也称为贪婪匹配,尽可能的匹配多些内容)

[root@localhost ~]# grep -n ".*" passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:
4:daemon:x:2:2:daemon:/sbin:/sbin/nologin
5:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:
7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin.
8:sync:x:5:0:sync:/sbin:/bin/sync.
9:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown.
10:halt:x:7:0:halt:/sbin:/sbin/halt
11:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
12:operator:x:11:0:operator:/root:/sbin/nologin
13:ROOT

7)当然grep命令也可以结合其他命令一起使用;找出根下名为chmod包含g或者e的文件

[root@localhost ~]# find / -name "chmod*" | grep -En "g|e"
2:/usr/share/man/man1/chmod.1.gz
3:/usr/share/man/man1p/chmod.1p.gz
4:/usr/share/man/man2/chmod.2.gz
5:/usr/share/man/man3p/chmod.3p.gz

8)如果要匹配root字符2次到3次,要怎么写呢

[root@localhost ~]# grep -E "ro{2,3}" passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -E "ro{2,3}" passwd -o
roo
roo
roo
roo

9)要显示开头和结尾一样内容的行,比如要sync它的shell解释器也是他本身,如果用awk就很容易,grep则要结合扩展正则的方式。

[root@localhost ~]# grep -E "^([^:]+\>).*\1$" passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost ~]# 

总结

grep命令+正则运用到熟练,对工作上的帮助是可想而知的,其实一些看似复杂的命令,练习的次数多了,也能很快掌握下来,grep不管用来搜索文本,还是作为其他命令加上管道符过滤关键词信息,都是一个很不错的命令。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux学习中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值