★排序、去重、统计★
1)排序
sort -n按照数值排序
-r降序排列
2)去重
uniq 过滤相邻、重复的行
-c 对重复行计数
3)统计
wc 统计文件中的字节数、单词数、行数
-l 显示行数
今天通过使用grep、awk、cut指令和上面几个选项提取文本文件的信息
方法1:
[root@localhost nginx]# cat access.log | awk '{print $1}'| sort -rn | uniq -c | sort -rn | head
Cat 查看文本文件
| awk '{print $1}' 通过管道| 将cat信息传输给awk
{print $1}限制每一行的第一个字段
| sort -rn 将之前的提取数排序
| uniq -c 去重 -c对于重复的数进行计数
| sort -rn 对于之前去重的数再次进行排序
| head 显示前10行
方法2:
[root@localhost nginx]# awk '{print $1}' access.log | sort -rn | uniq -c | sort -rn | head awk '{print $1}' access.log 通过awk指令打印每一行的第一字符
| sort -rn 将之前的提取数排序
| uniq -c 去重 -c对于重复的数进行计数
| sort -rn 对于之前去重的数再次进行排序
| head 显示前10行
方法3:
[root@local-host nginx]# cut -d' ' -f1 access.log | sort -rn | uniq -c | sort -rn | head
# cut -d' ' -f1 access.log -d’ ’指定字符分隔符为单个空格
-f1 每行提取第一个字符
| sort -rn 将之前的提取数排序
| uniq -c 去重 -c对于重复的数进行计数
| sort -rn 对于之前去重的数再次进行排序
| head 显示前10行
方法4:
[root@localhost nginx]# grep -oP '^\S+' access.log | sort | uniq -c | sort -nr | head
grep -oP '^\S+' access.log
-P开启perl正则表达式
-o 只输出匹配的内容
'^\S+' ^字符串定位行首 \S 匹配任何非空白字符 包括字母、数字、标点符号。 除了空格、制表符、换行符等空白字符之外的任何字符 + 一个量词 \S+匹配一个或者多个非空白字符
| sort -rn 将之前的提取数排序
| uniq -c 去重 -c对于重复的数进行计数
| sort -rn 对于之前去重的数再次进行排序
| head 显示前10行
方法5:
[root@localhost nginx]# awk '{ip[$1]++} END {for (i in ip) print ip[i], i | "sort -rn | head" }' access.log
awk '{ip[$1]++} awk 读取每一行
{ip[$1]++} ip[] 关联数组名为ip
$1限定第一个字段
++ 检查第一字段 若已存在会自动加1 ,若不存在,会自动创建初始化为1
print ip[i], i打印出每个IP地址及其出现次数。注意,这里先打印次数再打印IP地址,以匹配最终排序的需求,代表每一行ip出现的次数
sort -rn | head先将awk传输的数据排序再将数据前10打印出来
今天先分享到这里,希望能够帮助到大家……