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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值