提示:grep (global search regular expression(RE) and print out the line,全⾯搜索正则表达式并把⾏打印出来)是⼀种强⼤的⽂本搜索⼯具,它能使⽤正则表达式搜索⽂本,并把匹配的⾏打印出来;
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很⼩不同。egrep是grep的扩展,⽀持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表⽰回其⾃⾝的字⾯意义,不再特殊。linux使⽤GNU版本的grep。它功能更强,可以通过-G、-E、-F命令⾏选项来使⽤egrep和fgrep的功能
grep
- 一、grep是什么?
- 二、grep语法格式
- 1.grep [参数]
- 2.grep参数使用说明_示例
- 2.1 测试文件准备
- 2.2 参数 -i 忽略大小写
- 2.3 参数 -v 反向匹配
- 2.4 参数 -n 展示行号
- 2.5 参数 -w 整词匹配
- 2.6 参数 -A 展示关键词及向下n行
- 2.7 参数 -B 展示关键词及向上n行
- 2.8 参数 -C 展示关键词及上下各n行
- 2.9 参数 -o 只显示匹配的关键字
- 2.10 参数 --color 高亮展示过滤的关键字
- 2.11 参数 -c 只输出匹配行的数量
- 2.12 参数 -r 递归查询
- 2.13 参数 \\\| 以或的关系过滤关键词
- 2.14 参数 -E 以指定的"关键字"大小写来匹配过滤
- 2.15 参数 -f 输出后面文件中包含前面文件中内容的行
- 2.16 参数 -l 显示匹配的文件名
- 2.17 通常grep解决行内匹配问题,跨行建议awk/sed/perl
- 3、grep匹配正则表达式
- 三、简单使用
一、grep是什么?
grep命令是global regular expression print(全局正则表达式输出)的缩写,它是linux系统中最强大的命令之一。它在一个或者多个文件中搜索与给定的内容的匹配的行,并将匹配的内容输出
二、grep语法格式
1.grep [参数]
- grep [参数] [目标过滤关键字] [文件名称]
- cat/head/tail | grep [参数] [目标过滤关键字]
# 例:
# grep -i ads_prd resource.log
# cat resource.log | grep -i ads_prd
常用参数:
参数 | 解释 |
---|---|
-i | 忽略大小写 |
-v | 反转匹配,选择没有被匹配到的内容,返回"不" 包含指定关键字的结果 |
-n | 展示行号 |
-w | 精确匹配“单词整词”,不是“包含”的模糊like查询,而是精确查询,单词的两边必须是非字符符号(即不能是字母数字或下划线) |
-A | “after”,展示过滤的关键词所在行,及其“后”几行 |
-B | “before”,展示过滤的关键词所在行,及其“前”几行 |
-C | “after”+“before”,展示过滤的关键词所在行,及其前后各x行 |
-o | 逐行输出匹配的内容,有多少个匹配就有多少行,常和wc -l共用 |
–color | 高亮展示查询的关键词 |
-c | 只输出匹配行的数量 |
-r | 递归查询,匹配当前目录所有文件,以及子目录下的所有文件 |
\| | 以"或"的关系筛选过滤 |
-E | 以指定的"关键字"大小写来匹配过滤 |
-f | 输出后面文件中包含前面文件中内容的行 |
-l | 显示匹配的文件名 |
2.grep参数使用说明_示例
2.1 测试文件准备
2.2 参数 -i 忽略大小写
# 忽略大小写
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep test test01.txt
test01
test 01
[root@localhost grep_test]# grep -i test test01.txt
test01
Test01
test 01
[root@localhost grep_test]#
2.3 参数 -v 反向匹配
# 反转匹配,选择没有被匹配到的内容,返回"不" 包含指定关键字的结果
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep test test01.txt
test01
test 01
[root@localhost grep_test]# grep -i test test01.txt
test01
Test01
test 01
[root@localhost grep_test]# grep -v test test01.txt
Test01
linux linux
[root@localhost grep_test]# grep -iv test test01.txt
linux linux
[root@localhost grep_test]#
2.4 参数 -n 展示行号
# 展示行号
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep linux test01.txt
linux linux
[root@localhost grep_test]# grep test test01.txt
test01
test 01
[root@localhost grep_test]# grep -n linux test01.txt
4:linux linux
[root@localhost grep_test]# grep -n test test01.txt
1:test01
3:test 01
2.5 参数 -w 整词匹配
# 精确匹配“单词”,不是“包含”的模糊like查询,而是精确查询
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep test test01.txt
test01
test 01
[root@localhost grep_test]# grep -w test test01.txt
test 01
[root@localhost grep_test]# grep lin test01.txt
linux linux
[root@localhost grep_test]# grep -w lin test01.txt
2.6 参数 -A 展示关键词及向下n行
“after”,展示过滤的关键词所在行,及其“后”几行
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep test01 test01.txt
test01
[root@localhost grep_test]# grep -A2 test01 test01.txt
test01
Test01
test 01
[root@localhost grep_test]# grep -A3 test01 test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep test test01.txt
test01
test 01
[root@localhost grep_test]# grep -A1 test test01.txt
test01
Test01
test 01
linux linux
2.7 参数 -B 展示关键词及向上n行
“before”,展示过滤的关键词所在行,及其“前”几行
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep Test01 test01.txt
Test01
[root@localhost grep_test]# grep -B1 Test01 test01.txt
test01
Test01
[root@localhost grep_test]# grep -B2 Test01 test01.txt
test01
Test01
2.8 参数 -C 展示关键词及上下各n行
“after”+“before”,展示过滤的关键词所在行,及其前后各x行
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep Tes test01.txt
Test01
[root@localhost grep_test]# grep -C2 Tes test01.txt
test01
Test01
test 01
linux linux
2.9 参数 -o 只显示匹配的关键字
逐行输出匹配的内容,有多少个匹配就有多少行,常和wc -l共用
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep -o e test01.txt
e
e
e
[root@localhost grep_test]# grep -o te test01.txt
te
te
[root@localhost grep_test]# grep -on te test01.txt
1:te
3:te
[root@localhost grep_test]# grep -on te test01.txt | wc -l
2
2.10 参数 --color 高亮展示过滤的关键字
# 高亮展示查询的关键词
[root@localhost grep_test]# cat test01.txt
[root@localhost grep_test]# cat test01.txt
[root@localhost grep_test]# grep --color test test01.txt
2.11 参数 -c 只输出匹配行的数量
# 只输出匹配行的数量,与-o 和 wc -l一起作用的功能相近
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep test test01.txt
test01
test 01
[root@localhost grep_test]# grep -c test test01.txt
2
2.12 参数 -r 递归查询
# 递归查询,匹配当前目录所有文件,以及子目录下的所有文件
[root@localhost grep_test]# ll
[root@localhost grep_test]# grep linux ./*
[root@localhost grep_test]# grep -r linux ./*
2.13 参数 \| 以或的关系过滤关键词
# 以"或"的关系筛选过滤
[root@localhost grep_test]# cat test01.txt
[root@localhost grep_test]# grep 'test\|lin' test01.txt
2.14 参数 -E 以指定的"关键字"大小写来匹配过滤
# 以指定的"关键字"大小写来匹配过滤
[root@localhost grep_test]# cat test01.txt
[root@localhost grep_test]# grep test test01.txt
[root@localhost grep_test]# grep -E test test01.txt
[root@localhost grep_test]# grep -E T test01.txt
[root@localhost grep_test]# grep -E l test01.txt
[root@localhost grep_test]# grep -E lINUX test01.txt
2.15 参数 -f 输出后面文件中包含前面文件中内容的行
# 输出后面文件中包含前面文件中内容的行
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# cat test02.txt
test02
Test02
test 02
linux linux
linux linuxaaabbb
linux aaabbb linux
[root@localhost grep_test]# grep -f test01.txt test02.txt
linux linux
linux linuxaaabbb
[root@localhost grep_test]# grep -wf test01.txt test02.txt
linux linux
2.16 参数 -l 显示匹配的文件名
[root@localhost grep_test]# ll
total 8
-rw-r--r--. 1 root root 34 May 8 00:36 test01.txt
-rw-r--r--. 1 root root 71 May 8 01:15 test02.txt
drwxr-xr-x. 2 root root 24 May 8 00:36 test0507
[root@localhost grep_test]# grep linux ./*.txt
./test01.txt:linux linux
./test02.txt:linux linux
./test02.txt:linux linuxaaabbb
./test02.txt:linux aaabbb linux
[root@localhost grep_test]# grep -l linux ./*.txt
./test01.txt
./test02.txt
[root@localhost grep_test]# grep -l linux *
test01.txt
test02.txt
grep: test0507: Is a directory
[root@localhost grep_test]# grep -lr linux *
test01.txt
test02.txt
test0507/test03.txt
2.17 通常grep解决行内匹配问题,跨行建议awk/sed/perl
3、grep匹配正则表达式
3.1 正则 ^ :匹配字符串“开始”位置
# ^ 为匹配输入字符串的开始位置【匹配以^后的字符“开始”的字符串】
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep "^t" *
test01.txt:test01
test01.txt:test 01
test02.txt:test02
test02.txt:test 02
grep: test0507: Is a directory
[root@localhost grep_test]# grep "^l" *
test01.txt:linux linux
test02.txt:linux linux
test02.txt:linux linuxaaabbb
test02.txt:linux aaabbb linux
grep: test0507: Is a directory
[root@localhost grep_test]# grep "^l" -r *
test01.txt:linux linux
test02.txt:linux linux
test02.txt:linux linuxaaabbb
test02.txt:linux aaabbb linux
test0507/test03.txt:linux linux
3.2 正则 $ :匹配字符串“结束”位置
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep "1$" test01.txt
test01
Test01
test 01
[root@localhost grep_test]# grep "01$" test01.txt
test01
Test01
test 01
[root@localhost grep_test]#
3.3 正则 < :匹配以指定"字符串"开始的行
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep "<T" test01.txt
[root@localhost grep_test]# grep "\<T" test01.txt
Test01
[root@localhost grep_test]# grep "\<t" test01.txt
test01
test 01
[root@localhost grep_test]# grep "\<e" test01.txt
[root@localhost grep_test]# grep "\<nux" test01.txt
3.4 正则 > :匹配以指定"字符串"结束的行
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep "\>x" test01.txt
[root@localhost grep_test]# grep "x\>" test01.txt
linux linux
3.5 [ ] : 单个字符,如[A] 即A 符合要求
[root@localhost grep_test]# grep [e] test01.txt
[root@localhost grep_test]# grep [st] test01.txt
[root@localhost grep_test]# grep st test01.txt
3.6 [^ ] : 显示"不包括"括号中字符串的所有行
[root@localhost grep_test]# cat test01.txt
[root@localhost grep_test]# grep ^T test01.txt
[root@localhost grep_test]# grep [^T] test01.txt
[root@localhost grep_test]# grep [^k] test01.txt
[root@localhost grep_test]# grep [^Test] test01.txt
[root@localhost grep_test]# grep [^Test01] test01.txt
[root@localhost grep_test]# grep [^Tes01] test01.txt
下图中从第三个命令开始,红色字体的都是不在[xxx]中的;
3.7 [ - ] : 范围匹配
# [-]范围匹配,如[A-C],即A、B、C都符合要求;如[a,b],即只有a和b符合要求
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
[root@localhost grep_test]# grep [h-k] test01.txt
linux linux
3.8 \ :用来屏蔽一个元字符的特殊含义,使其作为单纯的一个字符
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
^tabc
# 已t开头的
[root@localhost grep_test]# grep "^t" test01.txt
test01
test 01
[root@localhost grep_test]# grep "\^t" test01.txt
^tabc
三、简单使用
1、搜索非空行 -v “^$”
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
^tabc
aab
[root@localhost grep_test]# grep "^$" test01.txt
[root@localhost grep_test]# grep -v "^$" test01.txt
test01
Test01
test 01
linux linux
^tabc
aab
[root@localhost grep_test]# grep -vn "^$" test01.txt
1:test01
2:Test01
3:test 01
4:linux linux
6:^tabc
8:aab
[root@localhost grep_test]#
2、搜索开头不是英文字母的行 ^ [^a-z,A-Z]
[root@localhost grep_test]# grep ^"[^a-z,A-Z]" test01.txt
^tabc
[root@localhost grep_test]# grep "^[^a-z,A-Z]" test01.txt
^tabc
[root@localhost grep_test]#
3、过滤以xx开头,yy结尾的行(.*起到了作用)
[root@localhost grep_test]# cat test01.txt
test01
Test01
test 01
linux linux
^tabc
aab
[root@localhost grep_test]# grep "t.*1" test01.txt
test01
Test01
test 01
[root@localhost grep_test]# grep "^t.*1" test01.txt
test01
test 01
[root@localhost grep_test]#