需求:统计web服务器的IP访问情况。
场景:服务器是centos,前端代理服务器nginx,nginx日志路径/var/log/nginx
思路:将多个日志的gz压缩文件解压合并到一个文件,筛选文件内容并格式化,保存结果到新建文件。
具体操作:
进入包含Nginx日志文件的目录
在命令行连上服务器后,输入cd /var/log/nginx,回车
查看日志文件
输入ll,回车(说明:英文小写字母l,其大写为L),可以看到nginx日志都在这。
复制日志压缩文件到logs文件夹
输入mkdir logs,回车,然后就创建了logs目录
输入cp -rf access.log-*.gz /var/log/nginx/logs/,回车(只统计access.log-20240803.gz格式的文件,所以只复制这些文件)
输入cd logs,回车
输入ll,回车
看到access.log-20240803.gz格式的文件都复制了。
合并并解压所有gzip压缩的日志文件
输入cat *.gz | gzip -d > combined_log.txt,回车。这样就讲gz解压后的内容写到 combined_log.txt了。后续分析该文件。
匹配访问了/commons/attachment/download/123456格式的行
接下来可用两种方式操作:分别是grep+awk,awk,二选一即可。
法一:输入grep '/commons/attachment/download/[0-9]* ' combined_log.txt | awk '{print$0}',回车。该命令用正则匹配了combined_log.txt文件中有/commons/attachment/download/[0-9]* 的行,并通过awk命令输出,{print$0}表示输出整行。
法二:输入awk '/\/commons\/attachment\/download\/\w+\s/ {print$0}' combined_log.txt,回车。同理。
简化输出,仅输出IP
从上一个截图看到,IP在第一列
法一:输入grep '/commons/attachment/download/[0-9]* ' combined_log.txt | awk '{print$1}',回车。就是将{print$0}改成了{print$1},表示输出第一列,第一列就是IP
法二:输入awk '/\/commons\/attachment\/download\/\w+\s/ {print$1}' combined_log.txt,回车。
IP排序,去重并统计出现次数
法一:输入grep '/commons/attachment/download/[0-9]* ' combined_log.txt | awk '{print$1}' | sort | uniq -c,回车。
法二:输入awk '/\/commons\/attachment\/download\/\w+\s/ {print$1}' combined_log.txt | sort | uniq -c,回车。
按出现次数再次排序
法一:输入grep '/commons/attachment/download/[0-9]* ' combined_log.txt | awk '{print$1}' | sort | uniq -c | sort -n,回车。
法二:输入awk '/\/commons\/attachment\/download\/\w+\s/ {print$1}' combined_log.txt | sort | uniq -c | sort -n,回车。
将上一步结果输出到文件
法一:输入grep '/commons/attachment/download/[0-9]* ' combined_log.txt | awk '{print$1}' | sort | uniq -c | sort -n > result.txt,回车。
输入cat result.txt,回车。看到结果已经输出到result.txt了。
法二:输入awk '/\/commons\/attachment\/download\/\w+\s/ {print$1}' combined_log.txt | sort | uniq -c | sort -n > result.txt,回车。
输入cat result.txt,回车。看到结果已经输出到result.txt了。