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 ===> 匹配所有的,但没有空行,匹配任意一个字符
#grep ".*" oldboy.log ===> 匹配所有的,包括空行
#grep "oldb.y" oldboy.log ===> 包含oldb,包含y,它两之间的字符任意
#grep ".$" oldboy.log ===>以任意字符结尾
#grep "\.$" oldboy.log ===>以点结尾
#grep "0*" oldboy.log ===>匹配最少零个0,全匹配了
#grep -o "0*" oldboy.log ===> 精确匹配
#grep "[abc]" oldboy.log
#grep "[^a-z]" oldboy.log ===> a 到 z 的结果不匹配
#grep "[^0-9]" oldboy.log ===> 匹配非数字
#grep "0\{3\}" oldboy.log ===> 重复三个0
#egrep "0{3}" oldboy.log ====> 没有转义字符了,没有颜色是因为egrep没有做别名
#grep -E "0{3}" oldboy.log
#grep -E "0{3,5}" oldboy.log
#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'
取 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'
扩展的正则表达式: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
\w 匹配任意一个字符和数字 \W 匹配非字符与数字
# grep "\w" oldboy.log
# grep "\W" oldboy.log
+ 一个或多个
#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
#touch {a,b,c}.log
# ll *.log
# ll ?.log
# ll oldbo?.log
# ll ??????.log
# touch log.{1..3}
# touch log.{4,5,6}
# 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
做题:
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}'
2、取 ifconfig eth0 HWADDR
# ifconfig eth0|sed -nr '2s#^.*dr:(.*) Bca.*$#\1#gp'