正则表达式应用

 

作者:左婷婷

归档:学习笔记

2018/8/2

 

快捷键:

Ctrl + 1    标题1

Ctrl + 2    标题2

Ctrl + 3    标题3

Ctrl + 4    实例

Ctrl + 5    程序代码

Ctrl + 6    正文

格式说明:

蓝色字体:注释

×××背景:重要

绿色背景:注意


 

老男孩教育教学核心思想6重:重目标、重思路、重方法、重实践、重习惯、重总结

学无止境,老男孩教育成就你人生的起点!

联系方式:

网站运维QQ交流群:

Linux  385168604

架构师 390642196

Python 29215534

大数据 421358633

官方网站:

http://www.oldboyedu.com


 

1.1 取出IP地址... 1

1.1.1  Hostname -I 1

1.1.2 取出ifconfigIP地址... 1

1.1.3 取出ip a s  eth0IP地址... 2

1.2 取出文件权限... 3

1.2.1 方法一 awk. 3

1.2.2 方法二 sed后向引用... 3

1.2.3 方法三 stat -c. 3

1.3 过滤空行和过滤前两行... 4

1.3.1 三剑客已经认识的功能... 4

1.3.2 过滤空行... 4

1.3.3 使用正则过滤前两行... 5

1.4 关于硬链接... 5

1.5 显示说设置系统时间... 6

1.5.1 按照要求的格式显示日期... 6

1.5.2 根据你的描述显示指定日期... 7

1.5.3 修改时间... 7

1.5.4 自动同步系统时间... 7

 

 

 

 

 

 

 

 

 

 

 


1.1 取出IP地址

1.1.1 Hostname -I

hostname -I 该命令可以直接取出IP地址 但是取出的是所有的网卡的IP地址

所以一般配合管道过滤使用(最简单)

所有网卡的ip地址

[root@oldboyedu50-lnb ~]# hostname -I    该处只有一块网卡 所以只显示了一个IP地址

10.0.0.200

1.1.2 取出ifconfigIP地址

[root@oldboyedu50-lnb ~]# ifconfig eth0    先查看内容

eth0      Link encap:Ethernet  HWaddr 00:0C:29:59:D4:13 

          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe59:d413/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:50928 errors:0 dropped:0 overruns:0 frame:0

          TX packets:25105 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:60628583 (57.8 MiB)  TX bytes:11673902 (11.1 MiB)

1.1.2.1  方法一 awk

awk '条件{动作}'

条件  NR==3   NR>=3 找出哪一行

动作  命令 print

[root@oldboyedu50-lnb ~]# ifconfig eth0 |awk 'NR==2{print $2}'   NR==2和{}一起使用

[root@oldboyedu50-lnb ~]# ifconfig eth0 |awk -F'[: ]+' 'NR==2{print $4}'  执行 取出

10.0.0.200

1.1.2.2  方法二 sed 反向引用

[root@oldboyedu-50 oldboy]# ifconfig eth0|sed -n 2p|sed -r 's#^.*r:(.*)  B.*$#\1#g'

反向引用就是将需要的内容用()保护起来 然后通过\1输出

10.0.0.200

[root@oldboyedu-50 oldboy]# ifconfig eth0|sed -nr '2s#^.*r:(.*)  B.*$#\1#gp'

简化 将sed -n 2p加到后面的内容中

10.0.0.200

1.1.2.3  方法三 sed 替换

sed命令,将不需要显示的,逐步替换

[root@oldboyedu50-lnb ~]# ifconfig eth0|sed -n '2p'|sed 's#^.*dr:##g'|sed 's# .*$##g'

替换掉ip地址之前和之后的内容

10.0.0.200

1.1.2.4  方法四 sed [^0-9.]

使用[^ ]0-9.之外的替换成空格,再使用awk取出第一列

[root@znix ~]# ifconfig eth0|sed -n '2s#[^0-9.]# #gp'|awk '{print $1}'

使用[^ 0-9.]把0-9.之外的替换成空格,再使用awk取出第一列

10.0.0.200

1.1.3 取出ip a s eth0IP地址

1.1.3.1  方法一 awk

[root@oldboyedu50-lnb ~]# ip a s eth0 |awk   -F'[ /]+'  'NR==3{print $3}' 以空格和\分割取列

10.0.0.200

1.1.3.2  方法二 sed |(或者)

[root@oldboyedu50-lnb ~]# ip a s eth0 |sed -n 3p    

[root@oldboyedu50-lnb ~]# ip a s eth0 |sed -n 3p |sed 's#^.*t ##g'  把ip地址前面的内容替换掉

[root@oldboyedu50-lnb ~]# ip a s eth0 |sed -n 3p |sed 's#^.*t ##g'|sed 's#/.*$##g'把ip后面的替换掉

10.0.0.200

 [root@oldboyedu50-lnb ~]# ip a s eth0 |sed -n 3p |sed -r 's#^.*t |/.*$##g'先取行再替换

10.0.0.200

[root@oldboyedu50-lnb ~]# ip a s eth0 | sed -nr '3s#^.*t |/.*$##gp'  最简化版

10.0.0.200

1.1.3.3  方法三 sed 后向引用

sed -n 3p |sed -r 's#^.*t (.*)/.*$#\1#g'

可以简化为

sed -nr 's#^.*t (.*)/.*$#\1#gp'

在前面先保护(你想要的内容),在后面通过\数字使用

 [root@oldboyedu50-lnb ~]# ip a s eth0 |sed -n 3p          先取行

    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0

[root@oldboyedu50-lnb ~]# ip a s eth0 |sed -n 3p |sed -r 's#^.*t (.*)/.*$#\1#g' 

10.0.0.200

1.1.3.4  方法四 egrep(了解)

只通过正则表达式取出ip

[root@oldboyedu50-lnb ~]# ip a s eth0 |egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0

[root@oldboyedu50-lnb ~]# ip a s eth0 |egrep '([0-9]{1,3}\.){3}[0-9]{1,3}'

    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0

[root@oldboyedu50-lnb ~]# ip a s eth0 |egrep '([0-9]{1,3}\.?){4}'

2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0

1.2 取出文件权限

取出stat /etc/hosts 文件权限 644 0644

1.2.1 方法一 awk

 [root@oldboyedu50-lnb ~]# stat /etc/hosts |awk 'NR==4'

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

[root@oldboyedu50-lnb ~]# stat /etc/hosts |awk 'NR==4'|awk -F'[(/]'   '{print $2}'

NR表示行数  使用-F  指定分隔符 然后取出权限

0644

[root@oldboyedu50-lnb ~]# stat /etc/hosts |awk -F'[(/]'   'NR==4{print $2}'  优化

0644

1.2.2 方法二 sed后向引用

 [root@oldboyedu50-lnb ~]# stat /etc/hosts |sed -n 4p |sed -r 's#(^.*\()([0-9]+)(/.*$)#\1#g'

Access: (

[root@oldboyedu50-lnb ~]# stat /etc/hosts |sed -n 4p |sed -r 's#(^.*\()([0-9]+)(/.*$)#\2#g'

0644                        使用()保护 最后使用\2显示出来

[root@oldboyedu50-lnb ~]# stat /etc/hosts |sed -n 4p |sed -r 's#^.*\(([0-9]+)/.*$#\1#g'

0644

1.2.3 方法三 stat -c

stat -c%a直接取权限数字

有问题一定要man以下

[root@oldboyedu50-lnb ~]# stat -c%a /etc/hosts            取权限数字

644

1.3 过滤空行和过滤前两行

1.3.1 三剑客已经认识的功能

grep

过滤  显示执行过程 加上颜色

sed

过滤  替换 修改文件内容   取行

awk

过滤  取列(-F    计算 统计

1.3.2 过滤空行

已知/oldboy/test.txt文件内容为:

oldboy

 

xizi

 

xiaochao

请问如何把文件中的空行过滤掉(要求命令行实现)。

通过三剑客进行过滤

1.3.2.1  方法一 grep

 [root@oldboyedu50-lnb /oldboy]# grep -v '^$' test.txt        直接-v过滤空行

oldboy

xizi

xiaochao

1.3.2.2  方法二 sed

1.3.2.3  sed + d的用法

[root@oldboyedu50-lnb /oldboy]# sed '/^$/d' test.txt    d====delete 按照行位单位

oldboy

xizi

xiaochao

sed + !的用法

 [root@oldboyedu50-lnb /oldboy]# sed -n  '/^$/!p' test.txt   !p   不显示 

oldboy

xizi

xiaochao

1.3.2.4  方法三 awk

 [root@oldboyedu50-lnb /oldboy]# awk '!/^$/' test.txt     !取反

oldboy

xizi

xiaochao

1.3.3 使用正则过滤前两行

已知/oldboy/ett.txt文件内容为:

oldboy

olldboooy

test

请使用grepegrep正则匹配的方式过滤出前两行内容

1.3.3.1  方法一 egrep

直接过滤oldbo无法完成题目  使用+ (前一个字符出现1次或一次以上)

[root@oldboyedu50-lnb /oldboy]# egrep 'oldboy' ett.txt

oldboy

[root@oldboyedu50-lnb /oldboy]# egrep 'ol+dbo+y' ett.txt 

oldboy

olldboooy

1.3.3.2  方法二 sed

 [root@oldboyedu50-lnb /oldboy]# sed -nr '/ol+dbo+y/p'  ett.txt

oldboy

olldboooy

1.3.3.3  方法三 awk

[root@oldboyedu50-lnb /oldboy]# awk '/ol+dbo+y/' ett.txt

oldboy

olldboooy

1.4 关于硬链接

新目录的硬链接数为2

目录下的硬链接数为 2+下级目录数

ett目录为例  ett本身是一个硬链接  ett/.是一个硬链接  如果下面没有目录只有文件那硬链接数为2

如果还有下层目录 那么就多一个连接  ett/ett/..

所以硬连接数为2+下级目录数

linux下通过mkdir命令创建一个新目录/oldboy/ettett的硬链接数是多少,为什么?

[root@oldboyedu50-lnb /oldboy]# mkdir -p /oldboy/ett

[root@oldboyedu50-lnb /oldboy]# ll -d ett

drwxr-xr-x 2 root root 4096 Jul 20 02:01 ett                硬连接数为2

[root@oldboyedu50-lnb /oldboy]# ll -di ett ett/.           

1046554 drwxr-xr-x 2 root root 4096 Jul 20 02:01 ett

1046554 drwxr-xr-x 2 root root 4096 Jul 20 02:01 ett/.

mkdir -p /oldboy/ett/oldboy

ett目录的硬连接数是?

 [root@oldboyedu50-lnb /oldboy]# ll -d ett

drwxr-xr-x 3 root root 4096 Jul 20 02:05 ett

[root@oldboyedu50-lnb /oldboy]# ll -di ett ett/. ett/oldboy/..

1046554 drwxr-xr-x 3 root root 4096 Jul 20 02:05 ett

1046554 drwxr-xr-x 3 root root 4096 Jul 20 02:05 ett/.

1046554 drwxr-xr-x 3 root root 4096 Jul 20 02:05 ett/oldboy/..

1.5 显示说设置系统时间

1.5.1 按照要求的格式显示日期

%F===%Y-%m-%d     %F  %Y-%m-%d    --

2018-08-01

按照要求的格式显示日期

[root@oldboyedu50-lnb /oldboy]# date +%F

2018-07-20

[root@oldboyedu50-lnb /oldboy]# date +%Y-%m-%d

2018-07-20

%T===%H:%M:%S    %T  %H:%M:%S    ::

[root@oldboyedu50-lnb /oldboy]# date +%T

02:29:22

[root@oldboyedu50-lnb /oldboy]# date +%H:%M:%S

02:29:46

%w              周几

[root@oldboyedu50-lnb /oldboy]# date +%w

5

1.5.2 根据你的描述显示指定日期

-d    '-7day'  7天之前

-d    '7day'   7天之后

-d '  '+7day'  7天之后

1.5.3 修改时间

date -s 命令,手动设置命令,

 [root@znix ~]# date -s "20170101 11:41:00"

Sun Jan  1 11:41:00 CST 2017

1.5.4 自动同步系统时间

ntpdate 联网同步主机时间。

[root@znix ~]# ntpdate  ntp1.aliyun.com

 4 Sep 15:17:22 ntpdate[11593]: step time server 182.92.12.11 offset 27.049824 sec