您的位置:首页 > 运维架构 > Shell

Linux_Shell知多少—常用正则表达式

2010-12-02 11:24 501 查看
正则表达式

正规表示法与文件格式化处理

正规表示法与通配符是完全不一样的东西

通配符(wildcard)代表的是bash操作接口的一个功能

正则表示法则是一种字符串处理的表示方式

grep 的一些进阶选项

[root@www ~]# grep [-A] [-B] '搜寻字符串' filename

选项与参数:

-A :后面可加数字,为 after 的意思,除了列出该行外,后续的n行也列出来

-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的n行也列出

-i :忽略大小写

-n :打印出行号

-v :取反 <== 除了关键字以外的都打印出来

--color=auto :把关键字加深颜色

-E :使用扩展正则表达式进行匹配。grep -E可取代传统的egrep

[:alnum:] 代表英文大小写字符及数字,亦即 0-9, A-Z, a-z <==> [a-zA-Z0-9] <==> [[:alnum:]]

[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z <==> [a-zA-Z] <==> [[:alpha:]]

[:digit:] 代表数字而已,亦即 0-9 <==> [0-9] <==> [[:digit:]]

[:lower:] 代表小写字符,亦即 a-z <==> [a-z] <==> [[:lower:]]

[:upper:] 代表大写字符,亦即 A-Z <==> [A-Z] <==> [[:upper:]]

[root@feed ~/shell]# dmesg | grep -n -A3 -B2 --color=auto 'eth'

[root@www shell]# alias grep='grep --color=auto' <==设为别名,有利而无害

利用中括号 [] 来搜寻集合字符

test/taste

[root@www shell]# grep -n 't[ae]st' regular_express.txt

[root@www shell]# grep -n '[^g]oo' regular_express.txt

[root@www shell]# grep -n '[^a-z]oo' regular_express.txt

[root@www shell]# grep -n '[^[:lower:]]oo' regular_express.txt <==等价于上条

行首与行尾字符 ^ $

以t/The开始的行

[root@www shell]# grep -n -i '^the' regular_express.txt

以小写字母开头

[root@www shell]# grep -n '^[a-z]' regular_express.txt

非字母开头:

[root@www shell]# grep -n '^[^a-zA-Z]' regular_express.txt

以.结尾:

[root@www shell]# grep -n '/.$' regular_express.txt

找出空行:

[root@www shell]# grep -n '^$' regular_express.txt

任意一个字符 . 与重复字符 *

. (小数点):代表『一定有一个任意字符』的意思

* (星星号):代表『重复前一个 0 到无穷多次』的意思,为组合形态

假设我需要找出 g??d 的字符串,亦即共有四个字符, 起头是g而结束是d

[root@www shell]# grep -n 'g..d' regular_express.txt

『o*』代表的是:『拥有空字符或一个o以上的字符』

『oo*』则第一个o肯定必须要存在,第二个o则是可有可无的多个

[root@www shell]# grep -n 'oo*' regular_express.txt

『.*』『就代表零个或多个任意字符』

[root@www shell]# grep -n 'g.*g' regular_express.txt =正确=

[root@www shell]# grep -n 'g*g' regular_express.txt =试一试=

找出『任意数字』的行列

[root@www shell]# grep -n '[0-9][0-9]*' regular_express.txt

限定连续 RE 字符范围 {} <==限定范围的字符 {}

/{n,m/} 连续 n 到 m 个的『前一个 RE 字符』

若为 /{n/} 则是连续 n 个的前一个 RE 字符

若是 /{n,/} 则是连续 n 个以上的前一个 RE 字符

找到两个 o 的字符串

[root@www shell]# grep -n 'o/{2/}' regular_express.txt

找出g后面接2到5个o ,然后再接一个g的字符串

[root@www shell]# grep -n 'go/{2,5/}g' regular_express.txt

找出g后面接2个以上的o

[root@www shell]# grep -n 'go/{2,/}g' regular_express.txt

常用的正则匹配:

搜寻行首为 # 开始的那一行

[root@www shell]# grep '^#' regular_express.txt

将行尾为 ! 的那一行打印出来

[root@www shell]# grep '!$' regular_express.txt

搜寻字符串可以是(eve)(eae)(eee)(e e),但不能仅有(ee)亦即e与e中间『一定』仅有一个字符,空格符也是字符

[root@www shell]# grep 'e.e' regular_express.txt

搜寻含有单引号 ' 的那一行

[root@www shell]# grep /' regular_express.txt

[root@www shell]# grep "'" regular_express.txt

找出含有(es)(ess)(esss)等等的字符串

注意,因为 * 可以是0个,所以es也是符合带搜寻字符串。另外,因为*为重复『前一个RE字符』的符号,因此,在 * 之前必须要紧接着一个 RE 字符喔!例如任意字符则为 『.*』

[root@www shell]# grep 'ess*' regular_express.txt

搜寻含有 (gl) 或 (gd) 的那一行

[root@www shell]# grep -n 'g[ld]' regular_express.txt

注:

在通配符当中的 * 代表的是『 0 ~ 无限多个字符』的意思,但是在正则表示法当中, * 则是『重复 0 到无穷多个的前一个 RE 字符』的意思

以 ls -l 配合 grep 找出 /etc/ 底下文件类型为链接文件属性的文件名

[root@www shell]# ls -l /etc/ | grep '^l'

找到含有以 a 为开头的档案,则必须要这样:

[root@www shell]# ls /etc/ | grep '^a.*'

扩展正则:

egrep 的应用

+ :意义:重复『一个或一个以上』的前一个 RE 字符

? :意义:『零个或一个』的前一个 RE 字符

| :意义:用或( or )的方式找出数个字符串

() :意义:找出『群组』字符串

()+ :意义:多个重复群组的判别

搜寻(god)(good)(goood)...等等的字符串

[root@www shell]# egrep -n 'go+d' regular_express.txt

搜寻(gd)(god)这两个字符串

[root@www shell]# egrep -n 'go?d' regular_express.txt

搜寻gd或good这两个字符串

[root@www shell]# egrep -n 'god|good' regular_express.txt

搜寻(glad)或(good)这两个字符串

[root@www shell]# egrep -n 'g(la|oo)d' regular_express.txt

将『AxyzxyzxyzxyzC』用 echo 叫出

[root@www shell]# echo "AxyzxyzxyzxyzC" | egrep 'A(xyz)+C'

格式化打印: printf

[root@www ~]# printf '打印格式' 实际内容

选项与参数:

/a 警告声音输出

/b 退格键(backspace)

/f 清除屏幕 (form feed)

/n 输出新的一行

/r 亦即 Enter 按键

/t 水平的 [tab] 按键

/v 垂直的 [tab] 按键
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: