所謂三劍客就是linux中三個(gè)可以用linux正則表達(dá)式的命令
- grep 過(guò)濾
- sed 取行 替換
- awk 取列
環(huán)境準(zhǔn)備
# passwd.txt 內(nèi)容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
grep
格式:grep 選項(xiàng) 正則 文件
作用:在文件中找到符合正則條件的行
選項(xiàng)
- -v 取反
- -i 不區(qū)分大小寫(xiě)
- -n 顯示匹配到的行在源文件中的行號(hào)
- -o 只輸出匹配到的內(nèi)容
- -E 擴(kuò)展正則
- -w 按單詞匹配
- -A -B -C 可以顯示匹配行的前后幾行 -A3 后三行 -B3 前三行 -C3前后三行
- -P 可以使用Perl正則語(yǔ)法
例子
# 以noLogin結(jié)尾的 不區(qū)分大小寫(xiě) 可以去掉-i試試
[root@centos76 data]# grep -i "noLogin$" passwd.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
# 加上-v試試 變成不以nologin結(jié)尾的了
[root@centos76 data]# grep -iv "noLogin$" passwd.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
# 再加上-n試試 顯示了在源文件中的行號(hào)
[root@centos76 data]# grep -ivn "noLogin$" passwd.txt
1:root:x:0:0:root:/root:/bin/bash
2:
7:sync:x:5:0:sync:/sbin:/bin/sync
8:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9:
10:halt:x:7:0:halt:/sbin:/sbin/halt
grep -E 相當(dāng)于egrep 可以使用linux正則表達(dá)式中的擴(kuò)展正則
# -o 只顯示匹配到的內(nèi)容 而不是顯示整行
[root@centos76 data]# grep -ino "noLogin$" passwd.txt
3:nologin
4:nologin
5:nologin
6:nologin
11:nologin
# -w 按單詞匹配 所以用nologin可以匹配到 用no不行
[root@centos76 data]# grep -w "nologin" passwd.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@centos76 data]# grep -w "no" passwd.txt
[root@centos76 data]#
sed
作用
流編輯器 可以對(duì)文本進(jìn)行增刪改查
格式
sed [OPTION]... '取什么 取到后做什么' [input-file]...
選項(xiàng)
- -n 取消默認(rèn)輸出
- -r 擴(kuò)展正則
- -i 直接修改文件
- -e 多次編輯
sed -n '1,3p' passwd.txt
取1到3行并打印
# 準(zhǔn)備實(shí)驗(yàn)對(duì)象passwd.txt
[root@centos76 data]# cat /etc/passwd > passwd.txt
[root@centos76 data]# sed -n '1,3p' passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
-n選項(xiàng)取消默認(rèn)打印,去掉后會(huì)發(fā)現(xiàn)1到3行打印了兩遍列肢,其他行也都打印了,自己試試體會(huì)下达皿。
'1,3p' 這個(gè)就是格式中的腳本部分,作用是:取什么 取到后做什么
1,3表示取1到3行 p表示取到后打印
改成'4p'自己試下坐昙。
sed -n '/root/p' passwd.txt
取到包含root的行并打印
[root@centos76 data]# sed -n '/root/p' passwd.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
//之間的內(nèi)容 世界是正則表達(dá)式
sed "1,10d" passwd.txt
刪除1到10行并打印剩下的行
[root@centos76 data]# sed "1,10d" passwd.txt
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
nginx:x:997:995:nginx user:/var/cache/nginx:/sbin/nologin
ocean:x:1000:1000::/home/ocean:/bin/bash
執(zhí)行上面這些刪除命令后岖免,你會(huì)發(fā)現(xiàn)passwd.txt源文件并沒(méi)有發(fā)生變化粒竖,如果想修改源文件,需要加-i參數(shù)呻疹,-i.bak會(huì)先備份后修改源文件吃引,建議修改前備份
sed -i.bak "1,10d" passwd.txt
備份后在源文件中刪除1到10行,真實(shí)刪除
[root@centos76 data]# sed -i.bak "1,10d" passwd.txt
[root@centos76 data]# wc passwd.txt
11 20 560 passwd.txt
[root@centos76 data]# wc passwd.txt.bak
21 30 945 passwd.txt.bak
建議:操作前備份刽锤,操作后檢查
sed "s/nologin/NOLOGIN/g" passwd.txt
把nologin替換成NOLOGIN
s/查找的內(nèi)容/替換的內(nèi)容/g s表示替換 g表示全局镊尺,///可以替換成###,@@@并思,只要可以分割即可//之間實(shí)際上是正則表達(dá)式
[root@centos76 data]# sed "s/nologin/NOLOGIN/g" passwd.txt
games:x:12:100:games:/usr/games:/sbin/NOLOGIN
ftp:x:14:50:FTP User:/var/ftp:/sbin/NOLOGIN
nobody:x:99:99:Nobody:/:/sbin/NOLOGIN
systemd-network:x:192:192:systemd Network Management:/:/sbin/NOLOGIN
dbus:x:81:81:System message bus:/:/sbin/NOLOGIN
polkitd:x:999:998:User for polkitd:/:/sbin/NOLOGIN
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/NOLOGIN
postfix:x:89:89::/var/spool/postfix:/sbin/NOLOGIN
chrony:x:998:996::/var/lib/chrony:/sbin/NOLOGIN
nginx:x:997:995:nginx user:/var/cache/nginx:/sbin/NOLOGIN
ocean:x:1000:1000::/home/ocean:/bin/bash
sed '2a hello' passwd.txt
第二行之后添加一行hello是第三行
sed '2i hello' passwd.txt
第二行之前插入一行hello是第二行
sed 獲取ip地址
sed默認(rèn)不支持?jǐn)U展正則 加上-r支持?jǐn)U展正則
s#A#B#g 用來(lái)把A替換成B
# ipv4
> A=`^.*inet (([0-9]{1,3}\.){3}[0-9]{1,3}).*$`
> B=`\1` 分組引用,引用`([0-9]{1,3}\.){3}[0-9]{1,3}`
[root@centos76 ~]# ip address show ens33|grep "inet "|sed -r 's#^.*inet (([0-9]{1,3}\.){3}[0-9]{1,3}).*$#\1#g'
192.168.100.100
# ipv6
> A=`^.*inet6 (([0-9a-fA-F]{,4}:){5}[0-9a-fA-F]{,4}).*$`
> B=`\1` 分組引用,引用`([0-9a-fA-F]{,4}:){5}[0-9a-fA-F]{,4}`
[root@centos76 ~]# ip address show ens33|grep "inet6"|sed -r 's#^.*inet6 (([0-9a-fA-F]{,4}:){5}[0-9a-fA-F]{,4}).*$#\1#g'
fe80::6ac3:3104:7003:e3fe
小結(jié)
-
sed -n {1,4p} 文件名
按行查找-取什么:1-4行庐氮,取到后做什么:p打印。 -
sed -n '/A/p' 文件名
按正則查找-取什么 :能匹配正則A的行宋彼,取到后做什么:p打印弄砍。 -
sed "s/A/B/g" 文件名
替換-把正則A匹配的內(nèi)容替換成B,A中可以分組输涕,B中可以引用音婶。
awk
作用
用-F指定的分割符將文件分割,分割后
1代表第一列
NF代表最后一列
$(NF-1)代表倒數(shù)第二列
NF 列數(shù)
NR 行號(hào)
然后執(zhí)行program指定的程序
格式
awk [options] -f progfile [--] file ...
awk [options] [--] 'program' file ...
下面講的都是這個(gè)格式
'program'
的格式是 '條件{動(dòng)作}'
選項(xiàng)
- -F 指定分割符
awk '/games/' passwd.txt
只有條件沒(méi)有動(dòng)作 表示過(guò)濾符合條件的行
條件可以是正則/正則/
awk默認(rèn)支持?jǐn)U展正則
也可以是范圍NR==1,NR==3
,
分割表示1到3行
也可以是多個(gè)條件NR>=1 && NR<=3
[root@centos76 data]# awk '/games/' passwd.txt
games:x:12:100:games:/usr/games:/sbin/nologin
[root@centos76 data]# awk 'NR==1,NR==3' passwd.txt
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
awk -F':' '{print $1}' passwd.txt
只有動(dòng)作沒(méi)有條件 表示所有的行都要執(zhí)行該program
這里指定了分割符為:莱坎,用分隔符把passwd.txt中的每一行分割成多個(gè)列
之后執(zhí)行'{print $1}'這段程序
就是打印第一列的內(nèi)容
[root@centos76 data]# awk -F':' '{print $1}' passwd.txt
games
ftp
nobody
systemd-network
dbus
polkitd
sshd
postfix
chrony
nginx
ocean
# 這里中間可以加上--
# --的作用是 明確--前面的部分是awk [options]
# 明確--后面的部分是'program' file ...
[root@centos76 data]# awk -F ':' -- '{print $1}' passwd.txt
games
ftp
nobody
systemd-network
dbus
polkitd
sshd
postfix
chrony
nginx
ocean
awk -F ':' 'NR==1,NR==3{print $1}' passwd.txt
既有條件又有動(dòng)作 表示只對(duì)符合條件的行執(zhí)行對(duì)應(yīng)的動(dòng)作
[root@centos76 data]# awk -F ':' 'NR==1,NR==3{print $1}' passwd.txt
games
ftp
nobody
例子
sed專業(yè)取行
用sed將/etc/passwd文件中第一行到最后一行重定向到passwd.txt
# -n 和 p 配對(duì) -n默認(rèn)不打印 p打印 結(jié)果就是只打印符合條件的
sed -n '1,$p' /etc/passwd > passwd.txt
顯示/etc/passwd的第三行到第七行
sed -n '3,7p' /etc/passwd
# 表示單個(gè)條件
awk 'NR>=3 && NR<=7' /etc/passwd
# , 表示范圍 從第三行到第7行
awk 'NR==3,NR==7' /etc/passwd
awk專業(yè)取列
用sed取出passwd.txt中用戶名為dbus的行中備注列
dbus:x:81:81:System message bus:/:/sbin/nologin #取出System message bus
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin #取出FTP User
# -r 用來(lái)使用增強(qiáng)正則 n和p配對(duì) g
# s#找什么#替換成什么#g
sed -rn 's#([^:]*):([^:]*):([^:]*):([^:]*):([^:]*):([^:]*):([^:]*)#\5#gp' passwd.txt
[root@centos76 sjk]# sed -rn 's#dbus:([^:]*):([^:]*):([^:]*):([^:]*):([^:]*):([^:]*)#\4#p' passwd.txt
System message bus
[root@centos76 sjk]# sed -rn 's#ftp:([^:]*):([^:]*):([^:]*):([^:]*):([^:]*):([^:]*)#\4#p' passwd.txt
FTP User
[root@centos76 sjk]# awk -F: '$1=="dbus"{print $5}' passwd.txt
System message bus
[root@centos76 sjk]# awk -F: '$1=="ftp"{print $5}' passwd.txt
FTP User
使用awk取passwd.txt用戶名及家目錄并顯示行號(hào)
[root@centos76 sjk]# awk -F: '{print NR,$1,$6}' passwd.txt |column -t
1 root /root
2 bin /bin
3 daemon /sbin
4 adm /var/adm
passwd.txt中uid>10時(shí) 顯示整行
[root@centos76 sjk]# awk -F: '$3>10{print NR,$0}' passwd.txt
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
[root@centos76 data]# awk -F: '$1~/games/{print NR,$0}' passwd.txt
1 games:x:12:100:games:/usr/games:/sbin/nologin