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 {}’