shell笔记_grep与正则表达式

grep与正则表达式:

1、grep程序

       Linux下有文本处理三剑客 -- grep sed awk

       grep:文本 行过滤工具

       sed: 文本 行编辑器(流编辑器)

       awk:报告生成器(做文本输出格式化)

       grep

              包含三个命令:grep egrep fgrep ,它们是用来进行 行模式(pattern)匹配的

              egrep = gerp -E //使用扩展的正则表达式进行匹配

              fgrep = fast grep  //只使用文件通配符进行匹配

              *grep默认使用正则表达式进行文本匹配*    

       grep的用法:

              grep [option] ... PATTERN [filename]

       grep的常见选项 -- option

              -E  支持使用扩展的正则表达式(ERE)(regexp)

              -P  使用perl语言的正则表达式引擎进行搜索(每一种语言的正则表示式引擎都不相同,甚至sed grep awk使用的regexp引擎也不相同)

              -i   忽略大小

              -v  进行反选

              -o  仅仅输出匹配的内容(默认输出的是匹配到的行)

              --color=auto  语法着色

              -n  显示行号

              -w  匹配固定的单词  

       PATTERN--正则表达式

              作用:通过一些特殊字符,来表示一类字符内容,然后交给前面的命令来执行;如果使用特殊字符本身含义,就需要 \ 进行转义;

              回顾:文件通配符(globbing)

                     * ? [ ] [^ ]

              1、字符匹配

                     .  任意一个字符  ?

                     [ ]  范围内的任意一个字符

                     [^ ]  范围外任意一个字符

                     字符类:[:digit:] [:alnum:] [:alpha:] [:lower:] [:upper:] [:space:] [:punct:]

              2、次数匹配

                     * 匹配前面的字符0次到无数次

                     \?匹配前面的字符0次到1次

                     \+ 匹配前面的字符1次到n次

                     \{m\} 配置前面的字符m次

                            a\{7\} aaaaaaa

                     \{m,n\} 匹配前面的字符m到n次

                     \{0,n\} 匹配前面的字符0次到n次  【0要不要?】

                     \{m,\} 匹配前面的字符至少m次

              3、位置锚定

                     ^ 锚定行首

                     $  锚定行尾

                     \b 锚定词首和锚定词尾

                     \>  锚定词尾

                     \<  锚定词首

                            <\root\>  rooter

              4、分组

                     abc*  abcccc  abc我们要看成一个整体

                     \(\)  示例:\(abc\)*  abcabcabc  abcccc

                     **分组特性:默认情况下,Linux系统会为分组指定变量 ,变量的表示形式 \1 \2 \3 ...

                     \(\(立秋\)已过\),\(香港\)依旧不宁。多区出现非法集会,\(暴力\)示威者破坏公物、堵塞干道,或以激光、砖块袭警、投掷汽油弹,更有甚者公然殴打内地游客及记者。随着示威升级,怂恿“反中乱港”的幕后势力也正慢慢浮现。

                     示例:\(ab+\(xy\)*\)   其中 \1 = ab+\(xy\)* , \2 = xy

                              abbbbbxyxyxyabxy

练习:

1、显示/proc/meminfo文件中大小s开头的行

       grep -i "^s" /proc/meminfo

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

       grep -v "/bin/bash$" /etc/passwd

3、显示/etc/passwd文件中UID号最大的用户的用户名

       sort -n -t: -k3 /etc/passwd | tail -1 | cut -d: -f1

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

       grep "^root\>" /etc/passwd &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7

       id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7

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

       grep "[0-9]\{2,3\}"  /etc/passwd

              -w   //匹配固定单词

              \<[0-9]\{2,3\}\>

              \b[0-9]\{2,3\}\b

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

       grep "^[[:space:]]\+.*[^[:space:]]$" /etc/rc.d/rc.sysinit

7、找出”netstat -tan”命令的结果中,以“LISTEN”后跟0、1或多个空白字符结尾的行

       netstat -tan | grep "LISTEN[[:space:]]*$"

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

       useradd bash           /bin/bash

       useradd testbash

       useradd basher

       useradd -s /sbin/nologin nologin

       grep "\(^[[:alnum:]]\+\>\).*\1$" /etc/passwd

9、IP地址如何匹配?

       ip地址:

              0-255.0-255.0-255.0-255

              0-255

              2 0-4 0-9  2[0-4][0-9]

              2 5 0-5   25[0-5]

              1 0-9 0-9  1[0-9][0-9]

              0 0-9 0-9  [0-9][0-9]

              0 0    0-9  [0-9]

      

       2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[0-9][0-9]|[0-9]\.2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[0-9][0-9]|[0-9]\.2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[0-9][0-9]|[0-9]\.2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[0-9][0-9]|[0-9]

       \((2[0-4][0-9])|(25[0-5])|(1[0-9][0-9])|([0-9][0-9])|([0-9])\)\.\1\.\1\.\1

\<[1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3]\>

1-9

1-9 0-9

1 0-9 {2}

2 [01] 0-9  200 - 219

2 2 0-3   220 - 223

\(\.\<[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4]\>\){2}

0-9

1-9 0-9

1 0-9 0-9

2 0-4 0-9

2 5 0-4

\( \){2}

\.\<[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4]\>

1-9

1-9 0-9

1 0-9 0-9

2 0-4 0-9

2 5 0-4

猜你喜欢

转载自www.cnblogs.com/baocx/p/11400657.html