访问日志为500的数量
cat synewod.xinyangwangnet.access.log |awk ‘$9=500’ |wc -l
统计时间段内的访问ip 并排序
cat synewod.xinyangwangnet.access.log |awk ‘$4>"[10/Jan/2019:14:00:00" && $4<="[10/Jan/2050:14:59:59" {sum[$1]++} END {for(ip in sum) print ip,sum[ip]}’ |sort -rn -k 2
统计访问次数据前10的ip,配合使用sort排序
awk ‘{sum[$1]++}END{for(ip in sum) print ip, sum[ip]}’ access_1.log | sort -rn -k 2|head
在此简要说明以下sort命令的参数,-r 逆序,从大到小,-n 已数值作比较,可以连写为-rn;
-k 2 根据第二列进行排序,第二列为sum[ip],即单个ip的访问量;
统计访问量高于某个临界值的ip,例如大于2350.
、awk ‘{sum[$1]++}END{for(ip in sum)if(sum[ip]>2350) print ip, sum[ip]}’ access_1.log | sort -rn -k 2
统计状态码为200、访问量最大的ip前5名(2列)
[root@better~day /usr/local/nginx/logs]# awk ‘{if($6==“200”)sum[$1,$6]++}END{for(ip_num in sum)print ip_num,sum[ip_num]}’ access_1.log |sort -rn -k 2|head -5
100.97.90.71 200 2052
100.97.90.67 200 2047
100.97.90.84 200 2034
100.97.90.78 200 2012
100.97.90.99 200 2009
其它更多列同时分析时,与上类似,sum[$1$2$3]++等等,sum$1,$6与sum$1$6的区别,在于打印的结果是否有空格。
写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。
假设 words.txt 内容如下:
the day is sunny the the
the sunny is is
cat words.txt |awk '{i=1;while(i<=NF){map[、$i]++;i++;}} END { for (w in map) print w,map[w]}'|sort -rn -k 2
cat words.txt |awk '{for(i=1;i<=NF;i++){map[$i]++}} END { for (w in map) print w,map[w]}' |sort -rn -k 2
FS 字段分隔符(默认是任何空格)
IGNORECASE 如果为真,则进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
从文件中找出长度大于 80 的行:
awk ‘length>80’ log.txt
打印九九乘法表
seq 9 | sed ‘H;g’ | awk -v RS=’’ ‘{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}’
输出第二列包含 “th”,并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
~ 表示模式开始。// 中是模式。
输出包含 “re” 的行
$ awk '/re/ ’ log.txt
文件列变行
cat file.txt |awk '{for(i=1;i<=NF;i++){ if(NR==1){ res[i]=$i}else{ res[i]=res[i]" "$i;} }} END {for(i=1;i<=NF;i++) { print res[i]}}'
awk '{ #这个大括号里的代码是 对正文的处理
# NF表示列数,NR表示已读的行数
# 注意for中的i从1开始,i前没有类型
for (i=1; i<=NF; i++){#对每一列
if(NR==1){ #如果是第一行
#将第i列的值存入res[i],$i表示第i列的值,i为数组的下标,以列序号为下标,
#数组不用定义可以直接使用
res[i]=$i;
}
else{
#不是第一行时,将该行对应i列的值拼接到res[i]
res[i]=res[i] " " $i
}
}
}
# BEGIN{} 文件进行扫描前要执行的操作;END{} 文件扫描结束后要执行的操作。
END{
#输出数组
for (i=1; i<=NF; i++){
print res[i]
}
}' file.txt
/export/log/scribe/log
#按时段统计 访问量
cat log-2017-04-13_00008 | awk -F '-' '{print strftime("%Y%m%d%H%M",$1)}' | sort | uniq -c
#按条件筛选访问量
cat log-2017-05-10_00015 | awk -F '-' '{if($8==42078&& $7==818){print $0}}' |wc -l
cat log-2017-05-10_00015 | grep '818-42078' |wc -l
日志地址:/export/home/logs/stat
查看模拟点击量:wc -l *.log
sort 用法
https://www.cnblogs.com/ding2016/p/9668425.html