grep - Global search REgular expression and Print out the line.
一. 什么是grep
grep 作为linux中的文本搜索工具, 根据用户指定的“模式(过滤条件)”,对目标文本逐行进行匹配检查,打印匹配到的行。
简单来说,grep是linux文本操作中,最常用的过滤命令之一。配合正则表达式,就拥有非常强大的文本过滤能力。
语法:
grep [options] [pattern] file
命令 参数 匹配模式 文件数据
-i: (ignore) 忽略大小写
-o: (???) 仅显示匹配到的字符串
-w: (word) 仅显示匹配单词
-v: (reversal) 匹配与参数相反的字符串并显示出来
-n: (number) 显示行号
-c: (count) 统计行数
-E: 使用支持扩展的正则表达式元字符
-q: (quit) 静默模式,不输出任何信息
二. grep 的案例
以passwd文件为基础,创建个副本
cat /etc/passwd > /tmp/test_grep.txt
1. 普通示例
(1) 打印所有带“login”的行
grep "login" /tmp/test_grep.txt
(2) 打印行号
grep -n "login" /tmp/test_grep.txt
(3) 打印没有login的行
grep -v "login" /tmp/test_grep.txt
(4) 同时只显示root和synv有关的行
grep -E "root|sync" /tmp/test_grep.txt --color=auto
(5) 统计匹配结果的行数
grep -c "login" /tmp/test_grep.txt
(6) 只输出匹配的内容(-n -o == -no)
grep -no "login" /tmp/test_grep.txt
(7) 单词匹配
grep -w "shutdown" /tmp/test_grep.txt
(8) 过滤空白行和注释行(注释:以井号开头的行,空白行:啥也没有的行)
grep -E "^#|^$" /tmp/test_grep.txt
2.正则表达式示例
(1) ^ :以xx开头
# 匹配所有m开头的行
grep -i -n "^m" test.txt
(2) $ :以xx结尾
# 匹配所有m结尾的行
grep -i -n "m$" test.txt
(3) 组合 ^$
# 找出所有空行
grep "^$" test.txt
# 匹配所有非空行
grep -v "^$" test.txt
(4) . :匹配任何字符
# 匹配包括 xxxac 的行
grep ".ac" test.txt
(5) \ :转义符,用于转义".", "$", "^"等特殊字符
# 匹配所有带.的行
grep "\." test.txt
(6) * :匹配前一个字符 0-n 次
# 匹配出现i的0次或多次的行
grep "i*" test.txt
(7) .* :任意字符任何次数,类似于通配符
# 匹配所有行(任意行)
grep ".*" test.txt
(8) [abc] :括号中的任意字符
# 常用 [0-9],[a-z],[A-Z],[a-zA-Z],[a-zA-Z0-9], [a-zA-Z0-9_](字母数字下划线)
# 匹配包含 字母数字下划线 任何一个字符的行
grep "[a-zA-Z0-9_]" test.txt
(9) [^abc] : 除了 括号中的任意字符之外的字符。简而言之,^字符的意义是:取反
# 匹配不包含 0-9 任何一个字符的行
grep "[^0-9]" test.txt
========================= 下面为拓展正则表达式,参数:-E ================================
(10) + : 匹配前一个字符 1次以上
# 匹配至少出现1次l的行
grep -E "l+" test.txt
(11) ? : 匹配前一个字符 0次或1次
# 匹配出现一次或0次l的行
grep -E "l?" test.txt
(12) | : 或者的意思,常用于分组
# 匹配出现x或者y的行
grep -E "x|y" test.txt
(13) () : 分组,将一个或多个正则表达式捆绑在一起,功能强大
拓展 \1 : 表示从左侧其,第一个括号中的模式所匹配到的字符
\2 : 从左侧起, 第二个括号中的模式所匹配到的字符
# 匹配good或glad
grep -E "g(oo|la)d" test.txt
# 只匹配like..like的行
grep -E "(l..e).*\1" test.txt
> [root@izbp14c6zt4dausyd8l25mz ~]# cat love.txt
i like play like
i love play like
i like play love
i love play like
> [root@izbp14c6zt4dausyd8l25mz ~]# grep -E "l..e" love.txt
i like play like
i love play like
i like play love
i love play like
> [root@izbp14c6zt4dausyd8l25mz ~]# grep -E "(l..e).*\1" love.txt
i like play like
(14) {n,m} 前一个字符的匹配次数
# 匹配 a字符2次到4次
# 前面不写 {,m}: 代表最多匹配m次
# 后面不写 {n,}: 代表最少匹配n次
grep -E "a{2,4}" test.txt
三、官方手册(中文)
用法: 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 字节结束,而非换行符
杂项:
-s, --no-messages 不显示错误信息
-v, --invert-match 选中不匹配的行
-V, --version 显示版本信息并退出
--help 显示此帮助并退出
输出控制:
-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 在<文件>名最后打印空字符
文件控制:
-B, --before-context=NUM 打印文本及其前面NUM 行
-A, --after-context=NUM 打印文本及其后面NUM 行
-C, --context=NUM 打印NUM 行输出文本
-NUM 等同于 --context=NUM
--color[=WHEN],
--colour[=WHEN] 使用标记高亮匹配字串;
WHEN 可以是“always”、“never”或“auto”
-U, --binary 不要清除行尾的 CR 字符(MSDOS/Windows)