Day 19 正则与取出ip地址
第1章 例题
1.1 第三行的inet替换为oldboy
[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 's#inet#oldboy#g'
(ip a s eth0 |sed -n '3s#inet#oldboy#gp'由上条命令合并)
oldboy 10.0.0.200/24 brd 10.0.0.255 scope global eth0
1.2 取出stat /etc/hosts 文件权限644 0644
[root@uegame ~]# stat /etc/hosts|sed -n '4p'|sed -r 's#^.*\(0(.*)/-.*$#\1#g' 方法一
644
[root@uegame ~]# stat /etc/hosts|sed -nr '4s#^.* \((.*)/-.*$#\1#gp' 方法二
0644
[root@uegame ~]# stat /etc/hosts|awk 'NR==4'|awk -F '[(/]+' '{print $2}' 方法三
0644
[root@uegame ~]# stat /etc/hosts|awk -F '[(/]+' 'NR==4{print $2}' 方法四
0644
[root@uegame ~]# stat -c%a /etc/hosts
644
1.3 已知/oldboy/ett.txt文件内容为
Oldboy
Olldboooy
Test
用grep/egrep过滤出前两行
[root@uegame /oldboy]# grep '^o' ett.txt
oldboy
olldboooy
[root@uegame /oldboy]# sed -n '1,2p' ett.txt
oldboy
olldboooy
[root@uegame /oldboy]# awk 'NR==1,NR==2' ett.txt
oldboy
olldboooy
[root@uegame /oldboy]# egrep 'ol+dbo+y' ett.txt
oldboy
olldboooy
sed方法
[root@uegame /oldboy]# sed -nr '/ol+dbo+y/p' ett.txt
oldboy
olldboooy
awk方法
[root@uegame /oldboy]# awk '/ol+dbo+y/' ett.txt
oldboy
olldboooy
1.4 三剑客进行过滤空行
创建test.txt 内容如下:排除空行
cat /oldboy/test.txt
oldboy
xizi
xiaochao
[root@uegame /oldboy]# sed '/^$/d' test.txt
oldboy
xizi
xiaochao
!取反,不显示
[root@uegame /oldboy]# sed -n '/^$/!p' test.txt
oldboy
xizi
xiaochao
[root@uegame /oldboy]# awk '!/^$/' test.txt
oldboy
xizi
xiaochao
[root@uegame /oldboy]# grep '.' test.txt
oldboy
xizi
xiaochao
[root@uegame /oldboy]# grep -v '^$' test.txt
oldboy
xizi
xiaochao
[root@uegame /oldboy]# grep '[a-z]' test.txt
oldboy
xizi
xiaochao
1.5 三剑客关于过滤功能的区别
grep 过滤 显示执行的过程(-o) 加上颜色
sed 过滤 替换 修改文件内容 取行
awk 过滤 取列 (指定分隔符-F) 计算 统计
1.6 取出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.6.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.6.2 方法二 sed 反向引用
[root@oldboyedu-50 oldboy]# ifconfig eth0|sed -n 2p|sed -r 's#^.*r:(.*) B.*$#\1#g'
反向引用就是将需要的内容用()保护起来 最后输出
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.6.3 方法三 sed 替换
用sed命令,将不需要显示的,逐步替换
[root@oldboyedu50-lnb ~]# ifconfig eth0|sed -n '2p'|sed 's#^.*dr:##g'|sed 's# .*$##g'
10.0.0.200
1.6.4 方法四 sed [^0-9.]
使用[^ ]把0-9.之外的替换成空格,再使用awk取出第一列
[root@znix ~]# ifconfig eth0|sed -n '2s#[^0-9.]# #gp'|awk '{print $1}'
10.0.0.200
1.7 取出ip a s eth0的IP地址
取ifconfig和取ip a s eth0的方法是互通的
1.7.1 方法一 awk
[root@oldboyedu50-lnb ~]# ip a s eth0 |awk -F'[ /]+' 'NR==3{print $3}'
10.0.0.200
1.7.2 方法二 sed |(或者)
[root@oldboyedu50-lnb ~]# ip a s eth0 |sed -n 3p
把ip地址前面的内容替换掉
[root@oldboyedu50-lnb ~]# ip a s eth0 |sed -n 3p |sed 's#^.*t ##g'
10.0.0.200/24 brd 10.0.0.255 scope global eth0
把ip地址之后的替换掉
[root@oldboyedu50-lnb ~]# ip a s eth0 |sed -n 3p |sed 's#^.*t ##g'|sed 's#/.*$##g'
10.0.0.200
逐步优化 使用2个sed
[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.7.3 方法三 sed 后向引用
sed -n 3p |sed -r 's#^.*t (.*)/.*$#\1#g'
可以简化为
sed -nr 's#^.*t (.*)/.*$#\1#gp'
在前面先保护(你想要的内容),在后面通过\数字使用
第三行的inet替换为oldboy
[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 's#inet#oldboy#g'
oldboy 10.0.0.200/24 brd 10.0.0.255 scope global eth0
ip a s eth0 |sed -n 3p|sed 's#inet#oldboy#g'
#第三行的inet替换为oldboy
ip a s eth0 |sed -n '3s#inet#oldboy#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.7.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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
第2章 目录的硬链接数量
2.1 etc目录的硬链接数是?
创建一个ett ett硬链接数为2(本身是一个硬链接,点)
mkdir -p /oldboy/ett
[root@uegame /oldboy]# ll -d ett
drwxr-xr-x 2 root root 4096 May 21 14:48 ett
[root@uegame /oldboy]# ll -di ett ett/.
523284 drwxr-xr-x 2 root root 4096 May 21 14:48 ett
523284 drwxr-xr-x 2 root root 4096 May 21 14:48 ett/.
再创建一个目录,
[root@uegame /oldboy]# mkdir -p /oldboy/ett/oldboy
ett的硬链接数会变为3(本身是一个硬链接,点,当前目录下的上一级目录)
[root@uegame /oldboy]# ll -d ett
drwxr-xr-x 3 root root 4096 May 21 14:51 ett
第3章 显示日期
date 日期
-d 根据你的描述显示指定的日期
d '-7day' 七天之前
d '+7day' 七天之后
3.1 显示日期
[root@uegame /oldboy]# date
Mon May 21 15:31:08 CST 2018
显示7天之前的日期
[root@uegame /oldboy]# date -d '-7day' +%F_%w
3.2 总结
1. 正则表达式与取出ip地址
2. 三剑客过滤与区别
3. 目录的硬链接数
4. 显示日期