grep查找命令

grep命令是linux系统中,最常用的文件字符串查找命令,职业生涯中,我们几乎离不开它。

下面是它最简单的用法,不过实际情况下,我们通常会添加很多参数或结合其他的命令去进行使用。

1
grep "<pattern>" <fileName>

常用命令参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<fileName>: 文件名称,多个文件使用空格隔开
<pattern>: 匹配字符
-n : 显示行号
-i : 忽略字符大小写
-l : 列出符合条件的文件名
-r : 查找所有子目录
-w : 只显示整行全匹配
-o : 只显示匹配的关键字部分
-A <num>: 关键字所在行、以及之后num行
-B <num>: 关键字所在行、以及之前num行
-C <num>: 关键字所在行、以及前后num行
–include="*.txt": 仅查找指定后缀的文件
> file: 将查询结果保存到文件中
>> file: 将查询结果追加到文件中

如,查询哪些文件中包含“ok”:

1
grep "ok" -r -l --include="*" ./

grep和cat/tail的结合

通过grep和cat/tail的结合,我们可以轻易的实现返回文件中的关键字所在行、以及附近指定行的内容,尤其是在我们查询程序日志的时候,用的非常多。

语法:

1
2
3
cat <fileName> | grep <pattern> <cmd>

tail -f <fileName> | grep <pattern> <cmd>

参数说明:

1
2
3
<fileName>:文件名称,多个文件使用空格隔开
<pattern>:匹配字符
<cmd>:grep命令参数

cat结合示例:在文件default.log中查找“异常”,并收集前后10行记录

1
cat default.log | grep "异常" -C 10

tail结合示例:在文件default.log中查找“异常”,并进行实时收集

1
tail -f default.log | grep "异常"

grep和sed的结合

sed命令是用来编辑一个或多个文件、简化对文件反复操作的神器,它和grep的结合令我们的文件操作起来更加的得心应手。
我们下面就来看看,它能给我们带来怎样的体验。

sed语法介绍:

1
sed <命令参数> <动作> <文件>

常用命令参数:

1
2
-i: 直接修改配合的文件内容
-e: 不修改原文件,仅输出,通常可以和“>或>>”命令结合,输出到新文件中

常用动作说明:

1
2
3
4
5
s: 替换字符,替换指定的字符串,如:sed -i 's/匹配字符/新字符/g' a.txt,末尾的/g表示替换所有匹配的字符
a: 新增行,在指定行或指定范围的行的下一行新增内容,如: sed -i '2a\bbb' a.txt
i: 新增行,在指定行或指定范围的行的上一行新增内容,如: sed -i '2i\bbb' a.txt
c: 替换行,替换指定行或指定范围的行的内容,如:sed -i '3,5c\replacestr' a.txt
d: 删除行,删除指定行或指定范围的行,如: sed -i '3d' a.txt

注: 动作前面的数字表示第几号,或者几行到几行

扩展案例:
查找某个文件中的关键字,并在其下新增一行数据

1
sed -i '/关键字/a\新增的一行数据' a.txt

grep与sed命令结合的示例:

上面我们已经了解sed命令的特性,那我们现在就试试,它和grep命令的结合,究竟能撞出怎样的火花?

下面的命令实现的是:将某个目录以及子目录的所有文件中的关键字“ok”统一替换为“yes”

1
sed -i 's/ok/yes/g' `grep "ok" -r -l --include="*" ./`

上面 `` 括起来的grep命令,表示将grep命令查询的结果作为操作文件。