1. 程式人生 > >2018-1-17 6周3次課 awk

2018-1-17 6周3次課 awk

boa 創建 http .com man 相等 class 匹配 log

9.6/9.7 awk


技術分享圖片


awk

-F 指定分隔符

'{print $1}' 打印第一段 ($0表示所有段)


[root@localhost awk]# awk -F : '{print $1}' test.txt                ##-F指定 : 為分隔符,把第一段打印
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
sshd
chrony
[root@localhost awk]# head -2 test.txt | awk '{print $0}'            ##  {print $0} 打印全部
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

創建一個新文件,1,.txt,內容如下:

[root@localhost awk]# cat 1.txt
1 2
aa bb
dd ee
[root@localhost awk]# awk '{print $1}' 1.txt                     ##不指定分隔符,默認用 空格 作為分隔符
1
aa
dd
[root@localhost awk]# awk -F : '{print $1,$3,$4}' test.txt             ##多打印幾列
root 0 0
bin 1 1
daemon 2 2
adm 3 4
lp 4 7
sync 5 0
shutdown 6 0
halt 7 0
mail 8 12
operator 11 0
games 12 100
ftp 14 50
nobody 99 99
systemd-network 192 192
dbus 81 81
polkitd 999 997
postfix 89 89
sshd 74 74
chrony 998 996


·指定分隔的結果,用#隔開

[root@localhost awk]# awk -F : '{print $1"#"$3"#"$4}' test.txt
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7
sync#5#0
shutdown#6#0
halt#7#0
mail#8#12
operator#11#0
games#12#100
ftp#14#50
nobody#99#99
systemd-network#192#192
dbus#81#81
polkitd#999#997
postfix#89#89
sshd#74#74
chrony#998#996

·awk的匹配:(awk不用加脫義字符)


★匹配包含oo的行

[root@localhost awk]# awk '/oo/' test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin


★ 精確匹配,第一段匹配字符 oo 的行

[root@localhost awk]# awk -F : '$1 ~ /oo/' test.txt                     ## 精確匹配
root:x:0:0:root:/root:/bin/bash


★精確匹配第一段有1個或多個o的行

[root@localhost awk]# awk -F : '$1 ~ /o+/' test.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin


★test.txt中,以:分段,匹配root的行中,打印該行1和3段,匹配user的行中打印該行3和4段

[root@localhost awk]# awk -F : '/root/{print $1,$3} /user/{print $3,$4}' test.txt
root 0
operator 11


★匹配root或user的行:

[root@localhost awk]# awk -F: '/root|user/' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost awk]# awk -F: '/root|user/{print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


★第三段等於0的行

[root@localhost awk]# awk -F: '$3=="0"' test.txt
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# awk -F: '$3==0 {print $1}' test.txt             ##第三段等於0的行的第一段
root


★第三段大於等於900的行

[root@localhost awk]# awk -F: '$3>=900 {print $0}' test.txt
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin


★★★★★如果給數字加上雙引號,那麽會將900當做字符,會以ASCII來排序,而不是數字排序,因此結果中多了99的行

[root@localhost awk]# awk -F: '$3>="900" {print $0}' test.txt
nobody:x:99:99:Nobody:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin


★第7段不是/sbin/nologin的行 (!= 不等於)

[root@localhost awk]# awk -F: '$7!="/sbin/nologin"' test.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




技術分享圖片


兩個字段比大小

[root@localhost awk]# awk -F : '$3<$4' test.txt                             ##第三段比第四段小的行
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost awk]# awk -F : '$3==$4' test.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
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
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@localhost awk]# awk -F : '$3>"5" && $3<"7"' test.txt                     ##5和7是字符,不是數字
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

或者

[root@localhost awk]# awk -F : '$3>1000|| $7=="/sbin/nologin"' test.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
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]# awk -F : '$3>1000 || $7 ~ /bash/' test.txt                   ## ~ 匹配
root:x:0:0:root:/root:/bin/bash


·內置變量 OFS:

指定打印時的分隔符:{OFS=' '} 要在print前使用

-指定目前的分隔符;OFS指定要改為什麽分隔符;條件(不寫條件就是全部);打印的段


[root@localhost awk]# head -5 /etc/passwd |awk -F : '{OFS="#"}{print $1,$3,$4}'     ##  #號必須加“”
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7
[root@localhost awk]# awk -F : '{OFS="#"} {if ($3>"5") {print $1,$2,$3,$4}}' /etc/passwd
shutdown#x#6#0
halt#x#7#0
mail#x#8#12
nobody#x#99#99
dbus#x#81#81
polkitd#x#999#997
postfix#x#89#89
sshd#x#74#74
chrony#x#998#996


NR:表示行號

[root@localhost awk]# awk -F : '{print NR":"$0}' test.txt             ##類似於grep -n
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

RF:表示段號

[root@localhost awk]# awk -F : '{print NF":"$0}' test.txt            ##顯示每行有多少段
7:root:x:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
7:daemon:x:2:2:daemon:/sbin:/sbin/nologin
7:adm:x:3:4:adm:/var/adm:/sbin/nologin
7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
7:halt:x:7:0:halt:/sbin:/sbin/halt
7:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
7:operator:x:11:0:operator:/root:/sbin/nologin
7:games:x:12:100:games:/usr/games:/sbin/nologin
7:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
7:nobody:x:99:99:Nobody:/:/sbin/nologin
7:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
7:dbus:x:81:81:System message bus:/:/sbin/nologin
7:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
7:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
7:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
7:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost awk]# awk 'NR<=10 ' test.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
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

前十行,第一段是root或者sync的行:

[root@localhost awk]# awk -F : 'NR<=10 && $1 ~ /root|sync/' test.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
[root@localhost awk]# awk 'NR<=10 && $1 ~ /root|sync/' test.txt           ##如果不加-F,會把整行當做$!
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
operator:x:11:0:operator:/root:/sbin/nologin


·一個 = 是賦值,而 == 才表示是等於

[root@localhost awk]# head -3 test.txt |awk -F : '$1="root"'            ##把第一段全部改為root
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@localhost awk]# head -3 test.txt |awk -F : '$1=="root"'             ##這才是打印第一段為root的行
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# head -3 test.txt |awk -F : '{OFS=":"} $1=="root"'  ##可以OFS 定義分隔符
root:x:0:0:root:/root:/bin/bash

求和tot

[root@localhost awk]# awk -F : '{tot=tot+$3};END {print tot}' test.txt
2605

(tot=tot+$3,求和,從第一行0開始,加上$3的值,到第二行,第一行$3加上第二行$3,以此類推,最後打印出總和)


判斷:

[root@localhost awk]# awk -F : '{if ($1=="root"){print $0}}' test.txt
root:x:0:0:root:/root:/bin/bash

(如果第一段是root,那麽打出所有行。就是打印第一段為root的行)


2018-1-17 6周3次課 awk