首页 > 代码库 > Bash之正则表达式

Bash之正则表达式

    正则表达式,又叫规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本正则表达式分为基本正则表达式和扩展正则表达式,扩展正则表达式添加了一些更加丰富的匹配规则而成。

1 grep:文本查找、过滤工具。根据模式搜索文本,并将符合模式的文本显示出来。

格式:grep  [选项]  [模式]  file

选项:-i     忽略大小写

           -v    显示未被模式匹配的行

           -n    显示行号

           -r    递归查找 

           --color    用颜色显示

查找包含root的行:

[root@localhost log]# grep "root" /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin


查找包含至少一个r的行(*:匹配其前字符任意次)

[root@localhost log]# grep --color "rr*" /etc/passwd

root:x:0:0:root:/root:/bin/bash

adm:x:3:4:adm:/var/adm:/sbin/nologin


查找包含oot或ost的行([]:匹配范围内任意单个字符)

[root@localhost ~]# grep --color o[os]t /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin


查找包含数字0-9的行

[root@localhost ~]# grep --color [0-9] /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin


查找以root开始的行

[root@localhost ~]# grep "^root" /etc/passwd

root:x:0:0:root:/root:/bin/bash


查找以nologin结尾的行

[root@localhost ~]# grep "nologin$" /etc/passwd

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin


过滤空白行

[root@localhost ~]# grep ^$ backpasswd 


查看当前目录下包含root的行

[root@localhost ~]# grep -r root ./

./anaconda-ks.cfg:rootpw  --iscrypted $6$K8rYflMst4cLGPIp$Dt8SHV9uPN/w4N3tQPAvyPFYjCCM5RHRRBcJf7NOP7MmqVFG1n0UYrfbgs7mDQ8KvobzHpC8R0Q3U.QUII38o.

./backpasswd:root:x:0:0:root:/root:/bin/bash

./backpasswd:operator:x:11:0:operator:/root:/sbin/nologin

./install.log:Installing rootfiles-8.1-6.1.el6.noarch

./install.log:Installing fakeroot-libs-1.12.2-22.2.el6.i686

./install.log:Installing fakeroot-1.12.2-22.2.el6.i686


查找出现数字2或5的行:

[root@localhost ~]# egrep "(2|5)" c.txt

2

553


2 sed:行编辑器,逐行处理文本文件,主要用于过滤和替换操作,适合处理大数据文件,sed默认并不直接修改源文件。

格式:sed  [选项]  [模式]  file    其中模式如果是正则表达式,表示方式为:/正则表达式/

选项:--help    显示帮助

           -n    只显示匹配的行

           -e    允许执行多个操作

            -i    修改原文件

            -f    指定文件

            -r    使用扩展正则表达式

模式:  d    删除

             p    打印

             s    替换,如s/a/b/g,把a替换成b,g代表全局替换

             w file    把模式空间的内容保存到文件中

             a\     在当前行后面加入文本

             i\      在当前行前面加入文本

             r  file    把文件内容添加到符合条件处          

[root@localhost ~]# sed -n ‘1,2p‘ /etc/passwd            #只打印前2行

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin


[root@localhost ~]# sed -e ‘1,3p‘ -e ‘5d‘ c.txt          #执行多个操作


[root@localhost ~]# sed -i ‘s/5/66/g‘ c.txt              #直接修改源文件


[root@localhost ~]# sed ‘1,3d‘ c.txt                     #删除前3行


[root@localhost ~]# sed ‘1,3w /root/a.txt‘ c.txt         #把1至3行保存到a.txt文件中


[root@localhost ~]# sed ‘2a\ccc‘ c.txt                   #在第2行后面添加ccc


[root@localhost ~]# sed ‘2i\ccc‘ c.txt                   #在第2行前面添加ccc


[root@localhost ~]# sed ‘/3$/a\abcdefg‘ c.txt            #//表示正则匹配


[root@localhost ~]# vim d.sh                             #创建一个sed脚本

/^3/d

[root@localhost ~]# sed -f d.sh c.txt                    #以3开始的行被删除

66

66

66

660000

    

[root@localhost ~]# sed ‘2q‘ c.txt                       #显示前2行后退出

66

66


3 awk:是一种编程语言,也是优秀的报告生成器,按某种格式显示,是强大的数据处理引擎。

格式:awk [选项] ‘模式 {动作}‘ file... 其中模式如果是正则表达式,表示方式为:/正则表达式/

选项:-F    指定分隔符

      -v value=http://www.mamicode.com/a 在执行处理过程之前,设置一个变量

      -f    从脚本文件中读取指令


内置变量:

NF    当前记录的字段个数

OFS   输出字段分隔符,默认空格

NR    输入流的当前记录编号

FS    字段分隔符,需要在BEGIN处定义


表达式和操作符

a=1  自定义变量

+    加

-    减

>    大于

<    小于

&&   与

||   或

==   等于

!=  不等于

~    匹配

!~  不匹配

......


[root@localhost ~]# awk ‘/!ok/‘ a.txt                    #没有指定动作,默认为打印


[root@localhost ~]# vim a.sh                             #编辑awk脚本

/^$/ {print "abc"}                                       #通过正则匹配空白行,并打印abc

[root@localhost ~]# awk -f a.sh a.txt

abc

abc


[root@localhost ~]# awk -F : ‘{print $2,$3}‘ /etc/passwd #指定分隔符,打印2,3字段

x 0

x 1

x 2


[root@localhost ~]# echo a b c | awk ‘{print $NF}‘        #打印输出行最后一个字段

c


[root@localhost ~]# echo a b c | awk ‘{print NF}‘         #显示输出行字段的个数

3


[root@localhost ~]# echo a b c | awk ‘BEGIN{OFS="-"}{print $1,$2,$3}‘    #输出分隔符

a-b-c


[root@localhost ~]# echo "cc" | awk ‘a=3 {print a+1}‘     #自定义变量和计算

4


[root@localhost ~]# awk -F : ‘$1~/root/ {print $3}‘ /etc/passwd        #打印rootID号

0


[root@localhost ~]# awk -F : ‘$3>500 {print $1}‘ /etc/passwd           #打印>500的ID号

nfsnobody

abc


[root@localhost ~]# df -h | grep "boot" | awk ‘{if($4<200) print "no" ;else print "ok"}‘

no

#条件表达式,判断boot分区的空间,注意格式



本文出自 “一万年太久,只争朝夕” 博客,请务必保留此出处http://zengwj1949.blog.51cto.com/10747365/1917519

Bash之正则表达式