linux三剑客之grep命令详解

grep命令

grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
若将grep命令与SQL进行类比,grep相当于select * from table,该命令可以进行数据的查找与定位。
grep语法规则

grep [OPTIONS] PATTERN [FILE…]
grep [选项] 查找内容 源文件

例如,从hello.txt文件中查找内容
文档中的内容如下:
hello shell
hello linux
hello banana

根据指定的字符串查找文档中的某项内容
linux三剑客之grep命令详解
linux三剑客之grep命令详解
根据正则表达式查找
使用正则表达式获取以字母i或b开头的后面跟任意三个字符的数据;
其中[]表示正则表达式,…表示后面跟任意的三个字符,可以看到匹配出两行
linux三剑客之grep命令详解
grep命令的常用选项

  • -n 打印行号
    linux三剑客之grep命令详解

  • -v 不包括,指把不匹配的显示出来,即除掉匹配的信息,将其余的信息打印出来
    linux三剑客之grep命令详解

  • -E 表示支持使用扩展正则表达式

  • -o 仅打印匹配到的信息
    linux三剑客之grep命令详解
    即只打印了以i或b开头,后面任意三个字符的匹配的字符串

  • -i 忽略大小写,匹配时不管大小写都可以匹配

  • -c 用于统计文中出现的次数,即将满足条件的进行计数,并显示统计结果
    linux三剑客之grep命令详解

  • \b 边界符,匹配边界只包含特定字符的行
    linux三剑客之grep命令详解
    可以看出,图片中的第一条命令没有匹配出任何信息,因文档中没有以nux开头且以nux结尾的字符。

grep的正则表达式

grep的正则表达式,即语法规则中的PATTERN。
分为两种:
1. 基本正则表达式
有四种匹配模式:
1)字符匹配
.(英文的点):匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符;
\w 匹配英文文字和数字字符,即[A-Za-z0-9];
\W 匹配非英文和数字字符,如点或句号等;
2)匹配次数
* 匹配零个或多个先前字符,如"e*banana"匹配所有零个或多个e后紧跟banana的行
.* 匹配任意长度的任意字符
\? 匹配其前面的字符0次或1次,即其前面的字符是可有可无的
linux三剑客之grep命令详解
即n前面的字符出现0次或1次i即可匹配成功
\+ 匹配其前面的字符1次或多次,即其前面的字符要出现至少一次
\{#\} 匹配其前面的字符#次
\{m,n\} 匹配其前面的字符至少m次,至多n次

3)位置锚定
^ 锚定行的开始,如’^ba’ 即匹配所有以ba开始的行
$ 锚定行的结束,如’ba$’ 即匹配所有以ba结尾的行
^$ 指匹配空白行
\<或\b 词首锚定,用于字符模式的左侧,即字符串以其后的字符为开始
\>或\b 词尾锚定,用于字符模式的右侧,即字符串以其后的字符为结尾
4)分组及应用
\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理
⚠️分组括号中的模式匹配到的内容会被正则表达式引擎自动记录与内部的变量中
\1 模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2 模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
linux三剑客之grep命令详解
图片中的命令是查找hello.txt文档中,h和e之间存在两个字符,且一行中要出现两次查找到的内容。
linux三剑客之grep命令详解
2. 扩展正则表达式
扩展正则表达式也有4中匹配模式
字符匹配模式和位置锚定不变,而对于次数匹配和分组应用,此时不需要通过\来转义,直接使用?,+,{},()
此时可以使用grep -E PATTERN FILE
linux三剑客之grep命令详解
也可以使用egrep命令来实现扩展正则表达式的内容查找
linux三剑客之grep命令详解