一些关于awk的习题

1.只处理用户ID为奇数的行,并打印用户名和uid号

[root@localhost ~]# awk -F: 'NR%2==1 {print $1,$3}' /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
mail 8
games 12
nobody 99
dbus 81
postfix 89
sshd 74
tss 59
mary 1001
boddy 1003
k1 1008
k3 1010
bash 1041
basher 1043
asd 1045
haha 1047
xixi 1049

2.显示系统的普通用户,并打印用户名和ID

[root@localhost ~]# awk -F: '$3 > 1000 {print $1,$3}' /etc/passwd
mary 1001
alice 1002
boddy 1003
alic 1007
k1 1008
k2 1009
k3 1010
ads 1011
bash 1041
testbash 1042
basher 1043
nologin 1044
asd 1045
test 1046
haha 1047
hehe 1048
xixi 1049
enen 1050

3.显示用户shell是’/bin/bash’的用户,并打印用户名

[root@localhost ~]# awk -F: '$7 ~ /\/bin\/bash/{print $1}' /etc/passwd
root
liao
mary
alice
alic
k1
k2
k3
ads
bash
testbash
basher
asd
test
haha
hehe
xixi
enen

4.统计普通用户的个数

[root@localhost ~]# awk -F: '$3 > 1000 {print NR | "wc -l" }' /etc/passwd
18

5.统计文本的总行数

[root@localhost ~]# awk -F: '{print NR | "wc -l" }' /etc/passwd
40

6.显示文件名

[root@localhost ~]# awk -F: 'END{print FILENAME }' /etc/passwd
/etc/passwd

7.显示UID为1000用户的相关信息

[root@localhost ~]# awk -F: '$3 == 1000 {print $0 }' /etc/passwd
liao:x:1000:1000:LIAO:/home/liao:/bin/bash

8.利用awk模拟tail -1的效果

[root@localhost ~]# awk -F: 'END{print $0 }' /etc/passwd
enen:x:1050:1052::/home/enen:/bin/bash

9.统计tcp链接数的长段awk解析

1.统计tcp的链接数
# 将网卡信息作为awk的输入
netstat -ant | awk '
# 过滤出以tcp开头的行
/^tcp/
# 定义一个数组,键为每一行的最后一个字段,从0读起,每读到一次值加1
{++state[$NF]} 
# 定义一个变量key,在数组中遍历,打印key读取到的键,以及键对应的值
END {for(key in state) print key,"\t",state[key]}'
2.分别统计不同ip的tcp连接
# 将网卡信息作为awk的输入
netstat -ant | awk '
# 过滤出以tcp开头的行
/^tcp/
# 在过滤出来的行中,取倒数第二个字段作为字符串,:作为分隔符对字符串进行拆分,将数组名取为array
{
 n=split($(NF-1),array,":")
# 如果字符串拆分后字段总数小于等于2,那么将第一个字段作为数组S的键,每读到这个键的时候值便加1
 if(n<=2)
  ++S[array[(1)]]
# 如果字符串拆分后字段总数大于2,那么将第四个字段作为数组S的键,每读到这个键的时候值便加1
 else 
  ++S[array[(4)]]
# 将每一行的最后一个字段作为数组s的键,每读一次加1,变量N每读一行加1
 ++s[$NF]
 ++N
}
# 使变量a在数组S中遍历,读取键以及键对应的值,格式化输出,指定a左对齐,且占用20个空格,a的值默认右对齐,每打印一行I加1
END {
 for(a in S){
  printf("%-20s %s\n", a, S[a])
  ++I
 }
# 格式化输出,对IP总数进行统计
 printf("%-20s %s\n","TOTAL_IP",I)
# 同理,对s数组的键与值进行输出以及统计。
 for(a in s) printf("%-20s %s\n",a, s[a])
 printf("%-20s %s\n","TOTAL_LINK",N)
}

10.将test2文件中的行追加到test1的同一行后,并保存到文件test3

[root@localhost ~]# awk  'BEGIN{OFS=":"}NR==FNR{test[NR]=$1}NR!=FNR{print $1,test[FNR]}' /tmp/test2 /tmp/test1 
haha:20
hehe:25
alice:18
bob:30

11.某产品的CDN带宽运营成本迅猛增涨,其带宽主要由各种类型的图片组成,为了对某产品的图片流量带宽进行优化,现需要对该产品的图片和号码特性做一些分析,已有的日志文件test.log供分析使用


001|100|abc.gif
002|80|abd.jpg
003|150|abe.gif
001|60|abf.gid
003|30|abg.jpg


#找出所有gif图片请求的所有号码
[root@localhost ~]# awk -F"|" '/gif$/{print $1 | "sort -u" }' /tmp/test3
001
003

#找出所有gif图片请求的号码和其对应的请求大小总和及请求数总和.
[root@localhost ~]# awk -F"|" 'BEGIN{print "num   con sum"}/gif$/{++count[$1];sum[$1]+=$2}END{for(i in count)print i,":",count[i]," ",sum[i]}' /tmp/test3
num   con sum
003 : 1   150
001 : 2   160

#找出所有gif图片请求的号码,并按照其请求大小总和从大到小排序
[root@localhost ~]# awk -F"|" 'BEGIN{print "num   con sum"}/gif$/{++count[$1];sum[$1]+=$2}END{for(i in count)print i,":",count[i]," ",sum[i] | "sort -k3 -rn" }' /tmp/test3
num   con sum
001 : 2   160
003 : 1   150

#找出所有gif图片请求的号码,并按其请求平均图片大小从大到小排序.
[root@localhost ~]# awk -F"|" 'BEGIN{print "num   con sum  avg"}/gif$/{++count[$1];sum[$1]+=$2}END{for(i in count)print i,":",count[i]," ",sum[i],"",sum[i]/count[i] | "sort -k3 -rn" }' /tmp/test3
num   con sum  avg
001 : 2   160  80
003 : 1   150  150

你可能感兴趣的:(一些关于awk的习题)