侧边栏壁纸
博主头像
晓果冻博主等级

一个热爱生活的95后精神小伙

  • 累计撰写 131 篇文章
  • 累计创建 15 个标签
  • 累计收到 68 条评论

目 录CONTENT

文章目录

详解Linux中grep语法和用法!

晓果冻
2023-01-30 / 0 评论 / 0 点赞 / 368 阅读 / 2,291 字
温馨提示:
本文最后更新于 2023-02-03,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

详解Linux中grep语法和用法!

你知道的越多,不知道的就越多,业余的像一棵小草!

你来,我们一起精进!你不来,我和你的竞争对手一起精进!

编辑:业余草

推荐:https://www.xttblog.com/?p=5357

自律才能自由

一、grep基本介绍

全拼:Global search REgular expression and Print out the line

作用:「文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行。」

「模式:由正则表达式的元字符及文本字符所编写出的过滤条件﹔」

grep 语法:

grep [options] PATTERN [FILE]

image-20230130180023968

其中:

  1. pattern 是用正则表达式书写的模式。
  2. file 是要查找的文件,可以是用空格间隔的多个文件,省略 FILE 时表示在标准输入中查找

常用参数:

  • -a 或 --text : 不要忽略二进制的数据。
  • -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
  • -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -c 或 --count : 计算符合样式的列数。
  • -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
  • -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
  • -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
  • -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  • -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
  • -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
  • -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
  • -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
  • -i 或 --ignore-case : 忽略字符大小写的差别。
  • -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
  • -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
  • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
  • -o 或 --only-matching : 只显示匹配PATTERN 部分。
  • -q 或 --quiet或–silent : 不显示任何信息。
  • -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
  • -s 或 --no-messages : 不显示错误信息。
  • -v 或 --invert-match : 显示不包含匹配文本的所有行。
  • -V 或 --version : 显示版本信息。
  • -w 或 --word-regexp : 只显示全字符合的列。
  • -x --line-regexp : 只显示全列符合的列。
  • -y : 此参数的效果和指定"-i"参数相同。

grep命令是Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令

「grep命令里的匹配模式就是你想要找的东西,可以是普通的文字符号,也可以是正则表达式」

image-20230130180152344

二、正则表达式grep实践

首先先看一下这个测试文件的内容吧

image-20230130180245478

2.1、输出以 I 开头的行(不区分大小写)

image-20230130180317413

注: 这里的-i代表不区分大小写, -n代表显示匹配行和行号

2.2、输出以.结尾的行

image-20230130180356218

「注: 因为.在这里有着特殊含义, 所以要用\转义一下, 如果不加转义字符的话, grep就会把它当做正则表达式来处理(.代表的含义是匹配任意一个字符)」

「2.3」、$符号

  • 「注意在Linux平台下, 所有文件的结尾都有一个$符」
  • 「可以利用cat -A 查看文件」

image-20230130180431625

2.4、^$(代表空行的意思)组合符

找出文件的空行, 以及行号

image-20230130180502687

2.5、.点符号

「"."点表示任意一个字符, 有且只有一个, 不包含空行」

image-20230130180522443

2.6、*符号

「"*"表示找出前一个字符0次或一次以上」

找出文件中i出现0次或多次的行和行号

image-20230130180544687

2.7、.*组合符

「".*"表示所有内容, 包括空行」

image-20230130180605078

2.8、^.*t符 (含义: 以任意内容开头, 直到t结束)

image-20230130180627331

2.9、[abc]中括号

中括号表达式,[abc]表示匹配中括号中任意一个字符, a或b或c,常见的形式如下;

  • [a-z]匹配所有小写单个字母[A-Z]匹配所有单个大写字母
  • [a-zA-Z]匹配所有的单个大小写字母
  • [0-9]匹配所有单个数字
  • [a-zA-ZO-9]匹配所有数字和字母

匹配abc字符中的任意一个,得到它的行数和行号

image-20230130180649052

2.10、grep的参数-o

「使用"-o"选项, 可以值显示被匹配到的关键字, 而不是讲整行的内容都输出.」

image-20230130180721972

显示出文章中有多少行有a

[root@Cent0S-7-64 ~]# grep " [abc]" test. txt -c5

「"-c"只统计匹配的行数」

2.11、[^abc]中括号中去反

[abc]或[a-c]这样的命令, "^"符号在中括号中第一位表示排除, 就是排除字符a,b,c

注: 「出现再中括号里的尖角号表示取反」

image-20230130180750684

三、扩展正则表达式grep实践

「此处使用grep -E进行实践扩展正则, egrep官网已经弃用了」

3.1、+号

「+号表示匹配前一个字符1一次或多次,必须使用grep-E扩展正则」

image-20230130180815442

3.2、?符

「匹配前一个字符0次或1次」

找出文件中包含gd或者god的行

image-20230130180837826

3.3、|符

「竖线|再正则中是或者的意思」

「找出opt目录中txt结尾的文件, 其名字中包含a或者e, 不区分大小写(-i)」

image-20230130180856286

3.4、()小括号

「将一个或多个字符捆绑在一起, 当作一个整体进行处理」

image-20230130180914006

3.5、{n,m}匹配次数

「{n,m}:匹配前一个字符至少n次, 最多m次」

「{n,}: 匹配前一个字符至少n次, 没有上限」

「{,m}: 匹配前一个字符最多m次,可以没有」

「重复前一个字符各种次数, 可以通过-o参数显示明确的匹配过程」

image-20230130180935232

四、使用场景

系统报警显示了时间,但是日志文件太大无法直接 cat 查看。(查询含有特定文本的文件,并拿到这些文本所在的行)。

## 查看符合条件的日志条目
grep -n '2019-10-24 00:01:11' *.log

Linux 里利用 grep 和 find 命令查找文件内容。

从文件内容查找匹配指定字符串的行:

grep "被查找的字符串" 文件名

例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件

grep "thermcontact" /.in

从文件内容查找与正则表达式匹配的行:

grep –e "正则表达式" 文件名

查找时不区分大小写:

grep –i "被查找的字符串" 文件名

查找匹配的行数:

grep -c "被查找的字符串" 文件名

从文件内容查找不匹配指定字符串的行:

grep –v "被查找的字符串" 文件名

从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 “ERROR” 的行:

find / -type f -name "*.log" | xargs grep "ERROR"

例子:从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 “taoge” 的行:

find . -name "*.in" | xargs grep "taoge"

更多用法和使用场景,大家可以自行去探索!

文章转载自微信公众号业余草大佬

0

评论区