grep,全称是global regular expressions print
功能就是查找匹配模式的行
grep对文本内容的处理是以行为单位,输出也是输出匹配的行。
也可以使用两个变种程序 egrep 和 fgrep 。 egrep 与 grep -E 相同。 fgrep 与 grep -F 相同。
一、语法格式
用法: grep [选项]... 模式 [文件]...
在每个<文件>中查找给定<模式>。
例如:grep -i 'hello world' menu.h main.c
<模式>可以包括多个模式字符串,使用换行符进行分隔。
二、选项
指定模式的选项
-E, --extended-regexp <模式> 是扩展正则表达式
-F, --fixed-strings <模式> 是字符串
-G, --basic-regexp <模式> 是基本正则表达式
-P, --perl-regexp <模式> 是 Perl 正则表达式
-e, --regexp=<模式> 用指定的<模式>字符串来进行匹配操作
-f, --file=<文件> 从给定<文件>中取得<模式>
-i, --ignore-case 在模式和数据中忽略大小写
--no-ignore-case 不要忽略大小写(默认)
-w, --word-regexp 强制<模式>仅完全匹配字词
-x, --line-regexp 强制<模式>仅完全匹配整行
-z, --null-data 数据行以一个 0 字节结束,而非换行符
输出控制:
-m, --max-count=<次数> 得到给定<次数>次匹配后停止
-b, --byte-offset 输出的同时打印字节偏移
-n, --line-number 输出的同时打印行号
--line-buffered 每行输出后刷新输出缓冲区
-H, --with-filename 为输出行打印文件名
-h, --no-filename 输出时不显示文件名前缀
--label=<标签> 将给定<标签>作为标准输入文件名前缀
-o, --only-matching 只显示行中非空匹配部分
-q, --quiet, --silent 不显示所有常规输出
--binary-files=TYPE 设定二进制文件的 TYPE(类型);
TYPE 可以是 'binary'、'text' 或 'without-match'
-a, --text 等同于 --binary-files=text
-I 等同于 --binary-files=without-match
-d, --directories=ACTION 读取目录的方式;
ACTION 可以是`read', `recurse',或`skip'
-D, --devices=ACTION 读取设备、先入先出队列、套接字的方式;
ACTION 可以是`read'或`skip'
-r, --recursive 等同于--directories=recurse
-R, --dereference-recursive 同上,但遍历所有符号链接
--include=GLOB 只查找匹配 GLOB(文件模式)的文件
--exclude=GLOB 跳过匹配 GLOB 的文件
--exclude-from=FILE 跳过所有匹配给定文件内容中任意模式的文件
--exclude-dir=GLOB 跳过所有匹配 GLOB 的目录
-L, --files-without-match 只打印没有匹配上的<文件>的名称
-l, --files-with-matches 只打印有匹配的<文件>的名称
-c, --count 只打印每个<文件>中的匹配行数目
-T, --initial-tab 行首制表符对齐(如有必要)
-Z, --null 在<文件>名最后打印空字符
三、参数
1.模式字符串:要查找的字符串。
为了避免shell先对特殊字符进行处理,一般要用单引号把模式字符串括起来。
2.文件名
四、示例
1.-F 原样字符串搜索
grep -F 'hello world' test.txt
搜索test.txt文件中,包含'hello world'的行
2.-e 通过正则表达式搜索
关于正则表达式参考正则表达式
如果不指定选项,默认就是此选项。
-e使用的正则表达式是基本正则表达式。也就是说,像?+{}这些都要在前面加转义符\
grep -e 't[ae]st' test.txt
在test.txt中查找包含tast或test的行
grep '[^a-z]oo' test.txt
在test.txt中查找包含Xoo的行,其中X是一个非a到z的字符
grep '^the' test.txt
在test.txt中查找以the开头的行
grep '^$' test.txt
在test.txt中查找空行
cat test.txt | grep '^[^u]'
输出非u开头的行
grep '<[^>]*>' test.txt
匹配一对括号
grep '.+' test.txt
匹配任意字符后面跟一个+
grep '.+' test.txt
匹配长度大于0的行
3.-E通过扩展正则表达式搜索
egrep 与 grep -E 相同
我们知道正则表达式分为基本正则表达式和扩展正则表达式,但是grep只支持基本正则表达式,如果要用扩展正则表达式,需要使用egrep命令。
egrep '.+' test.txt
匹配长度大于0的行
egrep 'gd|good' test.txt
在test.txt中查找包含gd或good的行
egrep 'g(la|oo)d' test.txt
在test.txt中查找包含glad或good的行
egrep 'A(xyz)+C' test.txt
在test.txt中查找包含AXC的行,其中X是一个或一个以上的'xyz'字符串
ip address | grep -E '([0-9]{1,3}.){3}[0-9]{1,3}'
查找包含ip地址的行
grep 'o{2}' test.txt
在test.txt中查找包含连续两个o的行
grep '[a-z]{7}' *.txt
显示当前目录下面以.txt 结尾的文件中的所有包含每个字符串至少有7个连续小写字符的字符串的行
ip address | grep -E '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'
查找包含ip地址的行
4.-c 只输出行数
grep -c CLERK emp.data
输出包含CLERK的行的数量
5.-f 从文件中读取模式
cat test.txt | grep -f test2.txt
输出test.txt文件中含有从test2.txt文件中模式的行
6.-n显示行号
grep -n 'linux' test.txt
7.-v查找不包含模式的行
grep -v 'abc' test.txt
在test.txt中查找不包含abc的行
8.-o只显示匹配的部分,而不是整行
grep -o 'linux' test.txt
- -I (大写的i) 等同于 --binary-files=without-match 不处理二进制文件
find . -type f -print0 | xargs -0 grep -I 'xxx'
版权归原作者 int8 所有, 如有侵权,请联系我们删除。