作用

文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行

模式

由正则表达式的元字符及文本字符所编写的过滤条件

参数

-a:不要忽略二进制的数据。
-A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b:在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
-c:计算符合样式的列数,只统计匹配的行数。
-C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作>:当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> :指定字符串做为查找文件内容的样式。
-E:将样式为延伸的普通表示法来使用,使用egrep命令。
-f<规则文件>:指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F:将样式视为固定字符串的列表。
-G:将样式视为普通的表示法来使用。
-h:在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H:在显示符合样式的那一行之前,表示该行所属的文件名称。
-i :忽略字符大小写的差别。
-l:列出文件内容符合指定的样式的文件名称。
-L:列出文件内容不符合指定的样式的文件名称。
-n:显示匹配行和行号。
-o:只显示匹配PATTERN 部分。
-q:不显示任何信息。
-r:此参数的效果和指定”-d recurse”参数相同。
-s:不显示错误信息。
-v:排除匹配结果。
-V:显示版本信息。
-w:只显示全字符合的列。
-x:只显示全列符合的列。
-y 此参数的效果和指定”-i”参数相同。
—color=auto:为grep过滤结果添加颜色
ps:详细查看http://blog.19870612.xyz/vlinux/course/src/linux.command_grep2/
grep命令是linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是linux运维人员必备的命令
grep命令里的匹配模式就是你想要的东西,可以是普通的文字符号,也可以是正则表达式

正则表达式grep实践

  1. ^符号(找到以什么为开头的行)

    grep -i -n “^m” ./lianxi.txt

  2. $符号(找到以什么结尾的行)

    grep -n “.$” ./lianxi.txt #注意这里要找到以点为结尾的话,要用\不然代表的就是任意一个字符的意思

  • 注意在linux平台下,所有文件的结尾都有一个$
  • 可以用cat -A 查看文件
  1. ^$组合
  2. . 一个字符 0至任意字符 .组合 所有字符
  3. []取值 [^]取反值

    扩展正则表达式grep实践

    都要结合 grep -E 去使用

  4. +号:匹配前一个字符1次或多次的内容(*是0次或多次)

  5. ?号:前一个字符0次或者1次

注意这些用法是前一个字符,比如”nic?e”,代表的不是nic开头c结尾的所有字符,而是ni开头e结尾的所有字符指的是c这个字符出现过0次或者1次的所有内容

  1. |符:正则中代表的或者的意思,比如”a|b”,就是找到含有a或者b的所有内容
  2. ()小括号:概括的意思,比如”g(oo|al)d”,找到的就是good和glad

    • 功能1:分组过滤括起来的内容,括号内代表一个正题
    • 功能2:括号内容可以被后面的\n正则所引用,n为数字,引用第几个括号的内容。\1第一个括号的内容;\2第二个括号的内容

      grep -E “(l..e).\1” lianxi.txt #意思其实就是 (l..e).(l..e)

  3. {n,m}:匹配次数

重复前一个字符各种次数,n代表最少次数,m代表最多次数

  • grep当中你得先明白你要做的是什么事情,明白后,确定你要用到的是什么符号,需不需要加上-E,需不需要加上\转义
  • 另外,明白如果不用-E,用egrep,该用什么样的符号(尽量用egrep,符号会简单容易理解一点)

    案例

    1.找出文本当中不论大小写”root”的位置及其具体行号

    grep -i “root” ./lianxi.txt -n

2.找出文本当中带有不论大小写”root”的行数

grep -i “root” ./lianxi.txt -c

3.找出文本当中不是空行的内容

grep -v “^$” ./lianxi.txt

4.排除掉注释行后再排除空行显示内容

grep -v “^#” ./lianxi.txt | grep -v “^$”

5.找到固定开头的用户内容

这个时候我们找出来的内容,只要是以root和dai这个单词右边结束,才会打印出来,就不会存在比如dai1,dai2这样的用户内容打印出来了

grep -E “^(root|dai)>“ /etc/passwd

6.匹配几次后停止

匹配两次带有不论大小写root的行就停止

grep -m 2 -i “root” ./lianxi.txt

7.匹配多文件,列出存在信息的文件名

利用 -l 参数,只打印有且可多个带有root开头内容的文件名

grep -l ‘^root’ lianxi1.txt lianxi2.txt lianxi3.txt

8.找出两位数或三位数

grep -E “\<[0-9]{2,3}>“ lianxi.txt

9.找出至少一个空白字符开头,后面是非空白字符的行

含义是开头是空格字符,后面带有字符

grep “^[[:space:]].*” lianxi.txt

这个就是题目的完整翻译,开头空白字符,后面带有非空白字符,用^改变含义

grep -E “^[[:space:]]+[^[:space:]]” lianxi.txt

10.找字符后带括号(其实就是找到比如某文本中的所有函数名,函数是不是都是函数名字后面带上一个括号,比如

grep -E “[a-zA-Z]+()“ lianxi.txt

11.找到与用户名相同的shell脚本

步骤一:我们是不是要得到的是开头的用户名和结尾的/bin/??是一致的,是不是就可以认为是开头和结尾一样的就可以了
步骤二:那么我们先来第一步,提取用户名

grep ‘^([^:]+>)’ /etc/passwd 解析:我们看到的/etc/passwd是不是以冒号做分界点的,那么我们取到第一个冒号结束前是不是就是用户名,所以我们先来个^取内容,取什么呢?用+取到可以1个或多个不是冒号的字符(^:这是不是代表不是冒号的意思),再利用转义>是不是就代表遇到一次冒号就结束,那是不是就是我们要取的第一段内容,他的用户名呢?

步骤三:找到与第一段内容相同的结尾字符

grep ‘^([^:]+>).\1$’ /etc/passwd 解析:这个时候其实就已经完成了我们所有的要求,注意看,括号内的内容提取出来是不是用户名,我们想要以这个用户名结尾的内容就是对的吧,我们用\1是不是就是前面第一个括号的内容,就是用户名,再加$结尾,中间用.去代替,不管你是什么内容无所谓,最后匹配到最后一致的,是不是就是我们要的了