grep

名称grep, egrep, fgrep - print lines matching a pattern 输出匹配模板的行。

[内容显示命令、内容操作命令选取]

语法grep [options] PATTERN[FILE...]

功能简述grep是一个强大的文本搜过工具能够使用正则表达式搜索文本并把匹配的行打印出来。grep的工作方式是这样的它在一个或者多个文件中搜索字符串模板模板中如果包含了空格也需要被引用的。模板之后的字符串都被视为要搜索的文件名。

grep可用于shell脚本因为grep通过返回一个状态值来说明搜索的状态。如果模板搜索成功就返回0如果搜索失败就返回来1[可以用来作判断条件]如果搜索的文件不存在就返回2.可以利用这些返回值来进行一些自动化的文本处理工具

命令参数

-a –text 不要忽略二进制的数据

-A     --after-context除了显示符合范本样式的那一行之外并显示该行之后的内容

-B     --before-context除了显示符合范本样式的那一行之外并显示该行之前的内容

-c      --count计算符合样式的行数

-d      --directories     当指定要查找的是目录而非文件时必须使用这项参数否则grep指令将回报信息并停止。和-r 参数一样的效果。

-e      --regexp指定字符串作为查找文件内容的样式

-E      --extended-regexp  将样式为延伸的普通表示法来使用

-f       指定规则文件也就是参照的模板内容的文件文件内容包含一个或者多个规则样式grep查找符合规则条件的文件内容格式为每一行一个规则样式。

-h      --no-filename   在显示符合样式的那一行之前不标示该行所属的文件名称。

-I       --ignore-case   忽略字符大小写的差别

-l       --file-with-matches列出文件内容符合指定的样式的文件名称

-L      列出文件的内容不符合指定样式的文件名称

-n      在显示符合样式的那一行之前标示出该行的列数编号

-q      --quiet      不显示任何信息

-s      --no-messages不显示错误信息

-r      明确搜索子文件夹

-v      --revert-match  显示不包含匹配文件的所有行。反选。

-----------------------------------------------------------------------------------------

正则表达式grep的规则表达式:

^       锚定行的开始

$       锚定行的结尾

\       忽略正则表示式中特殊字符的原有意义转义字符。

.       匹配一个非换行符的字符也就是匹配一个任意字符

*       匹配零个或多个前一个字符。  .* 搭配在一起用代表任意字符

[]      匹配一个在[]指定范围内的字符其中一个

[^]     匹配一个不在指定范围内的字符

\(..\)  标记匹配字符

\<      锚定单词的开始

\>      锚定单词的结束

X\{m\}  重复字符x,m次如‘0\{5\}’匹配包含50的行。[其实这个\就是一个转义作用。当然这个是我为了方便记忆才这么理解的。那么简化了就shi Xn或者Xn,m 重复n次或者至少n次。]

X\{m,\}     重复字符x至少m

X\{m,n\}   重复字符至少m次不多于n次。

\w         匹配文字和数字字符。如G\w*p 匹配以G开头以p结尾中间是任意字母或数字。

\b         单词锁定符如\bgrep\b那么就只匹配grep[其实好像可以\<\>来标识。]

-----------------------------------------------------------------------------------------

使用实例

1)查找指定的进程

[root@LiWenTong ~]# ps -ef |grep crond

root     2782     1  0 00:19 ?        00:00:00 crond

root     3295  3121  0 01:23 pts/0    00:00:00 grep crond

2)查找并统计匹配指定的字母的次数

[root@LiWenTong ~]# grep -c good test.txt

3

3)从文件中读取关键字进行搜索

[root@LiWenTong ~]# cat test.txt | grep -f test1.txt

good

good

good

4)从文件中读取关键字搜索并显示行号

[root@LiWenTong ~]# cat test.txt | grep -nftest1.txt

1:good

2:good

7:good

5)从文件中查找关键字

[root@LiWenTong ~]# grep bad test.txt

bad

baddd           ---》只要是包含了关键字bad的都会被显示出来如果想只匹配bad单词

[root@LiWenTong ~]# grep '\<bad\>'test.txt  ---》通过<>来标定单词的开头结尾

bad

bad

[root@LiWenTong ~]# grep '\bbad\b'  test.txt  --->\b参数来界定单词

bad

bad

[root@LiWenTong ~]# grep -w bad test.txt   ---》加上-w参数

bad

bad

6)查找以b开头的行内容

[root@LiWenTong ~]# grep '^b' test.txt

bad

baa

baddd

7)查找非b开头的行

[root@LiWenTong ~]# grep '^[^b]' test.txt

good

good

8)输出以od为结尾的行内容

[root@LiWenTong ~]# grep 'od$' test.txt

gooood

gooood

9)通过ifconfig grep获取出本地的eth0ip地址

[root@LiWenTong ~]# ifconfig eth0 | grep'[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}'

inet addr:192.168.222.128  Bcast:192.168.222.255  Mask:255.255.255.0

------>如果需要只取到IP而已没有其他的附加信息。需要再改进此命令。


参数

-c  统计行数

-r 搜索子文件夹

正则要灵活使用。

此题再优化

grep ‘[0-255].[0-255].[0-255].[0-255]’一样能够达到我们所要的结果。

10)搜索目录下下的包含关键字的文件并且包含子文件夹

[root@LiWenTong test2]# grep  -r good/root/test/*

/root/test/2.log:good

/root/test/2.log:good

/root/test/test1/1.log:good

/root/test/test1/test2/3.log:good

/root/test/test1/test2/3.log:good

11)输出选择内容的行数

[root@linux-lwt tmp]# grep -n '21$' 1.txt

3:321

12-v反向选择选择出没有的内容

[root@linux-lwt tmp]# grep -nv '21$' 1.txt

1:123

2:23

-------------------------------后续自我小结-----------------------------

   grep命令其实也是十分强大如果你想要查找什么内容查找之后的统计它也能够做到。首先第一个想到的应该它并且多想想通过它是否能够实现你想要的内容。    

   grep在选择筛选内容上面很厉害。对于单个单词方面应该还是不错的因为grep会一整行显示出来。如果是我们需要的是一整列的选取或者符合行的第几列的内容截取的话grep就不能够满足我们的需求了。那么就要用awk和sed这个两个更加强劲。grep只是在选取行上面很厉害而已。基本上行的选择应该是没有达不到。只要用好我们的正则表达式。如果你觉得办不到那么可能就是你的正则表达式还不够准确还不够熟悉。

-----------------------------------------------------------------------