Day 18 正则表达式与取出ip地址
1.1 通配符VS正则 (区分)
通配符:找出文件名 大部分命令可以使用
正则:精确地过滤 三剑客使用
1.2 正则表达式(Regular Express RE)
1.2.1 基础正则(BRE Basic Regular Expression)
^ 以….开头
$ 以….结尾
^$ 空行 什么符号都没有
. 任意一个字符
* 前一个字符连续出现了0次或0次以上
.* 所有 任何字符 包含空行
[ ] [abc] a或b或c (范围是一个字母)
[^] [^] [^abc]排除a或b或c
1.2.2 扩展正则(ERE Extented Regular Expression)
+ 前一个字符出现1次或1次以上(一般与[ ]进行配合 把各种连续的东西取出来)
| 或者
( ) 表示一个整体 反向引用/后向引用-sed
{ } 0{n,m} 前一个字符至少连续出现了n次,最多连续出现m次
? 前一个字符连续出现0次或1次
正则表达式 坑-2- [oldboy]
[root@oldboyedu50-lnb /oldboy]# grep '[oldboy]' oldboy.txt
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 size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu50-lnb /oldboy]# grep -o '[oldboy]' oldboy.txt
o
l
d
b
o
y
l
l
b
1.2.3 找出oldboy.txt中以m或n开头的行
[root@oldboyedu50-lnb /oldboy]# grep '^[mn]' oldboy.txt
my blog is http://oldboy.blog.51cto.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
1.2.4 找出oldboy.txt中以m或n开头并且以m或n结尾的行
[root@CJY /oldboy]#grep '^[mn]' oldboy.txt |grep '[mn]$'
my blog is http://oldboy.blog.51cto.com
grep '^[mn].*[mn] $' oldboy.txt
1.3 第九个符号 [^] [^abc]排除a或b或c
1.3.1 排除abc
[root@CJY /oldboy]#grep '[^abc] ' oldboy.txt
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 size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
1.3.2 排除文件中的数字或大小写字母
[root@CJY /oldboy]#grep '[^0-9a-Z]' oldboy.txt
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 size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
2.1扩展正则(ERE Extented Regular Expression)
2.2第十个符号 + 前一个字符出现1次或1次以上(一般与[ ]进行配合 把各种连续的东西取出来)
[root@CJY /oldboy]#grep -E '0+' oldboy.txt
my qq is 49000448
not 4900000448.
[root@CJY /oldboy]#egrep '0+' oldboy.txt
my qq is 49000448
not 4900000448.
[root@CJY /oldboy]#grep '0\+' oldboy.txt
my qq is 49000448
not 4900000448.
2.2.1取出连续出现的小写字母
[root@CJY /oldboy]#grep -E '[a-z]+' oldboy.txt
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 size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
2.3第11个符号 | 或者
[root@CJY /oldboy]#egrep 'oldboy|linux' oldboy.txt
I am oldboy teacher!
I teach linux.
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
2.3.1先备份 /etc/ssh/sshd_config然后排除文件中的#的行和空格行
[root@CJY /oldboy]#cp /etc/ssh/sshd_config {,.bak.20180801}
[root@CJY /oldboy]#ll /etc/ssh/sshd_config*
[root@CJY /oldboy]#egrep -v '^#|^$' sshd_config
Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
2.4正则表达式 坑3 [^#^$](排除#^$) [^$] [^#$]
[ ]中的$ . 没有特殊含义
2.5正则表达式 坑4 [^abc](排除a或b或c) vs grep –v(取反)
[^a-z] 排除按某个字符
grep –v 排除按行
2.6第12个符号 ( ) 表示一个整体 反向引用/后向引用-sed
[root@CJY /oldboy]#egrep 'oldb(o|e)y' oldboy.txt 整体
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my god ,i am not oldbey,but OLDBOY!
2.6.1反向引用/后向引用
思路:把你想要的保护起来
sed 在’s###g’后面两个引号之间使用 \数字 引用
echo 123456 显示12<34>56
[root@CJY /oldboy]#echo 123456|sed -r 's#(34)#<\1>#g'
12<34>56
2.7第13个符号 { } 0{n,m} 前一个字符至少连续出现了n次,最多连续出现m次
a{n,m}前一个数字连续出现至少n次最多m次
a{n}前一个数字连续出现n次
a{n,}前一个数字连续出现至少n次
a{,m}前一个数字连续出现最多m次
[root@oldboyedu50-lnb /oldboy]# egrep '0{3,4}' oldboy.txt 过滤出0至少出现三次,最多出现4次
my qq is 49000448
not 4900000448.
[root@oldboyedu50-lnb /oldboy]# egrep '0{3}' oldboy.txt 过滤出0只出现三次
my qq is 49000448
not 4900000448.
某一行的某一部分
1. 定位 取出某一行
2. sed/awk 取出想要的内容
×××例题
任 3oldboy
任 lidao97303136098
任 alex2197303136098
任 350182197303oldgir
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X
金 211324198705244720
万 500224197105168312
任 1231231231oldboy
提取×××号码
[root@oldboyedu50 oldboy]# egrep '[0-9X]{18}' id.txt
金 211324198705244720
万 500224197105168312
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X
2.8第14个符号 ? 前一个字符连续出现0次或1次 前一个字符有或没有
2.9小结:
2.9.1 按照功能划分
基本 ^ 以….开头
$ 以….结尾
^$ 空行 什么符号都没有
. 任意一个字符
\ 撬棍 转义字符
[ ] [abc] a或b或c (范围是一个字母)
[^] [^] [^abc]排除a或b或c
| 或者
( ) 表示一个整体 反向引用/后向引用-sed
表示重复连续出现
* 前一个字符连续出现了0次或0次以上
? 前一个字符连续出现0次或1次 前一个字符有或没有
{ } 0{n,m} 前一个字符至少连续出现了n次,最多连续出现m次
+ 前一个字符出现1次或1次以上(一般与[ ]进行配合 把各种连续的东西取出来)
正则学习资料
man sed/grep/awk
info grep/sed/awk
2.9.2取出网卡的ip地址
[root@CJY /oldboy]#ip a s eth0(ip address show eth0)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:76:99:0d brd ff:ff:ff:ff:ff:ff
inet 10.0.0.203/24 brd 10.0.0.255 scope global eth0
inet6 fe80::20c:29ff:fe76:990d/64 scope link
valid_lft forever preferred_lft forever
[root@CJY /oldboy]#ip a s eth0|awk 'NR==3'|sed 's#^.*net##g'|sed 's#/2.*##g'
10.0.0.203 方法一
[root@CJY /oldboy]#ip a s eth0 |awk 'NR==3' |awk -F"[ /]+" '{print $3}'
10.0.0.203 方法二
2.9.3取出ifconfig eth0 ip地址和子网掩码
[root@CJY /oldboy]#ifconfig eth0 |awk 'NR==2' |awk -F"[: ]+" '{print$4,$NF}'
10.0.0.203 255.255.255.0 方法一
[root@CJY /oldboy]#ifconfig eth0 |awk 'NR==2' |awk -F"addr:|Mask:|Bcast:" '{print $2,$NF}' 方法二
255.255.255.0
2.9.4小结:
1. 取出ip地址
2. Awk方法 –F(指定分隔符)
3.1总结:
1. 正则 BRE ERE
2. 排除文件空行或以#开头的行 grep sed awk
3. 取出网卡的ip地址
ip a
ifconfig eth0
转载于:https://blog.51cto.com/13859649/2153227