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. 顯示日期