Linux 正则表达式(*****)

1、什么是正则表达式?

简单的说,正则表达式就是为处理大量的字符串而定义的一套规则和方法


通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。

Linux 正则表达式一般以行为单位处理的。


注意事项:

a、#alias grep='grep --color=auto'  ===>以特定颜色高亮显示匹配关键字

b、注意字符集,LC_ALL=C   #export LC_ALL=C


实战举例:

1)^ word  搜索以 word 开头的。vi ^ 一行的开头

2)word$   搜索以 word 结尾的。vi $ 一行的开头

3)^$         表示空行

4).             有且只能代表任意一个字符

5) \           例 \. 就只代表点本身,转义符号,让有着特殊身份意义的字符,脱掉马甲,还原原型。

6) *           例 o* 重复 0 个或多个前面的一个字符

7).*           匹配所有字符。延伸 ^.*  以任意多个字符开头。 .*$ 以任意多个字符结尾

8)[abc]     匹配字符集合内的任意一个字符 [a-zA-Z],[0-9]

9)[^abc]   匹配不包含 ^ 后的任意字符的内容

10)a\{n,m\}  重复 n 到 m 次,前一个重复的字符。如果用 egrep/sed -r 可以去掉斜线

 \{n,\}   重复至少 n 次,前一个重复的字符。如果用 egrep/sed -r 可以去掉斜线

 \{n\}    重复 n 次,前一个重复的字符。如果用 egrep/sed -r 可以去掉斜线

        \{,m\}   最多 m 次

注意:egrep,grep -E 或 sed -r 过滤一般特殊字符可以不转义


实验数据:

#cd /test/oldboy/

#touch oldboy.log

#vim oldboy.log

I am oldboy teacher!

I teach linux.


I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our site is http://www.etiantian.org

my qq num is 49000448.


not 4900000448.

my god ,i am not oldbey,but OLDBOY!

oldb y

good

goood


#grep "^m" oldboy  ===>过滤出来以 m 开头的行

#grep "m$" oldboy  ===>以 m 结尾的行

#grep -v "^$"  oldboy.log  ===>去掉空行

#grep -vn "^$"  oldboy.log  ===>显示行号

#grep "." oldboy.log  ===> 匹配所有的,但没有空行,匹配任意一个字符

Linux 正则表达式_第1张图片


#grep ".*" oldboy.log  ===> 匹配所有的,包括空行

Linux 正则表达式_第2张图片


#grep "oldb.y" oldboy.log ===> 包含oldb,包含y,它两之间的字符任意

wKiom1f15rDRgNUtAAFd8qt7H3U880.png-wh_50


#grep ".$" oldboy.log ===>以任意字符结尾

Linux 正则表达式_第3张图片


#grep "\.$" oldboy.log  ===>以点结尾

wKioL1f15s_whEahAADztEaRrdM738.png-wh_50


#grep  "0*" oldboy.log ===>匹配最少零个0,全匹配了

Linux 正则表达式_第4张图片


#grep -o "0*" oldboy.log ===> 精确匹配

wKioL1f15uWzfYedAACF84edXVc426.png-wh_50


#grep "[abc]" oldboy.log

Linux 正则表达式_第5张图片


#grep "[^a-z]" oldboy.log ===> a 到 z 的结果不匹配

Linux 正则表达式_第6张图片


#grep "[^0-9]" oldboy.log  ===> 匹配非数字

#grep "0\{3\}" oldboy.log ===> 重复三个0

wKioL1f15wqBrYzRAADKM-ZdXEk459.png-wh_50


#egrep "0{3}" oldboy.log ====> 没有转义字符了,没有颜色是因为egrep没有做别名

wKioL1f15xWgGFBvAADUOPUzPns028.png-wh_50


#grep -E "0{3}" oldboy.log 

#grep -E "0{3,5}" oldboy.log 

Linux 正则表达式_第7张图片

#grep -E "0{3,}" oldboy.log ===>至少三次

#grep -E "0{,3}" oldboy.log ===>最多三次


正则支持 grep、sed、awk

grep 一般常用参数

-a:在二进制文件中,以文本文件的方式搜索数据

-c:计算找到‘搜索字符串’的次数

-o:仅显示出匹配 regexp 的内容(用于统计出现在文中的次数)

-i*****:忽略大小写的不同,所以大小写视为相同

-n*****:在行首显示行号

-v*****:反向选择,即显示没有‘搜索字符串’内容的那一行

-E*****:扩展的 grep,即 egrep

--color=auto:以特定颜色高亮显示匹配关键字

-A:after 的意思,显示匹配字符串及其后 n 行的数据

-B:before 的意思,显示匹配字符串及其前 n 行的数据

-C:显示匹配字符串及其前后各 num 行

提示:-i,-v 为常用参数


后向引用

#echo "oldboy  oldgirl"|sed -r 's#(.*)  (.*)#\1  \2#g'

wKiom1f15zHg74FUAAD41kUB18k587.png-wh_50


取 IP 地址

#ifconfig eth0|sed -n '2p'|sed -r 's#.* addr:##g'|sed -r 's# Bc.*$##g'   或

#ifconfig eth0|sed -n '2p'|sed -r 's#.*dr:(.*) Bc.*#\1#g'   或

#ifconfig eth0|sed -rn '2s#.*dr:(.*)  Bc.*$#\1#gp'

Linux 正则表达式_第8张图片


扩展的正则表达式:ERE(主要用于 egrep 或者 grep  -E)

1) +  重复一个或一个以上前面的字符;(* 是 0 或多个)

2) ? 重复 0 个或一个 前面的字符

3) |   用或的方式查找多个符合的字符串

4) ()  找出“用户组”字符串

5) \b  匹配单词的边界

6) \w 匹配任意一个字符和数字

7) \W 匹配非字符与数字


例子:

\b  匹配单词的边界

# grep "oldboy" oldboy.log

# grep "\boldboy\b" oldboy.log

Linux 正则表达式_第9张图片


\w 匹配任意一个字符和数字     \W 匹配非字符与数字

# grep "\w" oldboy.log 

# grep "\W" oldboy.log 

Linux 正则表达式_第10张图片


+ 一个或多个

#grep -Eo "g+d" oldboy.log  ===> 重复g;gd 、ggd ...

#grep -Eo "go+d" oldboy.log ===> 重复o;god 、good ...

#egrep -o "go+d" oldboy.log ===> 没有颜色

#grep -o "go+d" oldboy.log ===> 没有;因为 + 不适合 grep

#grep -Eo "g?d" oldboy.log ===> 1个g或没有;gd、d

#grep -Eo "go?d" oldboy.log ====> 1个o或没有;god 、gd


| 表示同时过滤多个字符串

#egrep "god|good" oldboy.log

#grep -E "g?d|good" oldboy.log

#grep -E "g(la|oo)d" oldboy.log 

Linux 正则表达式_第11张图片

Linux 正则表达式_第12张图片

Linux 正则表达式_第13张图片


#touch {a,b,c}.log

# ll *.log

# ll ?.log

# ll oldbo?.log  

# ll ??????.log

# touch log.{1..3}

# touch log.{4,5,6}

Linux 正则表达式_第14张图片


# echo date

# echo `date`

# echo 'date'

# echo "date"

# a=oldboy    # echo "$a"    # echo '$a'   

# ech && echo 1

# echo && echo 1

# ech || echo 1

# echo || echo1

# ech 2>/dev/null || echo 1

Linux 正则表达式_第15张图片


做题:

1、取 stat /etc/hosts 里 644

2、取 ifconfig eth0 HWADDR


解答

1、取 stat /etc/hosts 里 644

解法一:

# stat /etc/hosts

  File: "/etc/hosts"

  Size: 95              Blocks: 8          IO Block: 4096   普通文件

Device: fd00h/64768d    Inode: 1441820     Links: 2

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2016-09-19 22:20:01.383437447 +0800

Modify: 2016-09-06 00:31:11.958161872 +0800

Change: 2016-09-06 00:31:11.995163159 +0800


# stat /etc/hosts|sed -n '4p'

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

# stat /etc/hosts|sed -n '4p'|awk -F "[0/]" '{print $2}'

644


解法二:

# stat /etc/hosts|awk -F '[0/]' 'NR==4 {print $2}'

解法三:

# stat /etc/hosts|sed -nr '4s#^.*\(0(.*)/-.*$#\1#gp'

解法四:

# stat -c %a /etc/hosts

解法五:

#ll a.log|cut -c 2-10|tr rwx- 4210 |awk -F "" '{print $1+$2+$3 $4+$5+$6 $7+$8+$9}'

wKioL1f15-HAo8x8AAAhhODdcOE113.png-wh_50


2、取 ifconfig eth0 HWADDR

# ifconfig eth0|sed -nr '2s#^.*dr:(.*) Bca.*$#\1#gp'

Linux 正则表达式_第16张图片