【linux_笔记】Linux_文本查找(grep)及正则表达式

学习资源来自:www.magedu.com

学习记录过程中难免出现错误,如有发现,还望大神们指出。

示例操作部分有的与历史操作有关,如果先前的示例操作没有执行过的话,可能会有部分示例的操作无法执行。示例仅供参考。(练习题在附录)


文本查找:grep, egrep, fgrep    
    grep(Global Research): 使用基本正则表达式定义的模式来过滤文本的命令
                           根据模式搜索文本,并将符合模式的文本行显示出来。
    egrep = grep -E
    fgrep(fast grep): 不支持正则表达式                       
    Pattern: 由文本字符和正则表达式的元字符组合而成的匹配条件

    grep [options] PATTERN [FILE...]
        -i:忽略大小写
        --color:设定指定情况下显示的高亮颜色
        -v: 显示没有被模式匹配到的行
        -o:只显示被模式匹配到的字符串
        -E: 使用扩展正则表达式
        -A #: 追加显示匹配行后面的几行
        -B #: 追加显示匹配行前面的几行
        -C #: 追加显示匹配行前、后各几行
        示例:
            cd
            grep 'root' /etc/passwd ―― 显示匹配root的行
            grep -i 'root' /etc/passwd ―― 忽略大小写
            grep --color 'root' /etc/passwd ―― 匹配字符高亮
            alias grep='grep --color'
            grep 'root' /etc/passwd
            grep -v 'root' /etc/passwd ―― 显示未匹配到的行
            grep -o 'root' /etc/passwd ―― 只显示匹配字符串root
            grep -A 2 '^core id' /proc/cpuinfo ―― 追加显示匹配行后面的几行


正则表达式:Basic REGEXP(基本),Extended REGEXP(扩展)

    基本正则表达式:Basic REGEXP
        元字符:
        .: 匹配任意单个字符
        []: 匹配指定范围内的任意单个字符
        [^]:匹配指定范围外的任意单个字符
            字符集合:
                [:digit:], [:lower:], [:upper:], [:punct:](标点符号)
                , [:space:], [:alpha:], [:alnum:]

        次数匹配:

            *: 匹配其前面的字符任意次(贪婪模式)    
            .*: 任意长度的任意字符
            \?: 匹配其前面的字符1次或0次
            \{m,n\}:匹配其前面的字符至少m次,至多n次
                \{1,\}:最少一次
                \{0,3\}:最多三次
        示例:    
            grep 'r..t' /etc/passwd        
            nano test.txt
                a
                b
                ab
                aab
                acb
                adb
                amnb
                amnbamdb
            grep 'a*b' test.txt ―― 贪婪匹配
                b,ab,aab,acb,adb,amnb,amnbamdb
            grep 'a.*b' test.txt
                ab,aab,acb,adb,amnb,amnbamdb
            grep 'a\?b' test.txt ―― 部分匹配
                b,ab,aab,acb,adb,amnb,amnbamdb
            grep 'a\{1,3\}b' test,txt
                ab,aab
            grep 'a.\{1,3\}b' test.txt
                aab,acb,adb,amnb,amnbamdb

        位置锚定:指定字符出现的位置
            ^: 锚定行首,此字符后面的任意内容必须出现在行首
            $: 锚定行尾,此字符前面的任意内容必须出现在行尾
            ^$: 空白行
            示例:
                grep 'r..t' /etc/passwd
                grep '^r..t' /etc/passwd ―― 锚定行首是指定的字符串
                grep 'w$' /etc/inittab ―― 锚定行尾是指定的字符w
                grep 'b..h$' /etc/passwd ―― 锚定行尾是指定的字符串
                grep '^$' /etc/inittab | wc -l ―― 显示空白行行数
                grep '[[:digit:]]$' /etc/inittab ―― 锚定行尾是任意数字
                grep '[[:space;][:digit:]]$' /etc/inittab


            \<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现
            \>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现
            \<root\>:匹配完整的单词
            单词:以特殊字符为分隔符
            示例:
                nano test.txt
                    this is root
                    The user is mroot
                    rooter is a dog's name
                    chroot is a command
                    mrooter is not a word
                grep "root\>" test2.txt
                    this is root
                    The user is mroot
                    chroot is a command
                grep "\<root" teste.txt
                    this is root
                    rooter is a dog's name
                grep "\<root\>" teste.txt
                    this is root
        分组:\(\)
            \(ab\)* ―― ab作为一个整体
            后向引用
            \1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
            \2:引用第二个左括号以及与之对应的右括号所包括的所有内容
            \3:……
            示例:
            nano test3.txt
                He love his lover.
                She like her liker.
                He like his lover.
                She like him
            grep 'l..e' test3.txt ―― 显示匹配字符串的行
                He love his lover.
                She like her liker.
                He like his lover.
                She like him
            grep 'l..e.*l..e' test3.txt
                He love his lover.
                She like her liker.
                He like his lover.
            grep '\(l..e\).*\1' test3.txt
                He love his lover.
                She like her liker.
            grep '\(l..e\).*\1r' test3.txt
                He love his lover.
                She like her liker.
            grep '\([0-9]\).*\1$' /etc/inittab
                ―― 匹配中间出现任意数字并以该数字结尾的行
    
    扩展正则表达式:Extended REGEXP

        字符匹配(与基本正则表达式相同):
            .:匹配任意单个字符
            []:匹配指定范围内的任意单个字符
            [^]:匹配指定范围外的任意单个字符
        次数匹配
            *: 匹配其前面的字符任意次
            ?:匹配其前面的字符一次或零次
            +: 匹配其前面的字符至少1次
            {m,n}:匹配其前面的字符至少m次,至多n次
        位置锚定(与基本正则表达式相同):
            ^:锚定行首
            $:锚定行尾
            \<:锚定词首
            \>:锚定词尾
        分组:
            ():分组
            \1, \2, \3, ...
        或者
            |: or
            C|cat:  C或cat
        示例:
        grep --color -E '^[[:space:]]+' /boot/grub/grub.conf

        找出/boot/grub/grub.conf文件中1-255之间的数字;
        egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' /boot/grub/grub.conf

        \.
        匹配IP地址
        ifconfig | egrep --color '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}
                                        \<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'


你可能感兴趣的:(grep,基本正则表达式,扩展正则表达式)