详解Linux中grep语法和用法!
你知道的越多,不知道的就越多,业余的像一棵小草!
你来,我们一起精进!你不来,我和你的竞争对手一起精进!
编辑:业余草
推荐:https://www.xttblog.com/?p=5357
自律才能自由
一、grep基本介绍
全拼:Global search REgular expression and Print out the line
。
作用:「文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行。」
「模式:由正则表达式的元字符及文本字符所编写出的过滤条件﹔」
grep 语法:
grep [options] PATTERN [FILE]
其中:
-
pattern 是用正则表达式书写的模式。
-
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命令里的匹配模式就是你想要找的东西,可以是普通的文字符号,也可以是正则表达式」
二、正则表达式grep实践
首先先看一下这个测试文件的内容吧
2.1、输出以 I 开头的行(不区分大小写)
注: 这里的-i代表不区分大小写, -n代表显示匹配行和行号
2.2、输出以.结尾的行
「注: 因为.在这里有着特殊含义, 所以要用\转义一下, 如果不加转义字符的话, grep就会把它当做正则表达式来处理(.代表的含义是匹配任意一个字符)」
「2.3」、$符号
-
「注意在Linux平台下, 所有文件的结尾都有一个$符」
-
「可以利用cat -A 查看文件」
2.4、^$(代表空行的意思)组合符
找出文件的空行, 以及行号
2.5、.点符号
「"."点表示任意一个字符, 有且只有一个, 不包含空行」
2.6、*符号
「"*"表示找出前一个字符0次或一次以上」
找出文件中i出现0次或多次的行和行号
2.7、.*组合符
「".*"表示所有内容, 包括空行」
2.8、^.*t符 (含义: 以任意内容开头, 直到t结束)
2.9、[abc]中括号
中括号表达式,[abc]表示匹配中括号中任意一个字符, a或b或c,常见的形式如下;
-
[a-z]匹配所有小写单个字母[A-Z]匹配所有单个大写字母
-
[a-zA-Z]匹配所有的单个大小写字母
-
[0-9]匹配所有单个数字
-
[a-zA-ZO-9]匹配所有数字和字母
匹配abc字符中的任意一个,得到它的行数和行号
2.10、grep的参数-o
「使用"-o"选项, 可以值显示被匹配到的关键字, 而不是讲整行的内容都输出.」
显示出文章中有多少行有a
[root@Cent0S-7-64 ~]# grep " [abc]" test. txt -c5
「"-c"只统计匹配的行数」
2.11、abc中括号中去反
[^abc]或a-c这样的命令, "^"符号在中括号中第一位表示排除, 就是排除字符a,b,c
注: 「出现再中括号里的尖角号表示取反」
三、扩展正则表达式grep实践
「此处使用grep -E进行实践扩展正则, egrep官网已经弃用了」
3.1、+号
「+号表示匹配前一个字符1一次或多次,必须使用grep-E扩展正则」
3.2、?符
「匹配前一个字符0次或1次」
找出文件中包含gd或者god的行
3.3、|符
「竖线|再正则中是或者的意思」
「找出opt目录中txt结尾的文件, 其名字中包含a或者e, 不区分大小写(-i)」
3.4、()小括号
「将一个或多个字符捆绑在一起, 当作一个整体进行处理」
3.5、{n,m}匹配次数
「{n,m}:匹配前一个字符至少n次, 最多m次」
「{n,}: 匹配前一个字符至少n次, 没有上限」
「{,m}: 匹配前一个字符最多m次,可以没有」
「重复前一个字符各种次数, 可以通过-o参数显示明确的匹配过程」
四、使用场景
系统报警显示了时间,但是日志文件太大无法直接 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”
更多用法和使用场景,大家可以自行去探索!
文章转载自微信公众号业余草大佬
评论区