grep命令很是强大,平时也常常使用grep命令来搜索。这里记录最经常使用的grep命令正则表达式
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"能匹配出第一行,例如:blog
$grep "Tho" employee.txt 100 Thomas Manager Sales $5,000
但grep -w "Tho" 不能匹配到:get
$grep -w "Tho" employee.txt
由于grep -w 是完整单词匹配,而在employee.txt中不存在一个完整的单词"Tho"(存在完整的单词"Thomas"),例如:class
$grep -w "Thomas" employee.txt 100 Thomas Manager Sales $5,000
有时咱们想精确匹配,那么grep -w就派上用场了.file
有这样的场景:过滤出除了包含某某关键字的其余全部行 ,这时就能够用grep -v了.搜索
过滤出不包含"Manager"的行,结果以下:grep
$grep -v "Manager" employee.txt 200 Jason Developer Technology $5,500 300 Raj Sysadmin Technology $7,000
若是想在一行命令中过滤出多个关键字,即过滤出包含关键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
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
我经常使用这个命令,来匹配出两个文件的差别:
grep -vxf file1 file2
查询在file2中的行,但不在file1中的行,就是file2比file1多出来的行。
有时排查线上问题时,咱们能扎到异常日志,但若是要知道问题,还要看上下文日志,这时就可使用grep -A, -B, -C了
grep -A 10 将关键字所在行的后10行也打印出来(After)
grep -B 10 将关键字所在行的前10行打印出来(Before)
grep -C 10 将关键字所在行的先后10行都打印出来
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
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
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 也能够实现.
使用-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
这个其实上面说过了,
若是不使用 -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
grep -v 就能够实现grep not操做,例如:
$egrep 'Manager|Developer' employee.txt | grep -v Sales