grep介绍

grep介绍

grep 全称 Globally search a Regular and Print ,它是一个最初用于 Unix 操作系统的命令行文本搜索工具。 在给出文件列表或标准输入后,grep 会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。Unixgrep 家族包括 grep、egrepfgrep

grep语法格式

语法格式grep [options][pattern][file]

grep [参数][匹配模式][查找的文件]

参数选项

参数 参数说明
-n 显示匹配内容行号
-c(count) 计算找到所匹配内容的行数
–color=auto 显示匹配内容的颜色
-i(ignore) 忽略大小写
-v(invert) 反向选择
-o(only) 只显示匹配的内容
-An(after) 显示匹配内容后的n行内容
-Bn(before) 显示匹配内容前的n行内容
-Cn(context) 显示匹配内容前后的n行内容
-E 支持扩展的正则表达式
-V 显示软件版本信息

例子

以下例子中用到的SQL文件是wiki文档中的学生信息

查找 学生信息.sql 中含有 ‘left join’ 的句子

1
2
3
$ grep -n --color=auto 'left join' 学生信息.sql
73: left join lesson_relation lr on lr.plan_id = lp.lesson_plan_id
74: left join lesson_plan_order lpo on lpo.order_id = lr.order_id

查找 学生信息.sql 中含有 ‘left join’ 的内容数量

1
2
$ grep -c 'left join' 学生信息.sql
2

忽略大小写

1
2
$ grep -c -i 'left join' 学生信息.sql
6

‘left join’ 后一行内容

1
2
3
4
$ grep -A1 --color=auto 'left join' 学生信息.sql
left join lesson_relation lr on lr.plan_id = lp.lesson_plan_id
left join lesson_plan_order lpo on lpo.order_id = lr.order_id
-- LEFT JOIN dwd_db_hfjydb.order_trial_class otc ON lpo.order_id=otc.order_id

‘left join’ 前后一行内容

1
2
3
4
5
$ grep -C1 --color=auto 'left join' 学生信息.sql
LEFT JOIN dwd_db_hfjydb.view_student s on s.student_id=lp.student_id --
left join lesson_relation lr on lr.plan_id = lp.lesson_plan_id
left join lesson_plan_order lpo on lpo.order_id = lr.order_id
-- LEFT JOIN dwd_db_hfjydb.order_trial_class otc ON lpo.order_id=otc.order_id

查找’left join’ 前后一行内容且含有 ‘lesson_plan_order’ 的内容

1
2
$ grep -n -C1 --color=auto 'left join' 学生信息.sql | grep  ' lesson_plan_order'
74: left join lesson_plan_order lpo on lpo.order_id = lr.order_id

查找’left join’ 前后一行内容且排除含有 ‘lesson_plan_order’ 的内容

1
2
3
4
$ grep -n -C1 --color=auto 'left join' 学生信息.sql | grep -v ' lesson_plan_order'
72- LEFT JOIN dwd_db_hfjydb.view_student s on s.student_id=lp.student_id --
73: left join lesson_relation lr on lr.plan_id = lp.lesson_plan_id
75- -- LEFT JOIN dwd_db_hfjydb.order_trial_class otc ON lpo.order_id=otc.order_id

从文件夹中查找所有含有 ‘left join’ 的文件及相关内容

1
2
3
4
5
6
7
8
9
$ grep -n 'left join' *
学生信息 - 副本 (2).sql:73: left join lesson_relation lr on lr.plan_id = lp.lesson_plan_id
学生信息 - 副本 (2).sql:74: left join lesson_plan_order lpo on lpo.order_id = lr.order_id
学生信息 - 副本.sql:73: left join lesson_relation lr on lr.plan_id = lp.lesson_plan_id
学生信息 - 副本.sql:74: left join lesson_plan_order lpo on lpo.order_id = lr.order_id
学生信息.sql:73: left join lesson_relation lr on lr.plan_id = lp.lesson_plan_id
学生信息.sql:74: left join lesson_plan_order lpo on lpo.order_id = lr.order_id
学生信息.txt:73: left join lesson_relation lr on lr.plan_id = lp.lesson_plan_id
学生信息.txt:74: left join lesson_plan_order lpo on lpo.order_id = lr.order_id

正则表达式

基础正则表达式

字符集 说明 例子
^ 定位行的开始 “^when” 匹配以when开头的行
$ 定位行的结束 “where$” 匹配以where结尾的行
. 匹配一个非换行字符 “少儿.*思维” 匹配少儿思维中间跟任意个字符的行
* 匹配零个或多个先前字符 “^ *when” 匹配以when开头前面跟任意多空格的行
[] 匹配一个指定范围内的字符 “[Jj]oin” 匹配 Join 和 join
[^] 匹配一个不在指定范围内的子字符 “[\^A-IK-Z]oin” 匹配 不包含A-I和K-Z字母开头,紧跟oin的行
< 定位单词的开始 “<name” 匹配含有name单词的且name前没有除空白字符外的其他字符法的行
> 定位单词的结尾 “name>”匹配含有name单词的且name后没有除空白字符外的其他字符法的行
x{m} 连续重复字符x,m次 “s{2}” 匹配连续出现两个s的行
x{m,} 连续重复字符x,至少m次 “s{2,}” 匹配至少连续出现两个s的行
x{m,n} 连续重复字符x,至少m次,最多n次 “s{2, 4}” 匹配至少连续出现两个s,最多4个s的行

拓展正则表达式

在使用 grep 时基础正则表达式可以满足大部分日常需求,如果有特殊需求,需要进行复杂的匹配,那么grep -E 支持拓展的正则表达式。

参考文章

1. Linux常用命令——grep

2. linux grep正则表达式与grep用法详解

3. Linux 使用grep筛选多个条件

4. linux - grep常用正则表达式,过滤文本内容)

5. grep与正则表达式