本篇主要寫一些shell
腳本編輯工具awk
的使用。shell
awk
是一個功能強大的編輯工具,逐行讀取輸入文本,並根據指定的匹配模式進行查找,對符合條件的內容進行格式化輸出或者過濾處理。bash
awk
傾向於將一行分紅多個字段而後再進行處理,且默認狀況下字段的分隔符爲空格
或者tab
鍵。awk
執行結果能夠經過print
的功能將字段數據打印顯示。ssh
可使用邏輯操做符&&
,表示與
, ||
表示或
,!
表示非
;還能夠進行簡單的數學運算,如+
、-
、*
、/
、%
、^
分別表示加
、減
、乘
、除
、取餘
和乘方
。工具
awk [選項] '模式或條件{編輯指令}' 文件 1 文件 2... awk -f 腳本文件 文件 1 文件 2...
FS
:指定每行文本的字段分隔符,默認爲空格或製表位。
NF
:當前處理的行的字段個數。
NR
:當前處理的行的行號(序數)。
$0
:當前處理的行的整行內容。
$n
:當前處理行的第n
個字段(第n
列)。
RS
:數據記錄分隔,默認爲\n
,即每行爲一條記錄。
FILENAME
:被處理的文件名。post
[root@localhost ~]# awk '{print}' /etc/passwd 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
[root@localhost ~]# awk '{print $0}' /etc/passwd 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
1~3
行[root@localhost ~]# awk 'NR==1,NR==3{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]# awk '(NR>=1)&&(NR<=3){print}' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]# awk 'NR>=1&&NR<=3{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
1
行,第3
行[root@localhost ~]# awk '(NR==1)||(NR==3){print}' /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]# awk 'NR==1||NR==3{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]# awk '(NR%2)==1{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown mail:x:8:12:mail:/var/spool/mail:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost ~]# awk '(NR%2)==0{print}' /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync halt:x:7:0:halt:/sbin:/sbin/halt operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
root
開頭的行[root@localhost ~]# awk '/^root/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash
/bin/bash
結尾的行[root@localhost ~]# awk '/\/bin\/bash$/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash
/bin/bash
結尾的行數[root@localhost ~]# awk 'BEGIN{x=0};/\/bin\/bash$/{x++};END{print x}' /etc/passwd 1
[root@localhost ~]# grep -c '/bin/bash$' /etc/passwd 1 [root@localhost ~]# grep '/bin/bash$' /etc/passwd | wc -l 1
:
分隔的文本段落數[root@localhost ~]# awk 'BEGIN{RS=":"};END{print NR}' /etc/passwd 115
3
個字段[root@localhost ~]# awk -F":" '{print $3}' /etc/passwd 0 1 2 3 4 5 6 7 8 11 12 14 99 192 81 999 89 74 998
1
、3
個字段[root@localhost ~]# awk -F":" '{print $1,$3}' /etc/passwd root 0 bin 1 daemon 2 adm 3 lp 4 sync 5 shutdown 6 halt 7 mail 8 operator 11 games 12 ftp 14 nobody 99 systemd-network 192 dbus 81 polkitd 999 postfix 89 sshd 74 chrony 998
UID
爲0
的用戶記錄[root@localhost ~]# awk -F":" '$3=="0"{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# awk 'BEGIN{FS=":"};$3=="0"{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash
7
個字段包含/bin/bash
的行的第1
個字段[root@localhost ~]# awk -F":" '$7~"/bin/bash"{print $1}' /etc/passwd root
1
個字段包含sshd
且包含7
個字段的行中第1
、3
、7
個字段[root@localhost ~]# awk -F":" '($1~"sshd")&&(NF==7){print $1,$3,$7}' /etc/passwd sshd 74 /sbin/nologin
7
個字段既不是/bin/bash
也不是/sbin/nologin
的全部行[root@localhost ~]# awk -F":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt
wc -l
統計使用bash
的用戶個數[root@localhost ~]# awk -F":" '/bash$/{print | "wc -l"}' /etc/passwd 1
w
命令,並統計在線用戶數[root@localhost ~]# awk 'BEGIN{while("w" | getline)n++;{print n-2}}' 1
hostname
,並輸出當前主機名[root@localhost ~]# awk 'BEGIN{"hostname" | getline;print $0}' localhost