grep命令非常强大。它用于查找内容包含指定模板样式的文件,如果发现某文件的内容符合所指定的模板样式,默认grep会把含有模板样式的那一行显示出来。若不指定任何文件名称,或是所给与的文件名为“-”,则grep指令会从标准输入设备读取数据。
使用--help选项获得帮助信息。要看更详细信息,请使用man grep。

|
-h或--help |
显示在线说明 |
|
-a或--text |
equivalent to --binary-files=text强制grep显示内容,将二进制文件当做文本文件一样处理。 |
|
-A number |
输出匹配到字串的行 以下,number行内容 |
|
-B number |
输出匹配到字串的行 以上,number行内容 |
|
-b或--byte-setoff |
标出该行第一个字符的位置编号,编号从0开始,包含结束符(不可见字符) |
|
-C number |
输出匹配到字串的行 以上和以下,各number行内容 |
|
-c |
计算找到'搜索字符的次数' |
|
-E |
扩展的grep,即egrep |
|
-m number或---max-count=number |
指定匹配字符串最大次数,超出的部分不再输出。 |
|
-n或--line-number |
输出内容之前,输出行编号 |
|
-H或--with-filename |
输出内容之前,输出文件名 |
|
-h或--no-filename |
输出内容之前,不输出文件名 |
|
-o 或--only-matching |
只输出匹配字符串,不输出其他字符。 |
|
-q或--quiet, --silent |
阻止输出内容,匹配成功也不输出 |
|
-I |
二进制文件不做匹配 |
|
-i |
忽略大小写 |
|
-c |
统计匹配成功数量 |
|
-L |
只输出为匹配不成功的文件名称 |
|
-l |
只输出匹配成功的文件名 |
|
-T |
以表格形式输出,文件名,匹配到的内容 |
|
-v |
输出未匹配的内容 |
|
-Z |
在文件名后,输出1字节。如果-z和-T配合使用,文件名和输出内容会连在一起。 |
|
-U |
不移除windows或dos系统的CR字符 |
|
--color=auto |
以特定颜色高亮匹配关键字 |
下面用几个例子来说明grep的强大功能。例1:显示文件内容,但不包含指定字符串“old”的行

例2:显示系统默认的别名定义

例3:在文件中搜索指定字符串并显示前后5行内容

注意,这里字符串有重复。实战场景:可以用于分析某日志,对出现特定内容进行匹配,输出前后内容利于分析。
例4:查文件有多少行
grep -n "." /etc/service | tail -1-n输出行号,并使用正则表达式,匹配所有的字符。再通过管道让tail输出最后一行。
例5:将文件中的小于等于100,且只有两位小数的数字筛选出来
this is a number ,100.00
this is also number,1975.307
175.3
are you ok,45.3
5.13
25.139
65.10
201.1
100.10
108.02
120.1
100.01
100.2
方法1:grep -Eo "[0-9]*\.[0-9]*" brb3.txt |grep -Ev ".+...\."|grep -Ev "\....+"|grep -Ev "[2-9][0-9][0-9]\."|grep -Ev "1[0-9][1-9]\.|1[1-9][0-9]\."|grep -Ev "100.[0-9][1-9]|100.[1-9][0-9]|100.[1-9]"思路:a.先将文件中所有数字筛选出来,并只输出筛选结果

筛选条件是数字任意长度、小数点、以及小数点后任意长度数字。输出结果中包含1975.307,25.139等不合格数据,有些大于100有些小数点位数超过2位。b.排除大于4位数的数字

“.”代表人一个字符,“+”代表匹配之前的项1次或者多次,“.+”组合代表1个或多个字符。"..."代表任意三个字符。“.+...”代表大于等于4个字符“\.”最后一个使用了转义符“\”,让“.”不在代表任意字符,代表小数点“.+...\.”代表小数点之前有4个字符符合条件的1975.307,被排除c.排除小数点大于3位的数字

“\....”代表小数点后至少有3个字符,这里同样使用了转义字符d.排除大于200的数字

“[2-9][0-9][0-9]”代表200以上e.排除部分100以上200以下的数字

"1[0-9][1-9]\.|1[1-9][0-9]\."这个组合了两个条件,且为或的关系,使用了“|”前半部分代表101-199数字,但无法代表110,因为末位表达式没包括0后半部分代表110-199的数字,但无法代表109以下的数字f.最后排除100-101的数字

"100.[0-9][1-9]|100.[1-9][0-9]|100.[1-9]"使用了3个或关系条件整数部分都为100,有以下三种情况:只输出了1位小数,且小数为1-9输出了2位小数,第一位1-9,第二位是0输出了2位小数,第一位0-9,第二位1-9满足其一即排除。 g.递归搜多文件grep "123" . -R -n h.忽略大小写echo "hello world" | grep -i "HELLO" i.匹配多个样式echo this is a line of text | grep -e "this" -e "text" -o j.使用文件存储匹配的样式并使用grep -f 匹配文件 源文件echo hello this is cool | grep -f 1.txt1.txt内容:is输出: hello this is cool k.在grep搜索中包含或排除文件grep "main()" . -r --include *.{c,cpp}在目录中递归搜索所有的.c和.cpp文件 grep "main()" . -r --exclude "readme"在搜索中排除所有的readme文件可以使用--exclude-dir排除目录使用--exclude-from FILE从文件中读取所需要排除的文件列表 L.配出多个文本条件grep -vE "(inet6|127.0.0.1)" 1.txt M匹配指定位置echo "BABcde" | grep -v "^[AB]" 第一位不允许A或者Becho "BABcde" | grep -v "^.[AB]" 第二位不允许A或B,以此类推echo "B1ABcde" | grep -v "^.\{3\}[AB]" 第4位不允许A或者Becho "B1ABcde" | grep -v "[AB]#34; 末尾不允许A或者B