本節內容
1. 三劍客簡介
2. sed命令詳解
3. awk命令詳解
文本處理三劍客
在 Shell 下使用這些正則表達式處理文本最多的命令有下面幾個工具:
命令 描述
grep
默認不支持擴展表達式,加-E 選項開啓 ERE。若是不加-E 使用花括號要加轉義符\{\}
egrep 支持基礎和擴展表達式
awk 支持 egrep 全部的正則表達式
sed 默認不支持擴展表達式,加-r 選項開啓 ERE。若是不加-r 使用花括號要加6666666義符\{\}
sed詳解
2. 語法格式
sed [選項] [sed命令] [輸入文件]
說明:
1,注意sed軟件以及後面選項,sed命令和輸入文件,每一個元素之間都至少有一個空格。
2,sed -commands(sed命令)是sed軟件內置的一些命令選項,爲了和前面的options(選項)區分,故稱爲sed命令
3,sed -commands 既能夠是單個sed命令,也能夠是多個sed命令組合。
4,input -file (輸入文件)是可選項,sed還可以從標準輸入如管道獲取輸入。
3. sed的工做原理
sed讀取一行,首先將這行放入到緩存中
而後,纔對這行進行處理
處理完成之後,將緩衝區的內容發送到終端
存儲sed讀取到的內容的緩存區空間稱之爲:模式空間html
4. 選項說明
option[選項] 解釋說明(帶*的爲重點)
-n (no) 取消默認的sed軟件的輸出,常與sed命令的p連用。*
-e (entry) 一行命令語句能夠執行多條sed命令 *
-r (ruguler) 使用擴展正則表達式,默認狀況sed只識別基本正則表達式 *
-i (inside) 直接修改文件內容,而不是輸出到終端,若是不使用-i選項sed軟件只是修改在內存中的數據,並不會影響磁盤上的文件*
sed -commands[sed命令] 解釋說明(帶*的爲重點)
a (append) 追加,在指定行後添加一行或多行文本 *
c (change) 取代指定的行
d (delete) 刪除指定的行 *
i (insert) 插入,在指定行前添加一行或多行文本 *
p (print) 打印模式空間內容,一般p會與選項-n一塊兒使用*
特殊符號 解釋說明(帶*的爲重點)
! 對指定行之外的全部行應用命令*
sed增刪改查
1. 增
這裏咱們須要用到2個sed命令,分別是:
• 「a」:追加文本到指定行後,記憶方法:a的全拼是apend,意思是追加。
• 「i「:插入文本到指定行前,記憶方法:i的全拼是insert,意思是插入。
實例1:a在後
這是新添加的一行
[root@zxw ~]# cat -n test | sed '1a test'
1 root:x:0:0:root:/root:/bin/bash
test
2 bin:x:1:1:bin:/bin:/sbin/nologin
這是新添加的一行
[root@zxw ~]# cat -n test | sed '1a test\nnihao\nzhao\nxiaoweitest'
1 root:x:0:0:root:/root:/bin/bash
test
nihao
zhao
xiaoweitestlinux
1. 2表明指定對第2行操做,其餘的行忽略
2. a表明插入的意思,2i即在第2行前插入文本
3. 2a後面加上空格,而後跟上你想要插入的文本便可
實例2:i行前面添加面試
新添加了一行
[root@zxw ~]# cat -n test | sed '1i ni'
ni
1 root:x:0:0:root:/root:/bin/bash
this is the first line
我又新添加了一行
[root@zxw ~]# cat -n test | sed '2i test\nnihao\nzhao\n
1 root:x:0:0:root:/root:/bin/bash
test
nihao
zhao
zai
2 bin:x:1:1:bin:/bin:/sbin/nologin
實例3:同時增長多行(/n)正則表達式
[root@ken ~]# sed "2i 這是第一條記錄\n這是第二條記錄\n這是第三條記錄" test
[root@zxw ~]# cat -n test | sed '2i test\nnihao\nzhao\n
1 root:x:0:0:root:/root:/bin/bash
test
nihao
zhao
zai vim
2.刪
• 這個功能也是很是得有用,好比咱們想刪除文件中的某些行,之前最經常使用的是vi或vim命令,但如今咱們知道了sed命令,就應該使用這個高逼格的命令完成任務了。
• 「d」:刪除文本,記憶方法:d的全拼是delete,意思是刪除。
• sed軟件能夠對單行或多行文本進行處理。若是在sed命令前面不指定地址範圍,那麼默認會匹配全部行。
實例1:刪除全部的行
[root@ken ~]# cp test{,.bak}
[root@zxw ~]# cat -n test | sed 'd'
命令說明:若是在sed命令前面不指定地址範圍,那麼默認會匹配全部行,而後使用d命令刪除功能就會刪除這個文件的全部內容
實例2:刪除指定的行
[root@zxw ~]# cat -n test | sed '2d'
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin數組
例3:刪除指定範圍行
[root@zxw ~]# cat -n test | sed '1,8d'
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
實例4:刪除匹配的行緩存
[root@ken ~]# sed '/sixth/d' test
this is the first line
this is the second line
this is the third line
this is the forth line
this is the fivth line
this is the seventh line
this is the eighth line
this is the ninth line
this is the tenth linebash
命令說明:在sed軟件中,使用正則的格式和awk同樣,使用2個」/「包含指定的正則表達式,即「/正則表達式/」。
實例5:刪除指定行到行尾的內容
[root@ken ~]# sed '2,$d' test
this is the first line
第二行也會被刪掉
實例6:取反
1、
[root@ken ~]# sed '2,3!d' test
this is the second line
this is the third line
2、
[root@ken ~]# sed '/tenth/!d' test
this is the tenth line
3.改
• 「c」:用新行取代舊行,記憶方法:c的全拼是change,意思是替換。app
改過以後的第二行
[root@zxw ~]# cat -n test | sed '1c nihao'
nihao
2 bin:x:1:1:bin:/bin:/sbin/nologinless
文本替換
○ 接下來講的這個功能,有工做經驗的同窗應該很是的熟悉,由於使用sed軟件80%的場景就是使用替換功能。
○ 這裏用到的sed命令,選項:
「s」:單獨使用-->將每一行中第一處匹配的字符串進行替換==>sed命令
「g」:每一行進行所有替換-->sed命令s的替換標誌之一(全局替換),非sed命令。
「-i」:修改文件內容-->sed軟件的選項,注意和sed命令i區別。
sed軟件替換模型
sed -i 's/目標內容/替換內容/g' ken.log
sed -i 's#目標內容#替換內容#g'
實例1:把第一行的root替換爲zhao、
[root@zxw ~]# cat -n test | sed '10s/root/zhao/'|grep zhao
10 operator:x:11:0:operator:/zhao:/sbin/nologin
[root@zxw ~]# cat -n test | sed 's/root/zhao/'|grep zhao
1 zhao:x:0:0:root:/root:/bin/bash
10 operator:x:11:0:operator:/zhao:/sbin/nologin
命令說明:從上面命令的結果咱們就知道sed命令默認不會修改文件的內容
實例2:全文替換
[root@zxw ~]# cat -n test | sed ' s/root/zhao/g'|grep zhao
1 zhao:x:0:0:zhao:/zhao:/bin/bash
10 operator:x:11:0:operator:/zhao:/sbin/nologin
命令說明:若是想真正的修改文件內容,咱們就須要使用選項「-i」,這個要和sed命令「i」區分開來。同時咱們能夠發現命令執行後的結果是沒有任何輸出的。
4.查
• 這個功能也是很是得有用,好比咱們想查看文件中的某些行,之前最經常使用的是cat或more或less命令等,但這些命令有些缺點,就是不能查看指定的行。而咱們用了好久的sed命令就有了這個功能了。並且咱們前面也說過使用sed比其餘命令vim等讀取速度更快!
• 這裏咱們須要用到1個sed命令
• 「p」:輸出指定內容,但默認會輸出2次匹配的結果,所以使用-n選項取消默認輸出,記憶方法:p的全拼是print,意思是打印。
實例1:複製1,3行
[root@zxw ~]# cat -n test | sed '1,3p'
1 root:x:0:0:root:/root:/bin/bash
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
實例2:這打印出1.3複製的內容
[root@zxw ~]# cat -n test | sed -n '1,3p'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
實例3:
[root@ken ~]# sed -n '/ninth/p' test
this is the ninth hang
補充:-e多點操做
實例1:
[root@ken ~]# sed -e '2d' -e '5d' test
this is the first hang
this is the third hang
this is the forth hang
this is the sixth hang
this is the seventh hang
this is the eighth hang
this is the ninth hang
this is the tenth hang
this is sixth hang
實例2:
[root@ken ~]# sed -n -e '2p' -e '5p' test
this is the second hang
this is the fivth hang
sed用法總結
1.查找指定的字符串
例子:顯示/etc/passwd中保含root的行(顯示模式空間中的內容)
方法1:set '/root/p' /etc/passwd
[root@zxw ~]# sed -n '/root/p' test
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
方法2:cat /etc/passwd | sed '/root/p'
找出開頭以root行把root替換爲找
[root@zxw ~]# sed '/^root/{s/root/zhao/g}' test | grep zhao
zhao:x:0:0:zhao:/zhao:/bin/bash
[root@zxw ~]# sed '/^root/{s/root/zhao/}' test | grep zhao
zhao:x:0:0:root:/root:/bin/bash
2.在指定的位置作增刪
例子:刪除以root爲開頭的行
[root@zxw ~]# sed '/^root/d ' test
例子:在包含root的行後添加一行
[root@zxw ~]# sed '/root/a zhao' test
root:x:0:0:root:/root:/bin/bash
zhao
3.按行替換
例子:將5到9行的內容替換爲
[root@zxw ~]# sed '5,9c zhao' test
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
zhao
4.按照字符替換
例子:將/etc/selinux/config中的、、改爲 disabled
寫法1:# sed -i 's/SELINUX=disabled/SELINUX=enforcing/g' config
寫法2:# sed -r -i 's/(SELINUX=)disabled/\1enforcing/g' config
5.查找指定的內容再作替換
例子:將以r開頭的行中的oo替換爲qq
[root@zxw ~]# sed '/^r/{s/roo/rpp/g}' test
rppt:x:0:0:rppt:/rppt:/bin/bash
6.多點編輯
例子:去除文件中的註釋行和空白行
[root@zxw ~]# sed -e '/^#/d' -e '/^$/d' test
7)取反操做
顯示非1-5行
[root@zxw ~]# cat -n test | sed -n '1,5!p'
6 #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 #sync:x:5:0:sync:/sbin:/bin/sync
8 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
awk的格式
• awk指令是由模式,動做,或者模式和動做的組合組成。
• 模式既pattern,能夠相似理解成sed的模式匹配,能夠由表達式組成,也能夠是兩個正斜槓之間的正則表達式。好比NR==1,這就是模式,能夠把他理解爲一個條件。
• 動做即action,是由在大括號裏面的一條或多條語句組成,語句之間使用分號隔開。好比awk使用格式:
awk處理的內容能夠來自標準輸入(<),一個或多個文本文件或管道。
○ pattern既模式,也能夠理解爲條件,也叫找誰,你找誰?高矮,胖瘦,男女?都是條件,既模式。
○ action既動做,能夠理解爲幹啥,找到人以後你要作什麼。
模式和動做的詳細介紹咱們放在後面部分,如今你們先對awk結構有一個瞭解。
awk參數
-F:指定分隔符
幾個小概念
FS(Field Separator):字段分隔符(
NR:記錄的編號(awk每讀取一行,NR就加1==)
NF:字段數量(記錄了當前這條記錄包含多少個字段==)
輸出字段的表示方式
$1 $2 ... $n 輸出一個指定的字段
$NF 輸出最後一個字段
$0 輸出整條記錄
awk執行過程
打印2-5行的內容
[root@ken ~]# awk 'NR>=2&&NR<=5{print $0}' /etc/passwd
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
命令說明: 條件NR>=2,表示行號大於等於2時候,執行{print $0}顯示整行。 awk是經過一行一行的處理文件,這條命令中包含模式部分(條件)和動做部分(動做),awk將處理模式(條件)指定的行
1)awk讀入第一行內容
2)判斷是否符合模式中的條件NR>=2
a,若是匹配則執行對應的動做{print $0}
b,若是不匹配條件,繼續讀取下一行
3)繼續讀取下一行
4)重複過程1-3,直到讀取到最後一行(EOF:end of file)
準備測試文件
[root@ken ~]# head /etc/passwd > test
[root@ken ~]# cat test
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
operator:x:11:0:operator:/root:/sbin/nologin
實例1:打印行號
[root@zxw ~]# awk '{print NR,$0}' test
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3
4 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 #adm:x:3:4:adm:/var/adm:/sbin/nologin
6 #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 #sync:x:5:0:sync:/sbin:/bin/sync
[root@zxw ~]# cat test | awk 'NR==2''{print NR,$0}'
2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@zxw ~]# cat test | awk 'NR>=2''{print NR,$0}'
2 bin:x:1:1:bin:/bin:/sbin/nologin
3
4 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 #adm:x:3:4:adm:/var/adm:/sbin/nologin
6 #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 #sync:x:5:0:sync:/sbin:/bin/sync
實例2:輸出有多餘5個字段的行的第三個字段
[root@zxw ~]# awk -F "/" 'NF>=5{print NR,$0}' test
5 #adm:x:3:4:adm:/var/adm:/sbin/nologin
6 #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
10 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
實例3:輸出每行行號和該行有幾個字段
[root@zxw ~]# awk -F ":" '{print NR,NF}' test
1 7
2 7
3 0
4 7
5 7
6 7
7 7
8 7
9 7
10 7
11 7
awk進階--正則
• 正則表達式的運用,默認是在行內查找匹配的字符串,如有匹配則執行action操做,可是有時候僅須要固定的列來匹配指定的正則表達式,好比:我想取/etc/passwd文件中第五列{$5}這一列查找匹配mail字符串的行,這樣就須要用另外兩個匹配操做符,而且awk裏面只有這兩個操做符來匹配正則表達式。
實例1:匹配整行
[root@zxw ~]# awk '/^root/{print $0}' test
root:x:0:0:root:/root:/bin/bash
實例2:匹配一行中的第五個字段包含sync打印出來
[root@zxw ~]# awk -F ":" '$5~/sync/{print $0}' test
sync:x:5:0:sync:/sbin:/bin/sync
提示:
• $5表示第五個區域(列)
• ~表示匹配(正則表達式匹配)
• /root/表示匹配root這個字符串
$5~/root/表示第五個區域(列)匹配正則表達式/root/,既第5列包含root這個字符串,則顯示這一行。
實例3:匹配行尾爲sync
實例4:顯示名字和登陸類型
[root@zxw ~]# awk '/sync$/{print $0} ' test
sync:x:5:0:sync:/sbin:/bin/syn
[root@ken ~]# awk -F ':' '{print $1,$NF}' test
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
$NF:表示匹配的末尾部分,這裏也能夠寫成$7
實戰: 取出網卡IP地址(企業面試題)
[root@ken ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:0c:29:99:ea:a6 brd ff:ff:ff:ff:ff:ff
inet 172.20.10.6/24 brd 172.20.10.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 2408:84f4:86:47e1:20c:29ff:fe99:eaa6/64 scope global mngtmpaddr dynamic
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe99:eaa6/64 scope link
valid_lft forever preferred_lft forever
第一種方法:[root@zxw ~]# ip a | awk '/ens33$/' | awk -F " +|/" '{print $3}'
第二種方法:
[root@ken ~]# ip a | grep -E '^ +.*inet\>.*' | awk -F ' +|/' 'NR==2{print $3}'
172.20.10.6
第三種方法:
[root@ken ~]# hostname -i | awk -F ' ' '{print $3}'
172.20.10.6
第四種方法:
[root@ken ~]# ip a | grep brd.*glo | awk -F ' +|/' '{print $3}'
172.20.10.6
第五種方法:
[root@ken ~]# ip a | grep "scope" | awk 'NR==3{print $0}' | awk -F "( |/)+" '{print $3}'
172.20.10.6
方法還有不少不少,你們若是對本身有高要求的話,要至少寫出來十種以上的方法哦!
awk特殊模式-BEGIN模式與END模式
• BEGIN模塊再awk讀取文件以前就執行,通常用來定義咱們的內置變量(預約義變量,eg:FS,RS)
• 須要注意的是BEGIN模式後面要接跟一個action操做塊,包含在大括號內。awk必須在輸入文件進行任何處理前先執行BEGIN裏的動做(action)。咱們能夠不要任何輸入文件,就能夠對BEGIN模塊進行測試,由於awk須要先執行完BEGIN模式,纔對輸入文件作處理。BEGIN模式經常被用來修改內置變量ORS,RS,FS,OFS等值。
BEGIN模塊
實例1:
[root@ken ~]# ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $3}'
172.20.10.6
[root@ken ~]# ifconfig eth0 | awk -F "[^0-9.]+" 'NR==2{print $2}'
172.20.10.6
#上面的也能夠寫成
[root@ken ~]# ifconfig eth0 | awk 'BEGIN{FS="[ :]+"}NR==2{print $3}'
172.20.10.6
[root@zxw ~]# ip a | awk '/ens33$/' | awk 'BEGIN{FS=" +|/"}{print $3}'
實例2:在讀取文件以前,輸出些提示性信息(表頭)。
END模塊
EHD在awk讀取完全部的文件的時候,再執行END模塊,通常用來輸出一個結果(累加,數組結果),也能夠是和BEGIN模塊相似的結尾標識信息
與BEGIN模式相對應的END模式,格式同樣,可是END模式僅在awk處理完全部輸入行後才進行處理。
實例1:
[root@zxw ~]# awk -F ":" 'BEGIN{print "用戶 登陸信息"}NR>=1' {print $1,$NF}'
.用戶 登陸信息
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
[root@zxw ~]# .
[root@ken ~]# awk -F ':' 'BEGIN{print "username","bash type"}{print $1,$NF}END{print "end of file"}' test
username bash type
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
end of file
實例2:統計包含root的行的數量
方法一:
[root@zxw ~]# awk 'BEING{i=0}/nologin/{i++}END{print i}' test
6
方法二:
[root@zxw ~]# grep -c "nologin" test
6
方法三:
[root@zxw ~]# awk '/nologin/{i++}END{print i}' test
6
總結awk執行過程
回顧一下awk的結構
awk -F 指定分隔符 ‘BRGIN{}END{}’,以下圖
awk數組
數組構成:
數組名[元素名]=值
如圖不難發現,awk數組就和酒店同樣。數組的名稱就像是酒店名稱,數組元素名稱就像酒店房間號碼,每一個數組元素裏面的內容就像是酒店房間裏面的人。
實戰:統計域名出現的次數(百度和搜狐面試題)
[root@ken ~]# cat test
http://www.qq.com/ken
http://www.qq.com/ken
http://www.qq.com/ken
http://www.qq.com/ken
http://www.qq.com/ken
http://www.qq.com/ken
http://www.qq.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.sina.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
http://www.taobao.com/ken
方法一:
awk -F "//|/" '{print $2}' test
| sort | uniq -c
7 www.qq.com
13 www.sina.com
25 www.taobao.com
方法二:
[root@ken ~]# cat test | awk -F '/+' '{ip[$2]++}END{for (i in h) print i,h[i]}'
www.sina.com 13
www.qq.com 7
www.taobao.com 25
awk用法總結
1. 結合內置變量,打印指定的幾行,以及字段數量
例子;輸出有多餘5個字段的行的第三個字段
# cat a.sh | awk -F ":" 'NF>=5{print $3}'
例子:輸出每行行號和該行有幾個字段
# cat a.sh | awk -F ":" '{print NR,NF}'
例子:輸出用戶名,要求全部用戶顯示在同一行,並且用空格分隔
# cat mypwd | awk 'BEGIN{FS=":"; ORS=" "}{print $1}'
2. 結合正則來匹配一行或者某個字段
例子:輸出用戶名以s爲開頭的用戶的uid
# cat mypwd | awk -F ":" '/^s/{print $}'
例子:輸出第五個字段是以t爲結尾的用戶的姓名
# cat mypwd | awk -F ":" '$5~/t$/{print $1}'
3. 採用比較符號來進行打印指定的某些行
例子:實現僅僅輸出3-5的內容,每行前面添加一個行號
# cat mypwd | awk 'NR>=3&&NR<=5{print NR,$1}'
或
# cat mypwd | awk 'NR==3,NR==5{print NR,$1}'
例子:實現僅僅輸出3 和 5 和 7行的內容,每行前面添加一個行號
# cat mypwd | awk 'NR==3||NR==5||NR==7{print NR,$1}'
4. END
例子:統計mypwd中以#開頭的行有多少行
# cat mypwd | awk 'BEGIN{n=0}/^#/{n+=1}END{print n}'
統計:mypwd中,以:爲分隔符,字段數量在3-5的行的數目
# cat mypwd | awk 'BEGIN{FS=":"}NF>=3&&NF<=5{n+=1}END{print n}'
5. ip
例子:統計IP
[root@ken]# cat url.txt | awk -F "/+" '{urls[$2]++}END{for(key in urls)print key, urls[key]}’
www.baidu.com 12
haha.baidu.com 1
ftp.baidu.com 6
mail.baidu.com 7
來自 <https://www.cnblogs.com/kenken2018/p/10237351.html>