linux三劍客

所謂三劍客就是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指定的分割符將文件分割,分割后
0代表整行1代表第一列
2代表第二列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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衣式,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子檐什,更是在濱河造成了極大的恐慌碴卧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乃正,死亡現(xiàn)場(chǎng)離奇詭異住册,居然都是意外死亡拣帽,警方通過(guò)查閱死者的電腦和手機(jī)皂股,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)办桨,“玉大人搭综,你說(shuō)我怎么就攤上這事垢箕。” “怎么了兑巾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵条获,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蒋歌,道長(zhǎng)帅掘,這世上最難降的妖魔是什么委煤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮修档,結(jié)果婚禮上碧绞,老公的妹妹穿的比我還像新娘。我一直安慰自己吱窝,他們只是感情好讥邻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著院峡,像睡著了一般兴使。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上照激,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天发魄,我揣著相機(jī)與錄音,去河邊找鬼俩垃。 笑死励幼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吆寨。 我是一名探鬼主播赏淌,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼啄清!你這毒婦竟也來(lái)了六水?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辣卒,失蹤者是張志新(化名)和其女友劉穎掷贾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體荣茫,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡想帅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啡莉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片港准。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咧欣,靈堂內(nèi)的尸體忽然破棺而出浅缸,到底是詐尸還是另有隱情,我是刑警寧澤魄咕,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布衩椒,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毛萌。R本人自食惡果不足惜苟弛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阁将。 院中可真熱鬧膏秫,春花似錦、人聲如沸冀痕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)言蛇。三九已至,卻和暖如春宵距,著一層夾襖步出監(jiān)牢的瞬間腊尚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工满哪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婿斥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓哨鸭,卻偏偏與公主長(zhǎng)得像民宿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子像鸡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容