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