正则表达式应用 |
作者:左婷婷 归档:学习笔记 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 Hostname -I
1.1.2 取出ifconfig的IP地址
1.1.3 取出ip a s eth0的IP地址
1.2 取出文件权限
1.2.1 方法一 awk
1.2.2 方法二 sed后向引用
1.2.3 方法三 stat -c
1.3 过滤空行和过滤前两行
1.3.1 三剑客已经认识的功能
1.3.2 过滤空行
1.3.3 使用正则过滤前两行
1.4 关于硬链接
1.5 显示说设置系统时间
1.5.1 按照要求的格式显示日期
1.5.2 根据你的描述显示指定日期
1.5.3 修改时间
1.5.4 自动同步系统时间
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 取出ifconfig的IP地址
[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 eth0的IP地址
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:
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
请使用grep或egrep正则匹配的方式过滤出前两行内容
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/ett,ett的硬链接数是多少,为什么?
[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