命令记不住

登陆

Linux 正则表达式

Linux正则表达式

1.三剑客正则表达式

1.正则表达式的分类
基础正则表达式
扩展正则表达式
2.正则与通配符的区别
通配符 查找文件 支持的命令,linux大部分命令都支持,以txt结尾的文件
正则 作用在文件中过滤 支持的命令: 三剑客sed grep awk
3.使用正则表达式注意事项
正则表达式按照行为单位处理
正则神坑-中文符号

grep/egrep      alias  egrep=’egrep  --color=auto’

2.基础正则

第一个符号 ^ 以什么什么开头行
第二个符号 $ 以什么什么结尾的行
第三个符号 ^$ 空行 什么符号都没有
第四个符号 . 任意一个字符 不显示空行
第五个符号 \ 转移字符
第六个符号 * 前一个字符连续出现了0或0次以上
第七个符号 .* 贪婪性 所有 任何符号 包含空行
第八个符号 [][abc] 相当于是一个符号(每次匹配一个字符),找出包含a或b或c
第九个符号 [^][^abc] 相当于是一个符号(每次匹配1个字符),找出除了a或除了b或除了c

3.扩展正则

第10个符号 + 前一个字符出现1次或者1次以上
第11个符号 | 或者
第12个符号 () 表示一个整体 反向引用/后向引用 --先保护后使用
第13个符号 {} 0{m,n} 前一个符号至少出现m次,最多出现n次
第14个符号 ? 前一个符号出现0次或者1次 --前一个符号有或者没有
ERE

1.+ 一般与[]进行配合,把各种连续的东西取出来
2.| 或
3.()  一个整体  后项引用sed
4.{}      0{m,n}    前一个符号至少出现m次,最多出现n次
5.? 前一个符号出现0次或者1次  --前一个符号有或者没有

4.正则总结

正则认为[ ]中括号里面是一样的
后向引用,先保护后使用.
花括号
正则表达式
1.正则符号

^
$
^$
.  任意一个字符 
.* 所有 
*  前一个字符连续出现了0次或0次以上 >=0  
[] [abc]  中括号相当于是一个字符 
[a-z] [A-Z] [0-9]
grep '[a-Z]'

2./etc/ssh/sshd_config 排除 文件中的#和空行

egrep -v '^$|^#' /etc/ssh/sshd_config
grep '^[a-Z]' /etc/ssh/sshd_config

3.dumpe2fs /dev/sda3 过滤出 包含inode size 和inode count的行

[root@cloud /oldboy]# dumpe2fs  /dev/sda3 |egrep  'inode (size|count)' -i
dumpe2fs 1.41.12 (17-May-2010)
Inode count:              1234576
Inode size:           256

4.反向引用/后向引用
先保护起来,然后在使用

[root@cloud /oldboy]# echo '123456' |sed -r 's#(.*)#\1#g'
123456
[root@cloud /oldboy]# echo '123456' |sed -r 's#(.*)#<\1#g'
<123456
[root@cloud /oldboy]# echo '123456' |sed -r 's#(.*)#<\1>#g'
<123456>
echo '123456'
12<34>56
[root@cloud /oldboy]# echo '123456' |sed -r 's#(..)(..)(..)#\1<\2>\3#g'
12<34>56
[root@cloud /oldboy]# echo '123456' |sed -r 's#(..)(..)(..)#\3<\2>\1#g'
56<34>12

5.花括号
0{n,m} 前一个字符至少连续出现n次,最多连续出现了m次

*  >=0 
+  >=1 
egrep '[0-9]{17}[0-9X]' id.txt 
egrep '[0-9]{18}|[0-9]{17}[X]' id.txt 
egrep -v '^(#.*)?$' /etc/ssh/sshd_config
^$            空行
(#.*)?
^(#.*)?$   
1.当?表示0次的时候  相当于是 ^$
2.当?表示1次的时候  相当于是 ^(#.*)$ 

创建测试文件:

echo -e 'oldboy\n\noldboy alex\n \nlidao \n\n\nend'>lidao.txt
排除文件中的空行和连续空格的行

egrep -v '^$|^ +$' lidao.txt 
^[a-Z]
^[ ]*$
0     ^$
>=1   ^[ ]+$

5.取出网卡的ip地址

方法1 - sed

[root@cloud ~]# ip a s eth0 |sed -n 3p 
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@cloud ~]# ip a s eth0 |sed -n 3p |sed 's#^.*t ##g'
10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@cloud ~]# ip a s eth0 |sed -n 3p |sed 's#^.*t ##g'|sed 's#/.*$##g'
10.0.0.200

方法2 - sed

[root@cloud ~]# ip a s eth0 |sed -n 3p |sed -r 's#^.*t |/.*$##g'
10.0.0.200

方法3 - sed 后向引用

[root@cloud ~]# ip a s eth0 |sed -n 3p 
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@cloud ~]# ip a s eth0 |sed -n 3p |sed -r 's#(^.*t )(.*)(/.*$)#\2#g'
10.0.0.200
[root@cloud ~]# ip a s eth0 |sed -n 3p |sed -r 's#^.*t (.*)/.*$#\1#g'
10.0.0.200

方法4 - awk

[root@cloud ~]# ip a s eth0|awk 'NR==3' |awk -F"[ /]+"  '{print $3}'
10.0.0.200
[root@cloud ~]# ip a s eth0|awk 'NR==3' |grep '[ /]'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@cloud ~]# ip a s eth0|awk 'NR==3' |egrep '[ /]+'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@cloud ~]# ip a s eth0|awk 'NR==3' |egrep '[ /]+' -o

6.取出ifconfig eth0 的ip地址和子网掩码

[root@cloud ~]# ifconfig eth0|awk 'NR==2'|awk -F"[ :]+"   '{print $4,$NF}'
10.0.0.200 255.255.255.0

方法 5

awk  '条件{动作}'
NR==3
NR>3
$3>1 
print 打印
[root@cloud ~]# ip a s eth0 |awk 'NR==3{print $2}'
10.0.0.200/24

[root@cloud ~]# ip a s eth0 |awk -F"[ /]+"   'NR==3{print $3}'
10.0.0.200
[root@cloud ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:06:12:31  
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe06:1231/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:17020 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19800 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:5216059 (4.9 MiB)  TX bytes:16701928 (15.9 MiB)

[root@cloud ~]# ifconfig eth0|awk -F "[ :]+"  'NR==2{print $4}'
10.0.0.200
[root@cloud ~]# ifconfig eth0|awk -F "addr:|  Bcast"  'NR==2{print $2}'
10.0.0.200

7.取出网卡ip地址

1.sed反向引用 先保护在使用
2.awk指定分隔符

[root@cloud ~]# ip a s eth0 |sed -n '3s#inet#oldboy#gp'
    oldboy 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@cloud ~]# ip a s eth0 |sed -nr '3s#^.*t (.*)/.*$#\1#gp'
10.0.0.200
[root@cloud ~]# ifconfig eth0|sed -n 2p |sed -r 's#(^.*dr:)(.*)(  Bc.*:)(.*$)#\2 \4#g'
10.0.0.200 255.255.255.0
[root@cloud ~]# ifconfig eth0|sed -n 2p |sed -r 's#^.*dr:(.*)  Bc.*:(.*$)#\1 \2#g'
10.0.0.200 255.255.255.0
[root@cloud ~]# ifconfig eth0|sed -nr '2s#^.*dr:(.*)  Bc.*:(.*$)#\1 \2#gp'
10.0.0.200 255.255.255.0