正則表達式應用 |
作者:左婷婷 歸檔:學習筆記 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 |
官方網站: | |
目 錄
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: <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
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