文章目录
前言
一、正则表达式的概念
二、正则表达式的分类
三、grep命令介绍
四、命令语法及参数
五、参考实例
总结
grep命令常用于文本搜索,与sed和awk并称linux中的三剑客,并且搭配着正则表达式的一些参数,能做到更为强大的操作,不过说到grep怎么能不提下正则的内容。
正则表达式由一类特殊字符及文本所编写的模式,其中有些字符不表示其字面意义,而是代表控制和通配的功能。而它的意义是为了处理大量的字符串信息和文本文件信息。
正则表达式有一套规则和方法:
正则分为基础正则表达式“BRE”和扩展正则表达式“ERE”
1)基本正则表达式BRE符号及作用
符号 |
作用 |
^ |
尖角号,用于字符最左侧,如“^oldboy”,匹配以oldboy单词开头的行 |
$ |
美元符,用于字符的最右侧,如“oldboy$”,匹配以oldboy单词结尾的行 |
^$ |
组合键,表示空行 |
. |
匹配任意一个且只有一个字符,不能匹配空行 |
\ |
转义字符,让特殊含义的字符现出原形,还原本意,例如\.代表小数点 |
* |
匹配前一个字符(连续出现)0次或者1次以上,重新0次代表为空,即匹配所有内容 |
.* |
组合符,匹配所有内容 |
^.* |
组合符,匹配任意多个字符开头的内容 |
.*$ |
组合符,匹配以任意多个字符结尾的内容 |
[abc] |
匹配[]集合内的任意一个字符,a或者b或c,可以写[a-c] |
[^abc] |
匹配除了^后面的任意字符,a或b或c,^表示对[abc]的取反 |
2)扩展正则表达式ERE符号及作用
字符 |
作用 |
+ |
表示匹配前一个字符1次或者多次 |
[]+ |
表示匹配中括号内的内容一次或者多次,例:[:/]+ ,匹配括号内的“:"或者“/”字符一次或者多次 |
? |
匹配前一个字符0次或者1次 |
| |
表示或者,同时匹配多个字符串 |
() |
分组过滤,被括起来的内容表示一个整体 |
a{n,m} |
匹配前一个字符最少n次,最多m次 |
a{n,} |
匹配前一个字符最少n次 |
a{n} |
匹配前一个字符正好n次 |
a{,m} |
匹配前一个字符最多m次 |
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不管用来搜索文本,还是作为其他命令加上管道符过滤关键词信息,都是一个很不错的命令。