grep与正则表达式详解

    grep作用:使用模式匹配指定文件中的文本,是一款很好用的文本搜索和过滤工具

        模式:正则表达式字符以及文本字符编写的过滤条件

        正则表达式:由一类特殊字符及文本字符所编写的的模式,其中有些字符不表示字面意义,而表示          控制或者通配功能,分为基本正则表达式和扩展正则表达式两类

    grep默认使用基本正则表达式,egrep或者grep -E开启扩展正则表达式

        --color=auto:为匹配到的字符着色

        -v:反选,显示不能被模式匹配到的行

        -F:使用fgrep

        -P:使用perl语言的正则表达式引擎(功能异常强大)

        -o:仅显示匹配到的字符(默认显示整行)

        -i:匹配时忽略字符大小写

        -q:静默模式,即使匹配到也不输出到屏幕

        -A n(n是数字):显示匹配到的行及行后面n行

        -B n:显示匹配到的行及行前面n行

        -C n:显示匹配到的行及行前后n行

        

    基本正则表达式:

        字符匹配

            . :表示匹配任意单个字符

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

            ^:匹配范围之外的字符

            wKioL1XV7BiDTfUsAABiUskt0fg315.jpg

            可用的glob:

            [:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

        次数匹配:用在要指定次数的字符后面,用于指定前面的字符出现的次数

            *:匹配其前面的字符任意次(0到n次)

            \?:匹配其前面的字符0次或1次(前面的\是用来转义的)

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

            \+:匹配其前面的字符至少一次

            \{m\}:匹配其前面字符精确m次

            \{m,n\}:匹配其前面的字符至少m次最多n次

            使用范例:新建一个文本文件grep.txt,内容如下:

            wKioL1XV7iuSLFxZAAAbnZJuTzI112.jpg


            wKiom1XV7GmRnSmdAAAymfeRWF0419.jpg

            tip:上例匹配到了'xyxyxyxy',所以默认情况下正则表达式工作在贪婪模式下

            wKioL1XV71bBsW0TAAAiIDeyNx4853.jpg


            wKioL1XV77jA3PsUAAA0dJkIyU8995.jpg


            wKiom1XV7wWiEkDcAAA47VCqCWE955.jpg

        位置锚定:

            ^:锚定行首

            $:锚定行尾

            ^$:锚定空行

            ^[[:space:]]*$:锚定空白行(包括制表,空格)

            wKioL1XV8Zjw-QBWAAD3Wkjlpp0226.jpg

        单词锚定

            \<或\b:词首锚定,应出现于单词模式左侧

            \>或\b:词尾锚定,应出现于单词模式右侧

            \b<pattern>\b:锚定整个单词

            wKioL1XV8z2zKu_AAAB_qTT3VcM180.jpg

        分组:将一个或多个字符捆绑在一起当做一个整体进行处理

            \(\)

            wKioL1XV88rBZSTBAAA2iqqJFTg480.jpg

        后向引用:引用前面分组括号中的模式匹配到的字符

            \1:匹配从左侧起第一个左括号以及与之匹配的右括号之间的所匹配到的字符

            \2:匹配从左侧起第二个左括号以及与之匹配的右括号之间的所匹配到的字符

            \n:匹配从左侧起第n个左括号以及与之匹配的右括号之间的所匹配到的字符

            wKioL1XV9RCB8qv3AABqIjpMHiE271.jpg

例题:

1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)

方法一:

wKioL1XoVWTjPwvXAABr_JoiDgg673.jpg

方法二:

wKiom1XoU0DCb_WDAABtJpBiGW4095.jpg

2、显示/etc/passwd文件中不以/bin/bash结尾的行;

wKiom1XoU0Hjf9DQAACDiYxoZz4425.jpg

3、如果用户root存在,显示其默认的shell程序;

wKioL1XoVWSTQaM0AAA3g6pjWH0662.jpg

4、找出/etc/passwd中的两位或三位数;

wKiom1XoU0GRc_SeAAA4SYJv9iY805.jpg

5、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行;

wKioL1XoWjrhWEqzAACiUTmX_eI427.jpg

6、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;

wKioL1XoWsyQN5_IAABuiwemhI8299.jpg

7、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;

wKiom1XoWBbxC6_SAACU5Qd13Po260.jpg

    扩展正则表达式:

        扩展正则表达式使用特殊字符无需使用\转义

        相比基本正则表达式多了或者功能

        | 表示或者

            C|cat:表示C或cat

            (C|c):表示Cat或cat

例题:

1、显示当前系统root、centos或user1用户的默认shell和UID;

wKioL1XoYIyi-kqnAAA6l4_lT5o687.jpg
2、找出/etc/rc.d/init.d/functions文件(centos6)中某单词后面跟一个小括号的行;

wKiom1XoXmny1LTIAAB_sjVNSZQ936.jpg

3、使用echo输出一绝对路径,使用egrep取出其基名;

wKioL1XoYCrhj1s4AAArGZJF634140.jpg

进一步地:使用egrep取出路径的目录名,类似于dirname命令的结果;

wKiom1XoXgaDzUwJAAApEMibWVw935.jpg

4.取出ifconfig输出内容中的ip地址和掩码:

wKioL1XX53DQAlOWAACc1eTrb74358.jpg

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