grep命令

grep命令非常强大,平时也经常使用grep命令来搜索。这里记录最常用的grep命令

一.常用的grep命令

1. grep -w

grep -w表示匹配一个完整的单词,而不是常用的模糊匹配。比如有如下内容:

$cat employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   Manager    Sales       $6,000 

grep "Tho"能匹配出第一行,例如:

$grep "Tho" employee.txt
100  Thomas  Manager    Sales       $5,000

但grep -w "Tho" 不能匹配到:

$grep -w "Tho" employee.txt  

因为grep -w 是完整单词匹配,而在employee.txt中不存在一个完整的单词"Tho"(存在完整的单词"Thomas"),例如:

$grep -w "Thomas" employee.txt
100  Thomas  Manager    Sales       $5,000

有时我们想精确匹配,那么grep -w就派上用场了.

 

2. grep -v

有这样的场景:过滤出除了包含某某关键字的其他所有行 ,这时就可以用grep -v了.

过滤出不包含"Manager"的行,结果如下:

$grep -v "Manager" employee.txt
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000

3. grep -e

如果想在一行命令中过滤出多个关键字,即过滤出包含关键A, 或者包含关键字B这样的场景时,就可以使用grep -e.

例如,过滤出包含"Tech"的行,或者包含"Sales"的行,则命令如下:

$grep -e "Tech" -e "Sales" employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000
500  Randy   Manager    Sales       $6,000

4. grep -E

grep -E可以使用正则表达式来过滤出你想要的内容。

使用grep -E时,如果想匹配多个模式,则使用“|”来分隔。即:

grep -E "pattern1|pattern2" file

例如,同样实现过滤出包含"Tech"的行,或者包含"Sales"的行的要求,可以使用grep -E来实现:

$grep -E "Tech|Sales" employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000
500  Randy   Manager    Sales       $6,000

  

5. grep -vxf

我常用这个命令,来匹配出两个文件的差异:

grep -vxf file1 file2

查询在file2中的行,但不在file1中的行,就是file2比file1多出来的行。

6. grep -A、grep -C、 grep -B

有时排查线上问题时,我们能扎到异常日志,但如果要知道问题,还要看上下文日志,这时就可以使用grep -A, -B, -C了

grep -A 10 将关键字所在行的后10行也打印出来(After)

grep -B 10 将关键字所在行的前10行打印出来(Before)

grep -C 10 将关键字所在行的前后10行都打印出来

 

7. grep -o

grep -o表示仅输出匹配的内容, 什么意思呢?看下面例子就知道了.

$grep "Manager" employee.txt
100  Thomas  Manager    Sales       $5,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   Manager    Sales       $6,000

$grep -o "Manager" employee.txt
Manager
Manager
Manager

  

8. grep -i

grep -i表示忽略大小写。

$grep "manager" employee.txt
$grep -i "manager" employee.txt 100 Thomas Manager Sales $5,000 400 Nisha Manager Marketing $9,500 500 Randy Manager Sales $6,000

  

9. grep -f

grep -f 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式.

例如,我想查找如下这些人的信息, 人名存在names.txt文件中:

$cat name.txt
Thomas
Jason

 现在可以使用grep -f来查找了:

$grep -f name.txt employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500

 也可以用另外一种方式实现同样的功能:

$cat name.txt | xargs -I {} grep {} employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500

  

二.附加命令

上面都是常用命令. 有时我想要这样的功能:匹配出同时包含多个关键字的内容。grep 也可以实现.

1. grep and 操作

使用-E "pattern1.*pattern2"可以实现 and操作,例如:

$grep -E "Dev.*Tech" employee.txt
200  Jason   Developer  Technology  $5,500

 上面匹配顺序是指定的,如果grep -E "Tech.*Dev"是匹配不出任何内容的。

如果希望顺序是不固定的,可以这样:

$grep -E "Dev.*Tech|Tech.*Dev" employee.txt
200  Jason   Developer  Technology  $5,500

  

2. grep or 操作

这个其实上面说过了, 

如果不使用 -E, 则必须转义"|", 即 grep "pattern1|pattern2", 例如:

$grep "Tech|Dev" employee.txt
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000

 

如果使用-E,则不用使用转义符"", 例如:

$grep -E "Tech|Dev" employee.txt
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000

  

在常用命令中,我们介绍了-e, 其实使用-e同样可以实现grep or 操作。

$grep -e "Tech" -e "Dev" employee.txt
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000

  

3. grep not操作

grep -v 就可以实现grep not操作,例如:

$egrep 'Manager|Developer' employee.txt | grep -v Sales

  

参考文章:https://www.jianshu.com/p/4ec50fdaf388

原文地址:https://www.cnblogs.com/NewMan13/p/11142295.html