文章目录
- 1 只处理用户ID为奇数的行,并打印用户名和uid号
- 2 显示系统的普通用户,并打印用户名和ID
- 3 显示用户shell是‘/bin/bash’的用户,并打印用户名
- 4 统计普通用户的个数
- 5 统计文本的总行数
- 6 显示文件名
- 7 显示UID为1000用户的相关信息
- 8 利用awk模拟tail -1的效果
- 9 看懂数组的两个练习(统计tcp链接数)
- 10 将test2文件中的行追加到test1的同一行后,并保存到test3
- 11 某产品的CDN带宽运营成本迅猛增涨,其带宽主要由各种类型的图片组成,为了对某产品的图片流量带宽进行优化,现需要对该产品的图片和号码特性做一些分析,已有的日志文件test.log供分析使用
1 只处理用户ID为奇数的行,并打印用户名和uid号
awk -F: 'NR%2==0{print $1,$3}' /etc/passwd
2 显示系统的普通用户,并打印用户名和ID
awk -F: '$1!="root"{print $1,$3}' /etc/passwd
3 显示用户shell是‘/bin/bash’的用户,并打印用户名
awk -F: '$NF=="/bin/bash"{print $1}' /etc/passwd
4 统计普通用户的个数
awk -F: '$1!="root"' /etc/passwd | wc -l
5 统计文本的总行数
awk 'END{print NR}' /etc/passwd
6 显示文件名
awk 'END{print FILENAME}' /etc/passwd
7 显示UID为1000用户的相关信息
awk -F: '$3==1000{print $0}' /etc/passwd
8 利用awk模拟tail -1的效果
awk 'END{print $0}' /etc/passwd
9 看懂数组的两个练习(统计tcp链接数)
9.1 统计tcp的链接数
netstat -ant | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
9.2 分别统计不同ip的tcp链接
netstat -ant | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'
10 将test2文件中的行追加到test1的同一行后,并保存到test3
# test1
haha
hehe
alice
bob
# test2
20
25
18
30
# test3
haha:20
hehe:25
alice:18
bob:30
代码:
awk '{printf "%s:",$0,getline < "test2";printf "%s\n",$0}' test1 > test3
awk 'BEGIN{OFS=":"}NR==FNR{test[NR]=$1}NR!=FNR{print $1,test[FNR]}' /tmp/test2 /tmp/test1 > test3
11 某产品的CDN带宽运营成本迅猛增涨,其带宽主要由各种类型的图片组成,为了对某产品的图片流量带宽进行优化,现需要对该产品的图片和号码特性做一些分析,已有的日志文件test.log供分析使用
# test.log
001|100|abc.gif
002|80|abd.jpg
003|150|abe.gif
001|60|abf.gif
003|30|abg.jpg
其中带有gif表示是gif图片的请求,带有jpg表示是jpg图片的请求,请使用(python/shell/awk/sort)编写程序实现如下分析思路(1,2为中间步骤,可以只输出3,4结果):
- 找出所有gif图片请求的所有号码
awk -F"|" '/gif$/{print $1 | "sort -u"}' test.log
- 找出所有gif图片请求的号码和其对应的请求大小总和及请求数总和
awk -F"|" '/gif$/{count[$1]++;sum[$1]+=$2}END{for(i in count)printf "%s|%s|%s\n",i,count[i],sum[i]}' test.log
- 找出所有gif图片请求的号码,并按照其请求大小从大到小排序
awk -F"|" '/gif$/{count[$1]++;sum[$1]+=$2}END{for(i in count)printf "%s|%s|%s|%s\n",i,count[i],sum[i]}' test.log | sort -t "|" -k3rn
- 找出所有gif图片请求的号码,并且按其请求平均图片大小从大到小排序
awk -F"|" '/gif$/{count[$1]++;sum[$1]+=$2}END{for(i in count)printf "%s|%s|%s|%s\n",i,count[i],sum[i],sum[i]/count[i]}' test.log | sort -t "|" -k4rn