Shell學習(awk)-2018.12.21

6.awk(上)

    awk支持分段功能,且無需脫義,不更改源文件

    awk  '{print $0}' test.txt        #本條命令的含義指打印test.txt,$0匹配所有段   ,相當於cat該文件 

[root@Chauncey ~]# awk '{print $0}' awktest 
root:sbin:1000:admin:yeyunyi
admin:sbin:1001:admin:yeyunyi
yeyunyi:sbin:1002:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi:root:sbin:abcd:admin:yeyunyi
yeyunyi:sbin:a:admin:yeyunyi
[root@Chauncey ~]# cat awktest 
root:sbin:1000:admin:yeyunyi
admin:sbin:1001:admin:yeyunyi
yeyunyi:sbin:1002:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi:root:sbin:abcd:admin:yeyunyi
yeyunyi:sbin:a:admin:yeyunyi

    awk -F ':' '{print $1}' test.txt       #awk的-F選項時指定分隔符,$1指第一列,如果沒有指定分隔符,默認空格或空白字符爲分隔符打印

[root@Chauncey ~]# awk -F ':' '{print $1}' awktest    #-F指定段的分隔符爲:
root
admin
yeyunyi
root
root
yeyunyi
[root@Chauncey ~]# awk '{print $1}' awktest      #不指定分隔符時,以空格或空字符來做分隔  
root:sbin:1000:admin:yeyunyi
admin:sbin:1001:admin:yeyunyi
yeyunyi:sbin:1002:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi:root:sbin:abcd:admin:yeyunyi
yeyunyi:sbin:a:admin:yeyunyi
[root@Chauncey ~]# cat awktest 
root:sbin:1000:admin:yeyunyi
admin:sbin:1001:admin:yeyunyi
yeyunyi:sbin:1002:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi:root:sbin:abcd:admin:yeyunyi
yeyunyi:sbin:a:admin:yeyunyi
[root@Chauncey ~]# 

    awk -F ':' '{print $1,$2,$3}' test.txt     打印1段,2段,3段,打印幾段寫幾段,中間用逗號隔開,也可以將逗號換成其他符號,但該符號要使用雙引號:awk -F ':' '{print $1"#"$2"#"$3}' test.txt

[root@Chauncey ~]# awk -F ':' '{print $1,$2,$3}' awktest 
root sbin 1000
admin sbin 1001
yeyunyi sbin 1002
root sbin abcd
root sbin abcd
yeyunyi sbin a
[root@Chauncey ~]# 

    awk的匹配功能:awk ‘/word/’ filename,也可以指定第一段包含oo的行,eg:awk -F ‘:’ ‘$1 ~ /word/' filename 這裏的波浪號,意爲匹配,同樣支持正則表達式,awk -F ':' '$n ~ /RE/' filename,eg: awk -F ':' '$1 ~ /o+/' test.txt ,另,awk無需加脫義符號

    awk支持多個表達式一起寫,有兩種寫法:

[root@Chauncey awk]# awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$3,$4}' test.txt
root 0
operator 11
saslauth 499 76
user1 500 500
[root@Chauncey 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
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
[root@Chauncey awk]# 

    awk中“”的使用,數值加上“”,相當於sort不加-n,以字符串算,如果直接使用數字,則表示數值

    awk數學運算表達式的使用:

       等於: awk -F ':' '$3==0 {print $1}' test.txt

       大於等於:awk -F ':' '$3>=0 {print $1}' test.txt

       不等於:awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt

7.awk(下)

    awk -F ':' '$3<$4' /etc/passwd     #字段之間比較大小,此示例爲3,4段之間大小的比較,屬於運算都可以用於段與段之間比較

[root@Chauncey ~]# awk -F ':' '$3<$4' passwd 
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@Chauncey ~]# awk -F ':' '$3==$4' 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
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
User1:x:500:500::/home/User1:/bin/bash

    awk -F ':' '$3>"5" && $3<"7"' /etc/passwd     #第三段大於第五段且第三段小於7的內容

[root@Chauncey ~]# awk -F ':' '$3>$5 && $3<"7"' passwd        
ntp:x:38:38::/etc/ntp:/sbin/nologin
User1:x:500:500::/home/User1:/bin/bash
yeyunyi:x:501:0::/home/yeyunyi:/bin/bash

    awk -F ':' '$3>1000 || $7=="/bin/bash"'' /etc/passwd      #第三段大於1000或第7段等於/bin/bash的內容

[root@Chauncey ~]# awk -F ':' '$3>1000 || $7=="/bin/bash"' passwd            
root:x:0:0:root:/root:/bin/bash
User1:x:500:500::/home/User1:/bin/bash
yeyunyi:x:501:0::/home/yeyunyi:/bin/bash

    head -5 /etc/passwd | awk -F ':' '{OFS="#"}{print $1,$3,$4}' /etc/passwd    #OFS是內置變量,-F是分段前的分隔符,OFS是輸出後的分隔符

[root@Chauncey ~]# head -5 passwd | awk -F ':' '{OFS="#"}{print $1,$3,$4}' 
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7

    awk -F ':' '{OFS="#"}{if($3>1000){print $1,$2,$3,$4}}' /etc/passwd      #相當於awd -F ':' '{OFS="#"} $3>1000{print $1,$2,$3,$4}',只不過這個句式省略了if

[root@Chauncey ~]# awk -F ':' '{OFS="#"}{if ($3>1000) {print $1,$2,$3,$4}}' awktest 
admin#sbin#1001#admin
yeyunyi#sbin#1002#admin
root#sbin#abcd#admin
[root@Chauncey ~]# awk -F ':' '{OFS="#"} $3>1000 {print $1,$2,$3,$4}' awktest         
admin#sbin#1001#admin
yeyunyi#sbin#1002#admin
root#sbin#abcd#admin
[root@Chauncey ~]#

    head -n3 /etc/passwd | awk -F ':' '{print NF}'      #NF表示將段號打印出來,可用作判斷條件

    head -n3 /etc/passwd | awk -F ':' '{print NR}'       #NR表示將行號顯示出來,可用作判斷條件#

    awk 'NR>40' /etc/passwd

[root@Chauncey ~]# cat awktest 
root:sbin:1000:admin:yeyunyi
admin:sbin:1001:admin:yeyunyi
yeyunyi:sbin:1002:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi:root:sbin:abcd:admin:yeyunyi
[root@Chauncey ~]# awk -F ':' '{print NF":"$0}' awktest  
5:root:sbin:1000:admin:yeyunyi
5:admin:sbin:1001:admin:yeyunyi
5:yeyunyi:sbin:1002:admin:yeyunyi
5:root:sbin:abcd:admin:yeyunyi
10:root:sbin:abcd:admin:yeyunyi:root:sbin:abcd:admin:yeyunyi
[root@Chauncey ~]# awk -F ':' '{print NR":"$0}' awktest  
1:root:sbin:1000:admin:yeyunyi
2:admin:sbin:1001:admin:yeyunyi
3:yeyunyi:sbin:1002:admin:yeyunyi
4:root:sbin:abcd:admin:yeyunyi
5:root:sbin:abcd:admin:yeyunyi:root:sbin:abcd:admin:yeyunyi
[root@Chauncey ~]#
[root@Chauncey ~]# awk -F ':' '(NR>=3){print NR":"$0}' awktest   
3:yeyunyi:sbin:1002:admin:yeyunyi
4:root:sbin:abcd:admin:yeyunyi
5:root:sbin:abcd:admin:yeyunyi:root:sbin:abcd:admin:yeyunyi
[root@Chauncey ~]# awk -F ':' '(NF>=5){print NF":"$0}' awktest      
5:root:sbin:1000:admin:yeyunyi
5:admin:sbin:1001:admin:yeyunyi
5:yeyunyi:sbin:1002:admin:yeyunyi
5:root:sbin:abcd:admin:yeyunyi
10:root:sbin:abcd:admin:yeyunyi:root:sbin:abcd:admin:yeyunyi
[root@Chauncey ~]#

    awk -F ':' 'NR<20 && $1 ~ /root/' /etc/passwd    #NR,NF都可以這樣使用

[root@Chauncey ~]# awk -F ':' 'NR<5 && $1 ~ /root/ {print NR":"$0}' passwd    
1:root:x:0:0:root:/root:/bin/bash
[root@Chauncey ~]# awk -F ':' 'NR<5 && $1 ~ /root/' passwd                 
root:x:0:0:root:/root:/bin/bash
[root@Chauncey ~]# 

    head -n 3 /etc/passwd |awk -F ':' '$1="root"'     #一個等號,是將root賦值給了第一段,而如果爲==,則指第一段的值是root

[root@Chauncey ~]# cat awktest 
root:sbin:1000:admin:yeyunyi
admin:sbin:1001:admin:yeyunyi
yeyunyi:sbin:1002:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi
root:sbin:abcd:admin:yeyunyi:root:sbin:abcd:admin:yeyunyi
[root@Chauncey ~]# head -n 3 awktest | awk -F ':' '$1="root"'     
root sbin 1000 admin yeyunyi
root sbin 1001 admin yeyunyi
root sbin 1002 admin yeyunyi
[root@Chauncey ~]# head -n 3 awktest | awk -F ':' '$1=="root"'
root:sbin:1000:admin:yeyunyi
[root@Chauncey ~]# 

    awk -F ':' '{(tot=tot+3)};END {print tot}' /etc/passwd      #tot求和,tot值每一次循環都會把第三段的值相加,從0開始,第一次是0加第一行第三段,第二次加第二行第三段......這樣可以求一列的和

[root@Chauncey ~]# awk -F ':' '{(tot=tot+$3)};END {print tot}' /etc/passwd
2065

    awk -F ':' '{if($1=="root"){print $0}}' /etc/passwd      #判斷,如果第一段等於root,打印所有的段

    awk的中和格式參考:awk -F ‘XXX’ ‘BEGIN{} {if(條件) (語句1;語句2) } END {}’

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章