Linux 文本三剑客之 - grep 文本搜索工具


一. 什么是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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值