【2018.04.27學習筆記】【linux基礎知識9.6-9.7】

9.6 awk(上)

awk實際上是一種程序設計語言,叫樣式掃描和處理語言。簡單來講awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各類分析處理。正則表達式

命令格式:awk [選項] ' 模式 = ( {內置變量} + 表達式 + {動做} ) ' 文件名c#

表達式裏能夠是正則表達式:裏面的查找關鍵詞用 / /號括起來,如 /root/ 。 其中 「模式」 表示 awk 在數據中查找的內容、規則表達式和操做動做。花括號({ })不須要在程序中始終出現,但它們用於根據特定的模式對一系列指令進行分組。bash

awk語言的最基本功能是在文件或者字符串中基於指定規則瀏覽和抽取信息,awk抽取信息後,才能進行其餘文本操做。完整的awk腳本一般用來格式化文本文件中的信息。ssh

一般,awk是以文件的一行爲處理單位的。awk每接收文件的一行,而後執行相應的命令,來處理文本。post

經常使用的awk功能是指定分隔符,對文件的行進行分段,而後再處理。設計

awk -F ':' '{print $1}' 1.txt :指定用:號分隔行爲幾段,輸出打印第一段。code

-F 指定分隔符的選項: $1 表示第一段,$0 表示全部段。字符串

[root@lgs-01 awk]# awk -F ':' '{print $1}' passwdtest 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
sshd
chrony
lgs
abc

[root@lgs-01 awk]# awk -F ':' '{print $0}' passwdtest 
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
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:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash

不用-F指定分隔符,默認以「空格」 或者「空白字符」爲分隔符。it

awk -F ':' '{print $2,$6,$7}':打印多個段,以逗號,割開寫,也能夠用#號隔開寫程序設計

[root@lgs-01 awk]# awk -F ':' '{print $2,$6,$7}' passwdtest 
x /root /bin/bash
x /bin /sbin/nologin
x /sbin /sbin/nologin
x /var/adm /sbin/nologin
x /var/spool/lpd /sbin/nologin
x /sbin /bin/sync
x /sbin /sbin/shutdown
x /sbin /sbin/halt
x /var/spool/mail /sbin/nologin
x /root /sbin/nologin
x /usr/games /sbin/nologin
x /var/ftp /sbin/nologin
x / /sbin/nologin
x / /sbin/nologin
x / /sbin/nologin
x / /sbin/nologin
x /var/spool/postfix /sbin/nologin
x /var/empty/sshd /sbin/nologin
x /var/lib/chrony /sbin/nologin
x /home/lgs /bin/bash
x /home/abc /bin/bash

awk -F ':' '$1 ~ /oo/' 1.txt :第一段中包含oo的行。~號表示指定段落裏包含oo的匹配

[root@lgs-01 awk]# awk -F ':' '$1 ~ /oo/' passwdtest 
root:x:0:0:root:/root:/bin/bash

awk -F ':' '$7~ /binn+/' 1.txt:支持正則,能夠不用加轉義字符。

[root@lgs-01 awk]# awk -F ':' '$7~ /binn+/' passwdtest 
1:2:3:4:5:6:binnn

支持運算符:

awk -F ':' '$3>=200 {print $0}' 1.txt :若是 第三段大於等於0,就輸出打印匹配行的全部段。

[root@lgs-01 awk]# awk -F ':' '$3>=200 {print $0}' passwdtest 
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash

運算字符串要加" "號括起來:

awk -F ':' '$7!="/sbin/nologin" {print $0}' 1.txt:若是第7段不等於sbin,就輸出打印匹配行的全部段。

[root@lgs-01 awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' passwdtest 
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
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash

awk -F ':' '$3>$4' test.txt :第3段與第4段的對比。

[root@lgs-01 awk]# awk -F ':' '$3>$4 {print $0}' passwdtest 
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lgs:x:1008:1000::/home/lgs:/bin/bash
abc:x:1001:1000::/home/abc:/bin/bash
12:22:55

多個條件 匹配:

awk -F ':' '$3>5 && $4<7' 1.txt:第3段大於5,而且第4段小於7

[root@lgs-01 ~]# awk -F ':' '$3>5 && $4<7' passwdtest 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
12:22:55

awk -F ':' '{OFS="#"} $3>1000 || $4<5 {print $1,$2,$3,$4} ' 1.txt:OFS變量,指定分隔符#號 輸出打印指定段

[root@lgs-01 ~]# awk -F ':' '{OFS="#"} $3>1000 || $4<5 {print $1,$2,$3,$4}' passwdtest 
root#x#0#0
bin#x#1#1
daemon#x#2#2
adm#x#3#4
sync#x#5#0
shutdown#x#6#0
halt#x#7#0
operator#x#11#0
lgs#x#1008#1000
abc#x#1001#1000
12#22#55#
587#1##
12#21##
12#200##
1###
9###
51###
59###
abc#0##
abc#y##

9.7 awk(下)

awk -F ':' '{print NR ": " $0}' 1.txt:NR變量,顯示行號。

[root@lgs-01 ~]# awk -F ':' '{print NR ": " $0}' passwdtest 
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
4: adm:x:3:4:adm:/var/adm:/sbin/nologin
5: lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6: sync:x:5:0:sync:/sbin:/bin/sync
7: shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8: halt:x:7:0:halt:/sbin:/sbin/halt
9: mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
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
14: systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15: dbus:x:81:81:System message bus:/:/sbin/nologin
16: polkitd:x:999:997:User for polkitd:/:/sbin/nologin
17: postfix:x:89:89::/var/spool/postfix:/sbin/nologin
18: sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19: chrony:x:998:996::/var/lib/chrony:/sbin/nologin
20: lgs:x:1008:1000::/home/lgs:/bin/bash
21: abc:x:1001:1000::/home/abc:/bin/bash

awk -F ':' 'NF==7 && $1 ~/root|sync/' 1.txt: NF變量,每行的段數。當NF等於7,且第一段含root或者a的,輸出打印匹配的行。

[root@lgs-01 ~]# awk -F ':' 'NF==7 && $1 ~/root|a/' passwdtest 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
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
games:x:12:100:games:/usr/games:/sbin/nologin
abc:x:1001:1000::/home/abc:/bin/bash

awk -F ':' '{print $NR ":" $NF}' 1.txt:輸出打印每行的第NR段:第NF段的字符對。NR、NF是一個數字變量,是每行的行號和段數。

當NR和NF前面不加 $號的時候: NR : NF,輸出的是每行的 行號: 段數

[root@lgs-01 ~]# awk -F ':' '{print $NR ": " $NF } ' passwdtest 
root: /bin/bash
x: /sbin/nologin
2: /sbin/nologin
4: /sbin/nologin
lp: /sbin/nologin
/sbin: /bin/sync
/sbin/shutdown: /sbin/shutdown
: /sbin/halt
: /sbin/nologin
: /sbin/nologin
: /sbin/nologin
: /sbin/nologin
: /sbin/nologin
: /sbin/nologin
: /sbin/nologin
: /sbin/nologin
: /sbin/nologin
: /sbin/nologin
: /sbin/nologin
: /bin/bash
: /bin/bash

[root@lgs-01 ~]# awk -F ':' '{print NR ": " NF } ' passwdtest 
1: 7
2: 7
3: 7
4: 7
5: 7
6: 7
7: 7
8: 7
9: 7
10: 7
11: 7
12: 7
13: 7
14: 7
15: 7
16: 7
17: 7
18: 7
19: 7
20: 7
21: 7

awk -F ':' '$1="root"' 1.txt:=號,賦值的意思。:把全部行的第一段內容賦值爲root。賦值後輸出結果中,分隔符會消失,能夠用OFS=":"定義。

[root@lgs-01 ~]# awk -F ':' '$1="root"' passwdtest 
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
root x 3 4 adm /var/adm /sbin/nologin
root x 4 7 lp /var/spool/lpd /sbin/nologin
root x 5 0 sync /sbin /bin/sync
root x 6 0 shutdown /sbin /sbin/shutdown
root x 7 0 halt /sbin /sbin/halt
root x 8 12 mail /var/spool/mail /sbin/nologin
root x 11 0 operator /root /sbin/nologin
root x 12 100 games /usr/games /sbin/nologin
root x 14 50 FTP User /var/ftp /sbin/nologin
root x 99 99 Nobody / /sbin/nologin
root x 192 192 systemd Network Management / /sbin/nologin
root x 81 81 System message bus / /sbin/nologin
root x 999 997 User for polkitd / /sbin/nologin
root x 89 89  /var/spool/postfix /sbin/nologin
root x 74 74 Privilege-separated SSH /var/empty/sshd /sbin/nologin
root x 998 996  /var/lib/chrony /sbin/nologin
root x 1008 1000  /home/lgs /bin/bash
root x 1001 1000  /home/abc /bin/bash

[root@lgs-01 ~]# awk -F ':' '{OFS="#" } $1="root"' passwdtest 
root#x#0#0#root#/root#/bin/bash
root#x#1#1#bin#/bin#/sbin/nologin
root#x#2#2#daemon#/sbin#/sbin/nologin
root#x#3#4#adm#/var/adm#/sbin/nologin
root#x#4#7#lp#/var/spool/lpd#/sbin/nologin
root#x#5#0#sync#/sbin#/bin/sync
root#x#6#0#shutdown#/sbin#/sbin/shutdown
root#x#7#0#halt#/sbin#/sbin/halt
root#x#8#12#mail#/var/spool/mail#/sbin/nologin
root#x#11#0#operator#/root#/sbin/nologin
root#x#12#100#games#/usr/games#/sbin/nologin
root#x#14#50#FTP User#/var/ftp#/sbin/nologin
root#x#99#99#Nobody#/#/sbin/nologin
root#x#192#192#systemd Network Management#/#/sbin/nologin
root#x#81#81#System message bus#/#/sbin/nologin
root#x#999#997#User for polkitd#/#/sbin/nologin
root#x#89#89##/var/spool/postfix#/sbin/nologin
root#x#74#74#Privilege-separated SSH#/var/empty/sshd#/sbin/nologin
root#x#998#996##/var/lib/chrony#/sbin/nologin
root#x#1008#1000##/home/lgs#/bin/bash
root#x#1001#1000##/home/abc#/bin/bash

awk -F ':' '{(tot=tot+$3); END {print tot}}' 1.txt:求和一列。tot從0開始,累加每行的第三段的內容,直到尾行結束,而後輸出toto的值。有變量的地方,都用{ }花括號括起來。

[root@lgs-01 ~]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' passwdtest 
4669
相關文章
相關標籤/搜索