grep概述
grep 是类unix系统下的搜索工具,其全称为(global regular expression print,全局正则表达式输出)。
grep命令在对一个或多个文件的内容进行基于模式的搜索的情况下是非常有用的。模式可以是单个字符、多个字符、单个单词、或者是一个句子。当命令匹配到执行命令时指定的模式时,grep会将包含模式的一行输出,但是并不对原文件内容进行修改。
语法如下:
Usage: grep [OPTION]... PATTERN [FILE]...
Example: grep -i 'hello world' menu.h main.c
grep -r 'hello world' /home/
常见命令使用
假设现在我们知道需要在哪几个文件里进行查找的情况下,我们可以直接指定文件名,
若只知道目录,则需要使用-r参数进行递归查找该目录下的所有文件。
为了测试,我们在/root目录下创建grep_case.txt 和grep_test.txt文件,其内容如下:
grep_case.txt
c++
linode free
home scholl
Jimmy
jimmy
china
fujian
beijing
csdn
grep_test.txt
grep man hello
word
Jimmy
jimmy
xterm
keep moving ~ csdn
192.168.127.111
a.cpp
b.cpp c.cpp
china fujian beijing usa
普通用法
case 01
查找文件中的某个字符串(csdn)
[root@li1544-92 ~]# grep csdn grep_test.txt
keep moving ~ csdn
case 02
在多个文件中查找指定模式(csdn)
[root@li1544-92 ~]# grep csdn grep_test.txt grep_case.txt
grep_test.txt:keep moving ~ csdn
grep_case.txt:csdn
case 03
使用-l参数列出包含指定模式(csdn)的文件的文件名
[root@li1544-92 ~]# grep -l csdn grep_test.txt grep_case.txt
grep_test.txt
grep_case.txt
case 04
使用-n参数,在文件中查找指定模式并显示匹配行的行号
[root@li1544-92 ~]# grep -n csdn grep_test.txt grep_case.txt
grep_test.txt:6:keep moving ~ csdn
grep_case.txt:9:csdn
case 05
使用-v参数输出不包含指定模式的行
[root@li1544-92 ~]# grep -v csdn grep_test.txt
grep man hello
word
Jimmy
jimmy
xterm
192.168.127.111
a.cpp
test.cpp c.cpp
china fujian beijing usa
case 06
使用^符号输出所有以指定模式开头的行
[root@li1544-92 ~]# grep ^china grep_test.txt
china fujian beijing usa
case 07
使用$符号输出所有以指定模式结尾的行
[root@li1544-92 ~]# grep usa$ grep_test.txt
china fujian beijing usa
case 08
使用 -r 参数递归地查找特定模式,当文件名是目录时,必须使用-r参数
[root@li1544-92 ~]# grep -r china /root/
/root/grep_test.txt:china fujian beijing usa
/root/grep_case.txt:china
-r参数将使得grep命令在/root目录的所有文件中查找符合该模式的行
case 09
使用 -i 参数查找模式
grep命令的-i参数在查找时忽略字符的大小写
[root@li1544-92 ~]# grep -i jimmy ./grep_test.txt
Jimmy
jimmy
case 10
使用 -e 参数查找多个模式
我们想在一个grep命令中查找jimmy 和 csdn 这两个字符串可以使用-e参数,
例如:
[root@li1544-92 ~]# grep -ie jimmy -e csdn ./grep_test.txt
Jimmy
jimmy
keep moving ~ csdn
case 11
我们也可以将需要匹配的模式写作文件中,一行一个模式,此时可以使用 -f参数进行查找和匹配.
此时模式由grep_pattern文件指定,查找/root目录下的所有文件
grep_pattern文件内容如下:
[root@li1544-92 ~]# cat grep_pattern
xterm
csdn$
beijing
使用文件查找符合指定模式的行
[root@li1544-92 ~]# grep -rf ./grep_pattern /root/
/root/grep_pattern:xterm
/root/grep_pattern:beijing
/root/grep_test.txt:xterm
/root/grep_test.txt:keep moving ~ csdn
/root/grep_test.txt:china fujian beijing usa
/root/grep_case.txt:beijing
/root/grep_case.txt:csdn
高级用法
grep命令一般情况下支持基本正则表达式,我们可以通过参数-E支持扩展正则表达式,另外grep单独提供了一个扩展命令叫做egrep用来支持扩展正则表达式,这条命令和grep -E等价。其中扩展正则表达式支持的字符有: ‘+’,‘?’, ‘|’ ,’()’ 这四个。
我们在grep_test.txt文件中增加以下字符串用于测试:
good
goood
glad
gd
god
下面举几个例子进行说明:
case 01
查找所有的以.cpp为结尾的字符串
. 代表任意字符 * 代表0到多个
[root@li1544-92 ~]# grep .*\.cpp$ grep_test.txt
a.cpp
test.cpp c.cpp
case 01
查找所有的以.cpp为结尾的字符串
. 代表任意字符 * 代表0到多个 这里仅用基本正则表达式
[root@li1544-92 ~]# grep .*\.cpp$ grep_test.txt
a.cpp
test.cpp c.cpp
case 02
查找所有的类似god good等以g开头d结尾中间1一个以上o的字符串。
其命令如下:
其中+代码重复前面字符1到多次
[root@li1544-92 ~]# egrep go+d grep_test.txt (或者grep -E)
good
goood
god
其中基本正则表达式和扩展正则表达式说明参见
https://blog.csdn.net/lkforce/article/details/52862193
需要补充两点说明:
- 使用-r进行目录查找时,最好不要指定根目录,由于范围太广查找很慢,不建议这么用
- 如果忘记grep可以选手可以使用grep --help或者man命令
如何使用可以参考该文章教你如何查看linux各个命令的用法和功能