Linux命令:grep命令 | egrep命令

grep:文本搜素工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能被模式所匹配到的行

包含三个命令:grep、egrep(相当于grep -E 扩展的正则表达式)和fgrep(相当于grep -F 只能字符串匹配)

 

格式:

  grep [options] PATTEN filename

 

options

grep -v (--invert-match):反向匹配,显示不能被表达式匹配的行

grep -o (--only-matching):仅显示被模式匹配到的字串,而非整行,将匹配到的字符串一行一个显示

grep -n :打印行号

grep -q:静默模式,不输出任何信息,用于写脚本时的判断,和&>/dev/null一样

grep -c :计算找到匹配项的行数,1行算1次。只显示行数,不显示匹配到的行内容

grep -i :不区分字符大小写

grep -B 数字:before显示匹配行,和其上面n行

grep -A 数字:after显示匹配行,和其下面n行

grep -C 数字:显示匹配行,和上下n行

grep -e :实现多个选项间的逻辑or关系,例如grep -e 'cat' -e 'dog' filename

grep -w :匹配整个词,用空格、特殊符号隔开的都算一个词

grep -f 后面跟文件,文件中写正则表达式,各个表达式相当于或关系

grep -f f1 f2   #两个文件取交集

grep -E 使用egrep

grep -F 使用fgrep

 

PATTEN正则表达式:是一类字符所书写出的模式(pattern)

    元字符:不表示字符本身的意义,用于额外功能性的描述

        基本正则表达式(grep)的元字符:

        字符匹配:

            .:元字符,代表任意一个字符,包括空格

            \.:表示.本身,"\"斜杆是逃逸符后面可接, ! ` [ .

            [ ]:指定范围内的任意单个字符

            [^]:指定范围外的任意单个字符

            [A-Z],[[:upper:]]所有大写字母

            [a-z],[[:lower:]]所有小写字母,和通配符匹配文件名有区别

            [[:alpha:]]所有字母,大小写

            [0-9],[[:digit:]]所有数字

            [[:alnum:]]所有数字+字母

            [[:blank:]]空白字符(空格和制表符)

            [[:space:]]水平和垂直的空白字符(比[:blank:]包含的范围广)

            [^[:space:]]非空白字符

            [[:graph:]]可打印的非空白字符

            [[:print:]]可打印字符

            [[:punct:]]标点符号

            [[:cntrl:]]不可打印的控制字符(退格、删除、警铃)

       

        次数匹配:用来指定匹配其前面的字符的次数

            *:任意次

                例如:x*y,xxy,xy,y,指的是x可以出现0,1或者多次

                    .*:匹配任意长度的任意字符

            \?:0次或1次

                例如:x\?y,xy,y,xxy

                贪婪模式:尽可能的长的去匹配字符

            \+:至少1次

            \{m\}:匹配m次,此处的两个\\是转义字符

            \{m,n\}:匹配至少M次,至多n次

            \{m,\}:匹配至少M次

            \{0,n\}:匹配至多n次

              例如:x\{2,6\}y匹配xxy,xxxy,xxxxy,xxxxxy,xxxxxxy

 

        位置锚定:用于指定字符出现的位置

            ^:锚定行首

            $:锚定行尾

                例如:^[[:space:]]\+$  空白组成的行

 

            \<char:锚定词首,\bchar  数字、字母、下划线连起来的都算单词,其他符号都算分隔符

            char\>:锚定词尾,char\b

             例如: \<h..o\>,以h开头,o结尾中间跟任意两个字符的单词

 

        分组:

            \(\)

                \(ab\)*xy    xy,abxy,ababxy

        引用:

            \1:后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式的结果字符串

            \2

                \(a.b\)xy\1  a6bxya6b

        或者:

            \|  a\|bcd     a或者bcd,整个字符串或者

 

举例:

1、显示/proc/meminfo文件中以大小写s开头的行
# grep "^[Ss]" /proc/meminfo
# grep -i "^s" /proc/meminfo

2、取出默认shell为非bash的用户
# grep -v "bash$" /etc/passwd | cut -d: -f 1

3、取出默认shell为bash的且ID号最大的用户
# grep "bash$" /etc/passwd | sort -t: -k3 -rn|head -1|cut -d: -f1

4、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面至少一个空白字符,而后至少一个非空白字符的行
# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit

5、显示/boot/grub/grub.conf中至少一个非空白字符开头的行
# grep "^[^[:space:]]\{1,\}" /boot/grub/grub.conf

6、找出/etc/passwd文件中一位数或两位数
# grep "\<[0-9]\{1,2\}\>" /etc/passwd

7、查看当前系统上root用户的所有信息
# grep "^root\>" /etc/passwd

8、添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户
# grep "^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd

9、匹配所有非空白行
#grep "." a.txt  

10、取目录名
# grep -Eo ".*\<"  
# grep -Eo ".*[^/]" | grep -Eo ".*/"

11、取基名 
# grep -Eo "[^/]+/?$"

12、匹配空行
# grep ^$ file

13、匹配非空行   
# grep -v ^$  filegrep .\+ file   

14、匹配0.0.0.0~255.255.255.255  
grep --color=auto -o "\(\<\([0-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)\>\.\)\{3\}\<\([0-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)\>"

15、匹配实际IP地址1.0.0.0-223.255.255.255
grep --color=auto -o "\<\([1-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-1][0-9]\|22[0-3]\)\>\(\.\<\([0-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)\>\)\{3\}"

 

egrep:使用扩展正则表达式来创建模式,相当于 grep -E

    元字符:

        字符匹配:

            .:任意单个字符

            [ ]:指定范围内的任意单个字符

            [^ ]:指定范围外的任意单个字符

        次数匹配:

            *:匹配其前面的字符任意次

            ?:匹配前面的字符0或1次

            +:匹配前面的字符至少1次

            {m}:匹配前面的字符m次   区别于普通正则表达式

            {m,n}:至少m,至多n次

            {m,}:至少m次

            {0,n}:至多n次

        锚定

            ^:行首

            $:行尾

            \<, \b :词首

            \>, \b :词尾

        分组:

            ():分组

 

posted on 2019-09-01 21:40  强叔Linux  阅读(4182)  评论(0编辑  收藏  举报