语法
Linux中grep命令的全称为:global search regular expression(RE) and print out the line, 全面搜索正则表达式并把行打印出来。是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
下面是它的语法:
grep [OPTION]... PATTERN [FILE]...
grep可以从每个文件和标准输出中进行搜索。
匹配模式Pattern默认为一个基本的正则表达式(basic regular expression,BRE)
# 从给出的nginx日志文件中查找500错误
grep "500" access.log access-2.log access-3.log
可以指定多个文件,需要注意文件时反正匹配模式后面的。grep后面的匹配Pattern如果是简单字符串,可以不加引号。
正则表达式行为控制选项
grep命令提供了丰富的选项用来控制正则表达式的行为:
选项
选项全称
选项含义
-E
–extended-regexp
使用扩展的正则表达式进行匹配
-F
–fixed-strings
使用一套新行分离固定的字符串进行匹配
-G
–basic-regexp
使用基本的正则表达式进行匹配
-P
–perl-regexp
使用Perl的正则表达式进行匹配
-e
–regexp=PATTERN
使用Pattern进行匹配
-f
–file=FILE
从指定文件中读取匹配模式
-i
–ignore-case
忽略大小写区别
-w
–word-regexp
强制Pattern只匹配单个词
-x
–line-regexp
强制Pattern只匹配一行
-z
–null-data
空行算一行,匹配时不换行
grep -F相当于fgrep;grep -E相当于egrep
# 按照扩展的正则表达式匹配
grep -E "[1-9]+"
输出控制选项
grep命令提供了很多选项用来控制如何显示搜索到的结果:
选项
选项全称
选项含义
-m
–max-count=NUM
只输出匹配的NUM行
–color
–color=auto
标记匹配颜色
-b
–byte-offset
输出匹配结果相对于所在行的偏移
-n
–line-number
在匹配文本前输出行号
-H
–with-filename
输出匹配的文件名
-h
–no-filename
不输出匹配的文件名
-o
–only-matching
只输出匹配的字符串
-v
–invert-match
输出不匹配的行
-A
–after-context=[LINE]
同时输出匹配行和匹配行之后[LINE]行的内容
-B
–before-context=[LINE]
同时输出匹配行和匹配行之前[LINE]行的内容
-C
–context=[LINE]
同时输出匹配行和匹配行前后[LINE]行的内容
-q
–quiet
不输出任何结果
-c
–count
只输出每个文件中匹配的行数
-Z
–null
输出匹配的文件名时,不在文件名后面输出’:’等分隔符
-L
–files-without-match
只输出不包含匹配的文件名
-l
–files-with-matches
只输出包含匹配的文件名
-T
–initial-tab
添加标签使得输出对齐
# 匹配'is'并标记出来,显示匹配行号和偏移
grep is demo.txt --color=auto -n -o -b -H
# 匹配'is'并统计匹配的行数
grep "is" demo.txt -c
# 搜索多个文件并查找匹配文本在哪些文件中
grep -l "text" file1 file2 file3...
# 计算不匹配的行
grep -v -v http access.log
上面的例子中, -b 和 -o 一般配合使用,标出匹配的字符和偏移。
匹配控制选项
grep中还有一些命令用于控制匹配时的行为,如是否匹配二进制文件等:
选项
选项全称
选项含义
-a
–text
不要忽略二进制数据
-r
–directories=recurse
递归搜索所有文件和子目录
当指定要查找的是目录而非文件时,必须使用-d参数,否则grep指令将回报信息并停止动作。
-d参数的值可为read, skip, recurse
read表示读取
skip表示跳过
recurse表示递归
正则源字符
几个匹配源字符,注意括号等特殊符号需要转义。
^: 锚定行首
$: 锚定行尾
.: 匹配任一一个字符
*: 匹配零个或多个先前字符
\?:匹配其前面的字符0次或者1次;
\+:匹配其前面的字符1次或者多次;
\{m\}:匹配其前面的字符m次(\为转义字符)
\{m,n\}:匹配其前面的字符至少m次,至多n次
[]: 匹配一个指定范围内的字符 | ‘[^]’匹配指定范围外的任意单个字符
\’或‘\b’:锚定词尾(可用\:匹配完整单词)
\(\):将多个字符当做一个整体进行处理
可以引用前面的分组括号中的模式所匹配到的字符,分组括号中的模式匹配到的内容或被正则表达式引擎自动记录于内部的变量中:
\1:模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配到的内容
\2:模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容
\n: 模式从左侧起,第n个左括号及与之匹配的右括号之间模式匹配到的内容
几个特殊的匹配方式:
[:digit:] 匹配任意单个数字
[:lower:] 匹配任意单个小写字母
[:upper:] 匹配任意单个大写字母
[:alpha:] 匹配任意单个字母
[:alnum:] 匹配任意单个字母或数字
[:punct:] 匹配任意单个符号
[:space:] 匹配单个空格
示例
匹配nginx日志中的4xx和5xx错误
grep '1.0" [4,5][0-9]\{2\}' access_log